您可能确实在寻找--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
,其中该斜线可以理顺,给你一个历史的其中两个分支看起来完全一样。