1 分支基本操作
查看当前所在分支以及当前版本库中的所有分支:
git branch
图片所示,*表示的是当前分支,当前版本库中只有一个master分支。
创建新分支:
git branch new_branch
切换分支:
git checkout new_branch
可以查看一下新分支中有哪些内容:
可以看到,新分支与原分支的内容完全相同。
git在创建分支时新分支和原分支的文件信息是完全一样的。
下面在新分支上创建一个文件,并将其加入版本库:
在从new_branch切换回master分支:
可以看到,master分支上并没有刚刚创建的新文件,这是两个分支的内容已经不一样了。
删除分支:
git branch -d new_branch
可以看到,由于分支没有合并,所以如果确认删除的话,使用-D。
还有一点需要注意的是,不能删除当前所在分支,即如果当前分支为 new_branch 的话,是不能删除 new_branch的。
创建并切换分支:
git checkout -b new_branch
2 合并分支
先在new_branch分支上往test.txt文件中添加一行,并提交:
切回master分支,并查看文件内容:
可以看到,master分支和new_branch分支的内容是不同的,下面将new_branch分支合并到master分支:
git merge new_branch
该命令是将new_branch分支的内容合并到当前分支,即master分支
输出中可以看到Fast-forward,这就是快进的意思,是git分支合并的一种策略,合并时会直接指向最新的提交。
此时master分支和new_branch分支的内容相同,此时可以删除new_branch分支,不会报错
可以看到,使用-d就可以删除分支,而不用使用-D来删除。
3 分支原理
当只有一个主分支时,如下图所示:
一个圆圈就是一次提交,master指向master分支的提交,HEAD指向当前所在分支。
关于HEAD在前面有用过,在丢弃暂存区的修改时,使用过 git reset HEAD file命令:
当创建一个分支并切换到该分支时,如图所示:
此时new_branch分支和master分支指向的是同一个提交,所以他们的文件信息完成相同,当在新分支上进行提交时,状态变为下图所示:
当进行分支合并时,master直接快进到new_branch的最新提交
此时new_branch和master分支的文件信息完全相同。注意,此时的HEAD指向master分支,因为合并操作是在master分支上进行的,git merge new_branch是将new_branch分支合并到当前分支。
下面来演示一下:
首先到master分支上看看最新的提交:
接着新建一个分支,并提交两次:
看一下日志:
下面切回master分支,进行分支合并:
git checkout - 命令以前没有提过,使用 - 会切换回上一次所在的分支,在这里和git checkout master是等价的,因为上一次在master分支。
看一下日志:
可以看到master直接跳到了commit id为b194d的提交。
4 分支合并冲突
当在新分支修改并提交后,再切换到master分支修改同一个文件同一行,就会发生冲突:
可以看到,最后提示发生冲突,发生冲突的文件为test.txt,自动合并失败,需要解决冲突然后将结果提交。
下面看一下test.txt的内容:
在文件中通过"<<<<<<< HEAD"、"=======“和”>>>>>>> new_branch"来标识发生冲突的地方,要保留那个自己决定。
修改文件,看一下状态:
提示可以使用git add来标记解决了这个冲突,也可以使用git merge --abort 来取消这次合并。
使用git add后,提示所有的冲突都解决了,但仍然处于合并状态,需要使用git commit 完成合并。
如果使用git commit不加 -m的话,进入vi编辑器,里面git自动生成了一条提交消息:
不做任何修改提交:
看一下日志:
圈出来的两条分别是在new_branch和master上的提交日志,最新的是解决冲突后的提交日志。
5 Fast-forward
Fast-forward是快进的意思,git合并分支时默认使用的是这个,当然也可以禁用。当禁用Fast-forward时,合并分支会产生一个新的提交。下面看例子
5.1 使用Fast-forward(默认)
首先从master切出一个分支branch_ff:
在文件中增加一行并提交:
查看日志:
切回master分支将branch_ff分支合并到master:
这里提示了Fast-forward,看看日志:
会发现master的最新的commit也变成了6a4ac… 这和在brach_ff分支上看到的commit一致。这就是fast-Forward的意思,直接指向最新提交。
5.2 禁用Fast-forward
在从master且出一个branch_no-ff,并在文件中增加一行后提交:
查看一下日志:
切回master分支,使用命令:
git merge --no-ff branch_no-ff
当使用这个命令之后,会进入一个vi编辑界面,需要填写提交消息,并且已经默认生成了一个提交消息。
不修改直接退出
查看日志:
可以看到,图中的第二个提交才与branch_no-ff分支的提交相同,而最新的提交是合并是产生的,这就是禁用Fast-forward与默认使用的区别。