一、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分支的历史信息 ,有效维持了提交链的完整性
下面这张图可以形象地说明两种模式之间的差别: