您可能确实在寻找--squash
(如其他答案),但您可能正在寻找--no-ff
。
这是两者之间的区别。假设您从两个提交开始:
A --- B <-- branch "master", when you start
然后在你的新分支上再做两个foo_baz
:
A --- B <-- master
\
C --- D <-- foo_baz
现在(再次打开master
),您有这两个选项(以及其他选项)。您可以git merge --squash foo_baz && git commit
为您提供以下信息:
A --- B ----------- E <-- master
\
C --- D <-- foo_baz
或者你可以git merge --no-ff
:
A --- B ----------- E <-- "master" after merge --no-ff
\ /
C --- D <-- foo_baz
两者都给你一个新的提交E
——在第一种情况下,来自单独的git commit
命令——但第一个抑制了多父操作,所以最后,当你一年后回顾这件事时,看起来你刚刚复制了分支中的所有更改。树git checkout
(分支时获得的所有文件)在两者中都是相同的(无论如何D
,E
在这种特殊情况下,在master
合并操作之前对 B 没有任何更改),但它们是不同的提交。
与直道不同的git merge
是,后者一般会产生“快进”,看起来像这样:
A --- B
\
C --- D <-- foo_baz, master
可以拉直有角度的线,从而为您提供两个分支看起来完全相同的历史。