如何优雅的使用Git版本控制工具

简介: 如何优雅的使用Git版本控制工具

安装Git与依赖包:


 Git 的工作需要调用 curl,zlib,openssl,expat,libiconv 等库的代码,所以需要先安装这些依赖工具。

[root@localhost ~]# yum -y install curl-devel openssl-devel expat-devel gettext-devel zlib-devel
[root@localhost ~]# yum -y install git-core
[root@localhost ~]# git --version
git version 1.8.3.1

Git配置:


 Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。


 这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:


  • /etc/gitconfig 文件:系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项,读写的就是这个文件。

  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。

  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

用户信息


配置个人的用户名称和电子邮件地址:

[root@localhost ~]# git config --global user.name "xxxxxxxxxxx"
[root@localhost ~]# git config --global user.email xxxxxxxx@qq.com

如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。


如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。


查看配置信息


要检查已有的配置信息,可以使用 git config --list 命令:

[root@localhost ~]# git config --list
user.name=xxxxxxxxx
user.email=xxxxxxxx@qq.com
[root@localhost ~]# cat /root/.gitconfig   //可以在/root/.gitconfig下看到配置信息
[user]
    name = xxxxxx
    email = xxxxxxx@qq.com
[root@localhost ~]# git config user.name     //也可直接查看某个环境变量的设定,只要把特定的名字跟在后面即可
xxxxxxxxx

Git工作流程


一般工作流程如下:


  • 克隆 Git 资源作为工作目录。

  • 在克隆的资源上添加或修改文件。

  • 如果其他人修改了,你可以更新资源。

  • 在提交前查看修改。

  • 提交修改。

  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。

21.png22.png

Git基本概念


 -Git仓库:


     保存所有数据的地方。


 -工作区:


     从仓库中提取出来的文件,放在磁盘上供你使用或修改。


 -暂存区:


     就是一个文件,索引文件,保存了下次将提交的文件列表信息。


Git创建仓库


git init


 Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。


 在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。


git init : 使用当前目录作为Git仓库并初始化。


git init 指定目录:使用指定目录作为Git仓库。

[root@localhost ~]# mkdir gitrepo
[root@localhost ~]# git init gitrepo
初始化空的 Git 版本库于 /root/gitrepo/.git/
[root@localhost ~]# cd gitrepo
[root@localhost gitrepo]# ls -a
.  ..  .git

git clone


 使用 git clone 从现有 Git 仓库中拷贝项目。


参数说明:


  • repo: Git 仓库。

  • directory: 本地目录。

格式:


git clone <repo>:  克隆仓库到当前目录。


git clone <repo> <directory>: 克隆到指定的目录。

[root@localhost gitrepo]# git clone https://github.com/xxx/Test.git  //克隆git代码仓库test
正克隆到 'Test'...
remote: Enumerating objects: 20, done.
remote: Counting objects: 100% (20/20), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 20 (delta 3), reused 15 (delta 1), pack-reused 0
Unpacking objects: 100% (20/20), done.
[root@localhost gitrepo]# ls
Test
//如果要自己定义新的目录名称,可以在上面的命令末尾指定新的名字:
[root@localhost gitrepo]# git clone https://github.com/xxx/Test.git newrepo

基本快照


 Git 的工作就是创建和保存你的项目快照及与之后的快照进行对比。


git add


git add 命令可将该文件添加到缓存。


git add . 添加当前项目的所有文件至缓存。

[root@localhost Test]# echo hello wolrd > hello.txt
[root@localhost Test]# git status -s     //用于查看项目的当前状态
?? hello.txt
[root@localhost Test]# git add hello.txt     //将hello.txt添加到缓存
[root@localhost Test]# git status -s     
A  hello.txt
[root@localhost Test]# echo "#git test" >> hello.txt   //修改文件
[root@localhost Test]# git status -s    //再执行查看项目状态
AM hello.txt

 "AM" 状态的意思是,这个文件在我们将它添加到缓存之后又有改动。改动后我们再执行 git add 命令将其添加到缓存中:

[root@localhost Test]# git add .
[root@localhost Test]# git status -s
A  hello.txt

