git使用教程3

5. 分支管理

5.1. 分支有什么用

 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险.

 现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

 其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。

 但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1个文件还是1万个文件。

5.2. Git的分支管理原理

 我们的每次提交,都对应一个具体的时间点,git会把这许多的时间点串起来,就形成了一条时间线,这条时间线就是一个分支。Git中默认的分支就是主分支,叫master。

我们查看当前的提交日志:

git使用教程3

 

发现总共有3次提交,这3次提交可以串起来成一条时间线,就是master分支:

git使用教程3

 

每次提交,master分支都会新增一个时间点,分支线也不断变长。

当我们创建新的分支,例如dev分支。Git会创建一个新的指针,叫做dev,指向跟master相同的时间点(提交点),这样分支就创建好了,你的工作区无需任何改变,创建分支的速度非常的快。

 而要切换分支,只需要把HEAD指向dev即可,所以你的分支实现了光速切换!

 

git使用教程3

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

git使用教程3

 

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

 

git使用教程3

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

 

git使用教程3

你会发现Git的分支管理,基本就是创建新的指针,改变HEAD指向,删除指针等操作,几乎没有文件的增删。所以速度非常快!

5.3. 分支的创建和合并

5.3.1. 创建分支

我们可以使用 git checkout -b 分支名 来创建并切换到新的分支:

 

git使用教程3

你会注意到我们已经切换到了dev分支。 git checkout 加上 -b 参数,就等同于创建分支,并切换分支。相当于以下两条命令:

git branch dev # 创建分支

git checkout dev # 切换到具体分支

使用git branch 查看所有分支,当前分支前面会有一个*表示:

 

git使用教程3

然后我们可以在dev分支上进行修改和提交。例如我们在readme.txt上添加一行文字:

 

git使用教程3

 提交修改:

 

git使用教程3

 此时,dev分支已经比master领先了一次提交,并且HEAD指向的是dev

git使用教程3

 

5.3.2. 合并分支

我们使用git checkout master切换回master分支,查看内容:

 

git使用教程3

发现readme并没有改变,因为刚才修改的是dev分支。此时的HEAD已经指向了master了:

 

git使用教程3

 我们使用git merge dev命令将 dev分支的修改合并到master分支:

 

git使用教程3

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

5.3.3. 删除分支

合并完成后,就可以放心地删除dev分支了,可以使用git branch -d dev 命令删除dev分支,dev就是具体的分支名

 

git使用教程3

再次查看分支列表:

git使用教程3

 

5.3.4. 总结

1) 使用git branch 分支名 创建分支

2) 使用git checkout 分支名 来切换分支

3) 也可以使用 git checkout -b 分支名 来完成 创建并切换分支的操作

4) 使用git merge 分支名 来合并分支到当前分支

5) 使用git branch -d 分支名 来删除指定分支,注意:要删除一个未合并的分支。需要使用-D参数进行强制删除

5.4. 解决冲突

5.4.1. 制造冲突

现在我们新建一个分支:dev

 

git使用教程3

然后修改readme.txt:

 

git使用教程3

dev的修改提交:

 

git使用教程3

 切换到master分支:

 

git使用教程3

并且在readme.txt最后添加内容:

 

git使用教程3

 提交数据:

 

git使用教程3

现在,master和dev都有了各自新的提交,变成了这样:

git使用教程3

 

5.4.2. 解决冲突

 这种情况下,是无法进行快速合并的。我们试一下:

 

git使用教程3

 自动合并失败,必须先解决文件冲突,才能提交。

 此时查看readme.txt文件:

 

git使用教程3

我们可以根据实际情况进行冲突解决,比如两者都保留:

 

git使用教程3

然后再次提交:

 

git使用教程3

工作区就干净了。此时master和dev分支线就变成了这样:

 git使用教程3

可以用git log --graph --decorate --pretty=oneline --abbrev-commit命令来查看:

 

git使用教程3

 接下来就可以删除dev分支了。

git使用教程3

 

6. 客户端工具TortoiseGit

 现在Git的客户端工具非常多,比较流行的例如:TortoiseGit(在svn中俗称小乌龟)、SourceTree。

 SourceTree的注册需要科学上网。因此这里就不做讲解了。

6.1 安装

 详见安装文档

6.2. 基本使用

6.2.1. 创建本地仓库

我们新建一个空的文件夹:

 

git使用教程3

然后进入tortoise目录,右键操作:

 

git使用教程3

弹出提示,不要勾选:

 

git使用教程3

查看目录,发现生成.git文件夹:

git使用教程3

 

6.2.2. 添加文件并提交

创建新的文件:

 

git使用教程3

编写内容:

 

git使用教程3

在文件夹中右键操作:

 

git使用教程3

提示:这一步等同于我们的 git add readme.txt

 

git使用教程3

 此时直接点击提交,即可完成:git commit 操作:

 

git使用教程3

提示:

git使用教程3

 

6.2.3. 管理修改

6.2.3.1. 差异对比

修改readme.txt:

 

git使用教程3

右键操作:

git使用教程3

 

结果:

git使用教程3

 

6.2.3.2. 提交修改

直接在文件上选择右键,提交即可(只要add过一次,后续不用add操作,直接提交):

git使用教程3

 

6.2.3.3. 查看提交日志

 选中文件,右键菜单中,选中查看日志:

 

git使用教程3

提交的日志信息:

git使用教程3

 

6.2.3.4. 版本回退

 现在我们再次修改readme.txt,并且提交

 

git使用教程3

查看日志:

 

git使用教程3

 假如我们要回到上一个版本,也就是第2次提交。

 我们选中第2次提交,然后右键,选中:重置"master"到这个版本

 

git使用教程3

弹出菜单,这里选中Hard模式,然后确定:

 

git使用教程3

再次查看日志,只剩下第1和第2次提交了。并且HEAD已经设置到了第2次提交位置

 

git使用教程3

文件也回滚了:

 

git使用教程3

如果我现在后悔了,想再次回到第3次提交怎么办?现在连日志都没有了!

此时,在空白处点击右键,选中 显示引用记录

 

git使用教程3

弹出所有操作的日志信息:

 

git使用教程3

现在,我们找到第3次提交,右键,选中:重置“master”到这个版本

 

git使用教程3

结果,第3次提交又回来了!

 

git使用教程3

文件内容回来了:

git使用教程3

 

6.2.3.5. 撤销修改

 我们现在修改文件:

 

git使用教程3

现在后悔了,想要还原到修改以前。

我们可以选中文件,右键。然后选中菜单:还原。

git使用教程3

 

点击确定:

 

git使用教程3

还原成功:

git使用教程3

 

查看文件:

git使用教程3

 

6.3. 访问远程仓库

我们创建一个新的仓库:

git使用教程3

 

git使用教程3

 

6.3.1. 设置SSH

 由于安装时,我们并没有设定SSH信息,因此默认tortoise默认使用的ssh工具是“PuTTY”。

然而,git Bash使用的ssh工具是“openSSH”,如果想让TortoiseGit也使用刚才生成的**可以做如下配置:

 

git使用教程3

找到git安装目录下的ssh.exe文件:

git使用教程3

 

6.3.2.关联远程仓库

 git使用教程3

这里的四个选项:

1) 远端仓库名称,一般叫origin

2) URL:远程仓库地址 ssh://[email protected]:22/fangqyou/tortoise.git

3) 推送URL:同上 ssh://[email protected]:22/fangqyou/tortoise.git

4) Putty**:我们用git bash 生成的私钥。

 

6.3.3. 推送本地仓库

在空白处点右键,选择 “Git**同步**”:

 

git使用教程3

弹出菜单中,选择将master推送到远程仓库的master:

 

git使用教程3

 

git使用教程3

成功:

 

git使用教程3

 私服中也显示了最新的信息:

git使用教程3

 

 

6.3.4. 从远程仓库拉取

 现在,我们先在远程仓库修改数据:

 

git使用教程3

然后在本地的tortise文件夹点击右键,菜单中选择:拉取:

git使用教程3

 

 

git使用教程3

成功:

 

git使用教程3

查看文件:

git使用教程3

 

6.4. 分支管理

6.4.1. 创建分支

在文件夹的空白处点击右键。选择创建分支:

 

git使用教程3

填写分支名称和说明:

git使用教程3

 

 查看日志,发现已经有了dev分支:

git使用教程3

 

6.4.2. 切换分支

在空白处选择右键,菜单中选择: 切换/检出

 

git使用教程3

选择要切换的分支:

 

git使用教程3

 在dev分支中。修改readme文件:

 

git使用教程3

提交修改。

 然后切换到master:

 

git使用教程3

查看文件内容,发现并没有变化,因为刚才的修改是在dev完成的。master没有影响。

git使用教程3

 

6.4.3. 合并分支

空白处点击右键,选择合并菜单

git使用教程3

 

选择将dev合并当当前分支:

 

git使用教程3

成功:

 

git使用教程3

查看内容:

git使用教程3

 

6.4.4. 解决冲突

切换到dev,然后进行修改

 

git使用教程3

提交数据。

切换到master,修改readme:

 

git使用教程3

然后提交修改

尝试用master合并dev:

git使用教程3

 

 结果失败了,因为有冲突:

 

git使用教程3

查看文件:

 

git使用教程3

 手动解决:根据需求去处理。这里我们假设两者都保留:

 标记为解决:

 

git使用教程3

git使用教程3

 

 解决完成,直接提交:

git使用教程3

 

 提示信息:

 

git使用教程3

 

git使用教程3

提交成功!

 

git使用教程3

 查看日志:

 

git使用教程3