让我说我在一个名为foo_baz
的分支中处理一个特征。
我在处理该功能时多次提交。
我会定期将远程跟踪分支foo_baz
推送到远程仓库。 IE origin/foo_baz
。
我希望将所有提交从foo_baz
合并到master
并推送到origin/master
。这是问题:
我可以将foo_baz
合并到master
,以便所有提交在foo_baz
的历史记录中仍然是分开的,但在master
的历史记录中,它们都是一个,压扁承诺?
修改
我是一个git初学者,所以请原谅我,如果有一些我完全不知道的东西。我在网上挖了一下但找不到我问题的直接答案。
答案 0 :(得分:5)
您可能确实在寻找--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
可以将有角度的线条拉直,为您提供两个分支看起来完全相同的历史记录。
答案 1 :(得分:0)
我认为你想要的是这样的:
git merge --squash foo_baz
git commit
答案 2 :(得分:0)
我认为你正在寻找--squash
旗帜。