git status


git status 查看文件在上次提交之后是否有修改。


-s  以简短的结果输出,不加该参数会详细输出内容:

[root@localhost Test]# git status 
# 位于分支 master
# 要提交的变更:
#   (使用 "git reset HEAD <file>..." 撤出暂存区)
#
#    新文件:    hello.txt

git rm


 如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 Changes not staged for commit 的提示。要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。 可以用以下命令完成此项工作:


git rm <file>

[root@localhost Test]# git rm gittest/
rm 'gittest'
[root@localhost Test]# ls
hello.txt  README.md

如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f


git rm -f <file>

[root@localhost Test]# cat > hello.txt <<EOF     //修改hello.txt文件
> hello world  
> EOF
[root@localhost Test]# git status       //查看项目状态
# 位于分支 master
# 尚未暂存以备提交的变更:
#   (使用 "git add <file>..." 更新要提交的内容)
#   (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
#    修改:      hello.txt
#
[root@localhost Test]# git rm hello.txt    //不加-f无法删除已修改并已经放到暂存区的文件
error: 'hello.txt' 有本地修改
(使用 --cached 保存文件,或用 -f 强制删除)

如果把文件从暂存区域移除,但仍然希望保留在当前工作目录中,换句话说,仅是从跟踪清单中删除,使用 --cached 选项即可。


git rm --cached <file>

[root@localhost Test]# git rm --cached hello.txt 
rm 'hello.txt'
[root@localhost Test]# ls
hello.txt  README.md
[root@localhost Test]# git status 
# 位于分支 master
# 未跟踪的文件:
#   (使用 "git add <file>..." 以包含要提交的内容)
#
#    hello.txt

 可以递归删除,即如果后面跟的是一个目录做为参数,则会递归删除整个目录中的所有子目录和文件:


git rm –r *    


 进入某个目录中,执行此语句,会删除该目录下的所有文件和子目录。


git mv


git mv 命令用于移动或重命名一个文件、目录、软连接。

[root@localhost Test]# git add hello.txt    //将刚才使用git rm --cached的文件add添加回来
[root@localhost Test]# git mv hello.txt test.txt    //重命名
[root@localhost Test]# ls
README.md  test.txt

23.png

git commit


 使用 git add 命令将想要快照的内容写入缓存区,而执行 git commit 将缓存区内容添加到仓库中。Git 为你的每一个提交都记录你的名字与电子邮箱地址,所以第一步需要配置用户名和邮箱地址。

[root@localhost Test]# cat > hello.txt <<EOF
> this is a testfile
> hello world!
> EOF
[root@localhost Test]# git add .
[root@localhost Test]# git status -s
A  hello.txt
[root@localhost Test]# git commit -m "第一次版本提交"
[master d7edad6] 第一次版本提交
 1 file changed, 2 insertions(+)
 create mode 100644 hello.txt

现在我们已经记录了文件快照,再执行git status查看一下项目状态:

[root@localhost Test]# git status 
# 位于分支 master
# 您的分支领先 'origin/master' 共 1 个提交。
#   (使用 "git push" 来发布您的本地提交)
#
无文件要提交,干净的工作区

 以上输出说明我们在最近一次提交之后,没有做任何改动,是一个"working directory clean:干净的工作目录"。


如果觉得 git add 提交缓存的流程太过繁琐,Git 也允许用 -a 选项跳过这一步。命令格式如下:


git commit -a

[root@localhost Test]# cat >> hello.txt <<EOF
> The second modification of the file
> EOF
> 
[root@localhost Test]# git commit -am "修改hello文件"
[master 6f94a01] 修改hello文件
 1 file changed, 1 insertion(+)

 因为加了-a参数,所以在修改完文件之后不用先git add提交缓存,直接可以git commit提交至仓库。


git fetch


 一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch命令。

git fetch <远程主机名>

 上面命令将某个远程主机的更新,全部取回本地。


 git fetch命令通常用来查看其他人的进程,因为它取回的代码对你本地的开发代码没有影响。


 默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。

git fetch <远程主机名> <分支名>

 比如,取回origin主机的master分支。

