当我使用GIT分支时,我任何给定分支的“心理模型”是它是从我以该分支为基础的分支突破的路径。我们假设我做了以下事情:
git checkout develop
git checkout -b feature/1
touch README.md
git add --all
git commit -m "Added README.md"
git push -u origin feature/1
git checkout develop
git merge feature/1
git push
现在,我希望通过将develop
分支绘制为单独的路径来使git GUI可视化。然后,从develop
分支路径,我希望看到feature/1
分支路径从develop
分支路径中突破。然后我希望看到两条路径相互并排,直到我将feature/1
合并到develop中。此时我希望看到feature/1
分支路径合并回develop
分支路径。
但是,当我在任何给定时间只在一个分支上工作时(除了始终存在的开发和主分支) - 这不是发生的事情。如果我开始研究一个新的分支,完成分支并将其合并回开发,这一切似乎都发生在同一个“路径”上。然而,当我同时在两个分支上工作时,似乎其中一个分支在其自己的路径上突然出现。但是,第一个分支只是可视化为开发分支的延续。
我发现令人困惑的是,只有一个分支在视觉上用自己的路径表示,而另一个分支只是表示为开发分支的直接延续。我错了 - 或者考虑分支错了?我只是希望得到一个清晰而一致的视图,当我将一个新的分支从开发中分解出来并且当我再次合并它时。在我看来,为每个创建的分支创建一个单独的路径会使这更容易获得。
那里有GIT客户端吗?或者我需要以不同的方式看待它?
答案 0 :(得分:3)
你的问题"是的,你不知道快进合并。如果没有任何要合并的东西,意味着你没有在分支和合并之间进行任何改变,那么你默认进行快进合并只会使develop
指向同一个提交为feature/1
。如果您希望保留具有不同路径的历史记录,则可以使用--no-ff
merge
选项来创建合并提交,即使实际上没有任何合并也是如此。然后任何Git客户端都会显示您期望的图像。如果你不这样做,没有Git客户端可以向你显示,因为这不是历史记录的样子。
答案 1 :(得分:2)
您在此处看到的是fast-forward merges和true merges之间的区别。
在Git中,将一个分支合并到另一个分支中并不会导致merge commit;如果自分支点以来在目标分支上没有进行新的提交,Git将只是向前移动源分支,使其指向与目标分支相同的提交。
考虑这个例子:
A - B - C (master)
\
E - F (feature)
这里,feature
分支的分支点是提交B
。从那时起,在C
分支上提交了master
。如果您要将feature
合并到master
,Git会注意到分支点不再是master
中的最新提交,因此它必须 tie 通过创建合并提交,这两个历史记录在一起(您称之为" 路径"),这是一个具有多个父级的提交:
A - B - C - M (master)
\ /
E - F (feature)
但是,如果自分支点以来master
上没有发生新的提交,Git只会将master
分支向前移动到指向与feature
相同的提交。这称为fast-forward merge:
<强>快进强>
快进是一种特殊类型的合并,您可以在其中进行修订,然后合并&#34;合并&#34;另一个分支改变了这一点 碰巧是你拥有的后代。在这种情况下,你没有 进行新的合并提交,但只是更新到他的修订版。
所以,鉴于这种情况:
A - B (master)
\
E - F (feature)
将feature
合并到master
只会导致:
A - B - E - F (master, feature)
如果您想强制Git创建合并提交,即使它会执行快进合并,您也可以添加--no-ff
git-merge
选项。所以这样做:
git merge feature --no-ff
会导致:
A - B - M (master)
\ \
E - F (feature)
答案 2 :(得分:1)
注意:Git 2.33(2021 年第三季度)澄清了术语表中“fast-forward
”的描述:
请参阅 commit e22f2da 的 Reuven Y (robi-y
)(2021 年 5 月 19 日)。
(2021 年 6 月 10 日于 Junio C Hamano -- gitster
-- 被 commit 7f06d94 合并)
docs
:改进词汇表内容的快进签字人:Reuven Yagel
<块引用>文本在修订本身和作者之间有些混乱。
glossary-content
现在包含在其 man page 中:
快进是一种特殊类型的合并,您有一个修订版,并且您正在“合并”另一个分支的更改,这些更改恰好是您所拥有内容的后代。
在这种情况下,您不需要进行新的合并提交,而只是更新您的分支以指向与您要合并的分支相同的修订版。