git图形化工具GitKraken的使用——分支的创建与合并
Git分支管理是Git工作流的核心内容,主要用于管理和切换分支。在Git中,每次提交后,Git会将提交内容串成一条线,称为分支。默认情况下,只有一个主分支(master)。用户可以通过git checkout -b
创建并切换到新的分支。创建分支的命令是git branch ,切换分支的命令是git checkout 。在GitKraken上,用户可以通过工具栏按钮或右键菜单创建分支并切换。切换到新分支后,修改和提交的内容将针对该分支。完成提交后,可以将新分支(如develop)合并到主分支(master)上,命令为git merge 。合并时有两种模式:--ff(快进模式)和--no-ff(非快进模式)。快进模式会直接将主分支指向目标分支的提交,而--no-ff模式会生成新的提交,记录合并过程。删除分支的命令是git branch -d 。
分支管理在软件开发中主要涉及基于Git的工作流
在先前的文章中,GitKraken能够清晰地展示出每次commit操作。每次commit操作,git将这些操作整合成一条线,这条线就是我们所说的分支。目前,Git中仅有一个主分支,即master分支。
创建分支并切换的原理
之前提到的
HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点,每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。
不过,当切换到dev分支后,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针保持不变
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并。
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支,HEAD又指向了master
摘自 廖雪峰的官方网站,图文并茂,非常清楚
实战
创建与切换分支:
1、创建develop 分支并切换:
git checkout -b develop
checkout -b 是一个复合命令,包含两个子命令:
- 用于创建分支的命令是
git branch develop - 用于切换分支的命令是
git checkout develop
2、创建完成后执行git branch 可以查看所有本地分支:
$ git branch
* develop # 前面带星号的表示当前所在分支
master
随后所有的操作都会在develop分支上进行,除非你又执行了 git checkout <分支名> 切换到了其他的分支。
3、在GitKraken上操作:
方法一:单击工具栏中的 Branch 按钮以启动创建流程,完成后自动切换至新分支。

方法二:在当前分支上执行右键操作,点击 Create branch here 选项,随后设置分支名称。
在切换至分支并完成切换后,我们创建一个文件并将其提交至 develop 分支,随后切换回 master 分支,此时你会发现 master 分支上没有之前在 develop 分支提交的那个文件,同时,你也不会在项目目录中看到这个新创建的文件:


合并分支
在master分支上进行开发,在feature1功能上创建一个新的分支,开发完成后,需要将该分支回滚至master分支。
ff模式
# 切换到master分支,在GitKraken直接双击就可以切换分支
$ git checkout master
# 开始合并
$ git merge feature1
Updating c9470f5..78ba880
Fast-forward
README.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
通过注意到上面的 Fast-forward 信息,Git表明,这次合并采用的是 fast-forward manner,即通过将 master 直接指向 feature1 的当前提交来实现。因为当前 master 分支指向的提交是你当前提交(与 develop 相关的提交)的直接上游,因此 Git 只是简单地将指针向前推进。
换句话说,当你试图合并两个分支时,如果顺着一个分支走下去可以到达另一个分支,那么 Git 在合并两者时只会简单地将指针向前推进(指针右移),因为这种情况下合并操作没有需要解决的冲突——这就是所谓的「快进(fast-forward)」。同样的道理适用于其他分支间的合并操作。
通过GitKraken查看合并日志,可以看到,master和develop已指向同一个提交,也就是二者已实现同步,并且处于同一轴线上,看不出任何合并痕迹。

–no-ff 模式
除了快进模式外,还存在其他模式,如采用--no-ff的模式,即非快进模式。在merge操作时,该模式会创建一个新的commit,从而在分支历史中可见分支合并记录,即使删除了记录后,这一信息依然可被保留。
$ git merge --no-ff -m "使用 --no-ff 模式合并分支" feature1
Merge made by the 'recursive' strategy.
README.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

可以看到分支合并的记录
当你的上游分支与本地分支分叉时,合并时无法采用 ff 模式进行合并,而应直接采用 –no-ff 模式。
这具体指的是什么呢?这具体指的是什么呢?就是说,当你在自己的分支中进行开发时,随后,另一位小伙伴将自己的分支合并到主分支(master),并已提交到远程端。此时,你需要从远程主分支拉取最新的代码。需要注意的是,远程主分支的提交并不是你当前分支(feature1)提交的直接祖先。通过查看日志,可以参考下图。

可以看到,你的feature1分支基于c3分支拉取,随后另一位同事更新了master分支,这样就造成了分叉。你的上游分支和你的分支各自向前推进了一步。这样就,如果使用 git merge 命令不带参数将feature1合并到master分支,那么默认采用 --no-ff 模式。
$ git merge feature1
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
这样会导致冲突的产生,必须通过人工方式来处理。需要注意的是,解决冲突的方法将在下一节进行介绍。这里可以直接查看解决完成的log记录:

删除分支
合并完成之后,如果你不想要develop分支了,可以删除它:
$ git branch -d develop
Deleted branch develop (was 2923b6d).
在GitKraken中右键点击 develop 分支(前提是切换至master分支)
$ git branch
* master
可以看到,本地只剩下master分支了。
总结
-
查看本地分支:
git branch -
创建分支:
git branch <name> -
切换分支:
git checkout <name> -
创建并切换分支:
git checkout -b <name> -
合并某分支到当前分支:
git merge <name> -
删除分支:
git branch -d <name>