git fetch origin master

 所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如origin主机的master,就要用origin/master读取。


 git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。

$ git branch -r
origin/master
$ git branch -a
* master
  remotes/origin/master

 上面命令表示,本地主机的当前分支是master,远程分支是origin/master。


 取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。

git checkout -b newBrach origin/master

 上面命令表示,在origin/master的基础上,创建一个新分支。


 此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。

git merge origin/master
# 或者
$ git rebase origin/master

 上面命令表示在当前分支上,合并origin/master。


git push


 将本地库中的更新推送给远程库。


git push <远程主机名> <本地分支名>:<远程分支名>


注意:

分支推送顺序的写法是<来源地>:<目的地>,所以git pull是<远程分支>:<本地分支>,而git push是<本地分支>:<远程分支>。


 如果省略远程分支名,则表示将本地分支推送与之存在"追踪关系"的远程分支(通常两者同名),如果该远程分支不存在,则会被新建。

git push origin master

 上面命令表示,将本地的master分支推送到origin主机的master分支。如果后者不存在,则会被新建。


 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。

git push origin :master
# 等同于
git push origin --delete master

 上面命令表示删除origin主机的master分支。


 如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。

git push origin

 上面命令表示,将当前分支推送到origin主机的对应分支。


 如果当前分支只有一个追踪分支,那么主机名都可以省略。

git push

如果当前分支与多个主机存在追踪关系,则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push。

git push -u origin master

 上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。


 不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。

git config --global push.default matching
# 或者
git config --global push.default simple

 还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用--all选项。

git push --all origin

 上面命令表示,将所有本地分支都推送到origin主机。


 如果远程主机的版本比本地版本更新,推送时Git会报错,要求先在本地做git pull合并差异,然后再推送到远程主机。这时,如果你一定要推送,可以使用--force选项。

git push --force origin

 上面命令使用--force选项,结果导致远程主机上更新的版本被覆盖。除非你很确定要这样做,否则应该尽量避免使用--force选项。


 最后,git push不会推送标签(tag),除非使用--tags选项。

git push origin --tags

git pull


 取回远程主机某个分支的更新,再与本地的指定分支合并。


git pull <远程主机名> <远程分支名>:<本地分支名>


 比如,取回origin主机的next分支,与本地的master分支合并,需要写成下面这样。

git pull origin next:master

 如果远程分支是与当前分支合并,则冒号后面的部分可以省略。

git pull origin next

 上面命令表示,取回origin/next分支,再与当前分支合并。实质上,这等同于先做git fetch,再做git merge。

git fetch origin
git merge origin/next

 在某些场合,Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。


 Git也允许手动建立追踪关系

git branch --set-upstream master origin/next

 上面命令指定master分支追踪origin/next分支。


 如果当前分支与远程分支存在追踪关系,git pull就可以省略远程分支名。

git pull origin

 上面命令表示,本地的当前分支自动与对应的origin主机"追踪分支"(remote-tracking branch)进行合并。


 如果当前分支只有一个追踪分支,连远程主机名都可以省略。

git pull

 上面命令表示,当前分支自动与唯一一个追踪分支进行合并。


 如果合并需要采用rebase模式,可以使用--rebase选项。

git pull --rebase <远程主机名> <远程分支名>:<本地分支名>

 如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。


 但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。

git pull -p
# 等同于下面的命令
git fetch --prune origin 
git fetch -p


