Squash提交master但是在功能分支上单独提交?

时间:2013-07-03 19:20:37

标签: git

让我说我在一个名为foo_baz的分支中处理一个特征。

我在处理该功能时多次提交。

我会定期将远程跟踪分支foo_baz推送到远程仓库。 IE origin/foo_baz

我希望将所有提交从foo_baz合并到master并推送到origin/master。这是问题:

我可以将foo_baz合并到master,以便所有提交在foo_baz的历史记录中仍然是分开的,但在master的历史记录中,它们都是一个,压扁承诺?

修改

我是一个git初学者,所以请原谅我,如果有一些我完全不知道的东西。我在网上挖了一下但找不到我问题的直接答案。

3 个答案:

答案 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分支时获得的所有文件)在DE中都是相同的(在这种特殊情况下,无论如何,在合并操作之前master上没有对B进行任何更改,但它们是不同的提交。

与直线git merge的区别在于后者通常会产生“快进”,如下所示:

A --- B
        \
          C --- D      <-- foo_baz, master

可以将有角度的线条拉直,为您提供两个分支看起来完全相同的历史记录。

答案 1 :(得分:0)

我认为你想要的是这样的:

git merge --squash foo_baz
git commit

答案 2 :(得分:0)

我认为你正在寻找--squash旗帜。