git分支管理(3)-fast forward和no fast forward

一、fast forward

假设当前只有一个master主分支,最新节点为c1
创建并切换到新的分支dev后
一直在dev分支工作 最新节点为c9
若mater在dev被创建后一直停留在c1节点
则此时将dev直接合并到master
即直接将c9节点作为master的最新节点 就称为 fast forward

下面举例说明:
创建并切换到dev分支

$ git branch dev

$ git checkout dev
Switched to branch 'dev'

在dev分支上修改file.txt文件的最后一行为:

this is edited on next week by dev.

提交到dev分支上:

$ git add .

$ git commit -m '作者dev再次修改了file文件'
[dev a904023] 作者dev再次修改了file文件
 1 file changed, 2 insertions(+), 1 deletion(-)

切换回master分支,并使用 git diff 查看两个分支上的差异

$ git switch master
Switched to branch 'master'

$ git diff dev
diff --git a/file.txt b/file.txt
index 3242f46..c526c48 100644
--- a/file.txt
+++ b/file.txt
@@ -1,6 +1,5 @@
 aaa
 bbb
 ccc
-this is edited on next week by dev.
-
+this is edited on weekend.

将dev分支合并到master上

$ git merge dev
Updating f0cc575..a904023
Fast-forward
 file.txt | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

注意到:此时的合并即为fast forward模式
合并之后的视图是扁平化的 看不出dev分支的历史信息

$ git log --graph --pretty=oneline --abbrev-commit
* a904023 (HEAD -> master) 作者dev再次修改了file文件
*   f0cc575 修复了file文件中的冲突
|
| * 5fe7b14 作者dev修改了file文件
* | e5c70e0 作者master修改了file文件
|/
* 4c25416 提交了file文件

二、no fast forward

删除dev分支后,我们再用一个新的分支dev2来说明 no fast forward
创建并切换到dev2分支

$ git checkout -b dev2
Switched to a new branch 'dev2'

修改文件file.txt最后一行为

this is edited on next weekend by dev2.

提交到dev2分支上

$ git add .

$ git commit -m '作者dev2修改了file文件'
[dev2 f27684b] 作者dev2修改了file文件
 1 file changed, 1 insertion(+), 1 deletion(-)

切换回master分支后,用 --no-ff 模式将dev2合并到master上

$ git switch master
Switched to branch 'master'

$ git merge --no-ff -m '将dev2合并到master分支上'  dev2
Merge made by the 'recursive' strategy.
 file.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

删除dev2分支后,查看提交日志

$ git log --graph --pretty=oneline --abbrev-commit
*   d6433aa (HEAD -> master) 将dev2合并到master分支上
|
| * f27684b 作者dev2修改了file文件
|/
* a904023 作者dev再次修改了file文件
*   f0cc575 修复了file文件中的冲突
|
| * 5fe7b14 作者dev修改了file文件
* | e5c70e0 作者master修改了file文件
|/
* 4c25416 提交了file文件

可以看到,使用 --no-ff的合并会多生成一个提交记录
并保留dev2分支的历史信息 ,有效维持了提交链的完整性

下面这张图可以形象地说明两种模式之间的差别:
image.png

原文地址:https://www.cnblogs.com/baebae996/p/12971067.html