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与默认使用的区别。
本文详细介绍了Git的分支管理,包括如何查看和创建分支、切换和合并分支,重点讲解了Fast-forward合并策略。内容涵盖基本操作、分支原理、合并冲突解决,以及Fast-forward的两种模式:使用和禁用。通过实例展示了不同情况下的分支操作和状态变化。
1010

被折叠的 条评论
为什么被折叠?