相关文章
|
4月前
|
项目管理 开发工具 git
Python面试题:Git版本控制与协作开发
【4月更文挑战第19天】本文聚焦于Python面试中Git版本控制与协作开发的考察点,涵盖Git基础、协作流程及实战示例。面试者需理解仓库、提交、分支等核心概念,掌握常用命令,熟悉主干开发和GitFlow策略。在协作开发中,要掌握Pull Request工作流,有效处理合并冲突,并善用标签与里程碑。注意避免混淆工作区、忽视代码审查和直接在远程分支上工作等常见错误。通过实例展示了如何在GitFlow策略下合并分支和解决冲突,强调持续学习与实践以提升Git技能。
52 1
|
1月前
|
开发工具 数据安全/隐私保护 git
记录一次使用git工具拉取coding上代码密码账号错误的经历
这篇文章记录了作者在使用Git工具从Coding平台克隆项目时遇到的账号密码错误问题,并分享了通过清除电脑凭证中错误记录的账号密码来解决这个问题的方法。
记录一次使用git工具拉取coding上代码密码账号错误的经历
|
6天前
|
存储 Linux 开发工具
掌握 Git:版本控制的瑞士军刀
在软件开发中,版本控制对于代码管理和团队协作至关重要。Git 是一款由 Linus Torvalds 开发的分布式版本控制系统,广泛应用于各类项目。本文介绍了 Git 的基本原理、核心概念及常用命令,如初始化仓库 (`git init`)、克隆 (`git clone`)、提交 (`git commit`) 和合并 (`git merge`) 等。此外,还分享了编写清晰提交信息、使用分支开发和定期合并等最佳实践,帮助开发者更高效地使用 Git。
|
6天前
|
测试技术 开发工具 git
掌握 Git 分支策略:提升你的版本控制技能
在现代软件开发中,版本控制至关重要,Git 作为最流行的分布式版本控制系统,其分支管理策略对于高效协作和代码维护尤为重要。本文介绍了几种常用的 Git 分支策略,包括主线开发模型、功能分支模型、Gitflow 工作流和 Forking 工作流,并探讨了如何根据项目需求选择合适的分支模型。通过保持 `master` 分支稳定、及时合并清理分支、使用命名规范、利用 Pull Request 进行代码审查及自动化测试等最佳实践,可以显著提升团队协作效率和软件质量。掌握这些策略将帮助开发者更好地管理代码库,加快开发流程。
|
4月前
|
项目管理 开发工具 git
版本控制与源代码管理:在 Visual Basic 项目中使用 Git
【4月更文挑战第27天】本文介绍了在Visual Basic项目中使用Git进行版本控制和源代码管理的重要性。Git作为一个流行的分布式版本控制系统,具备分布式架构、高效性能和强大分支管理等特点。在项目中,需先安装Git,然后初始化仓库、添加文件和提交更改。常用操作包括查看状态、日志、创建及切换分支和合并分支。团队协作时,借助远程仓库和推送拉取命令实现代码共享。虽然Git有学习曲线,但其优势在于强大的功能、灵活性和社区支持,能提升开发效率和代码质量。通过学习和实践,开发者可充分利用Git优化协作和项目管理。
58 1
|
24天前
|
存储 开发工具 数据安全/隐私保护
Git 与 SVN:版本控制领域的双星对比
【8月更文挑战第27天】
44 6
|
29天前
|
JavaScript IDE 前端开发
前端开发工具配置 nodejs & git & IDE
前端开发工具配置 nodejs & git & IDE
|
30天前
|
架构师 开发工具 git
项目去除git版本控制 去除版本控制
文章提供了去除本地项目Git版本控制的步骤,包括删除`.git`文件夹和`.idea`目录下的`vcs.xml`文件。
项目去除git版本控制 去除版本控制
|
1月前
|
开发工具 git
成功解决:fatal: detected dubious ownership in repository at ‘E:/workspace/CSMarket‘。如何使用git工具通过命令行的形式
这篇文章分享了作者在使用Git工具初始化本地仓库时遇到的权限问题,提供了通过命令行解决Git仓库权限问题的方案,并介绍了如何使用Git命令行初始化项目、添加文件、提交以及关联远程仓库的步骤。
成功解决:fatal: detected dubious ownership in repository at ‘E:/workspace/CSMarket‘。如何使用git工具通过命令行的形式
|
1月前
|
存储 Shell 开发工具
Git 入门:从零开始掌握版本控制的艺术
【8月更文第16天】 在软件开发中,版本控制是一项至关重要的技能。它帮助开发者追踪文件的变化历史,并且可以在多个开发者之间协同工作。Git 是目前最流行的分布式版本控制系统之一。本文将带你从零开始学习 Git 的基本使用方法。
32 0