5

假设我在一个名为foo_baz.

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

我定期将foo_baz远程跟踪分支 push 到远程仓库。即origin/foo_baz

我进展到我想将所有提交合并foo_bazmaster并推送到origin/master. 这是问题:

我可以合并foo_bazmaster这样,使得所有提交在 ' 的历史中仍然是分开foo_baz的,但在master' 的历史中,它们都是一个,被压扁的提交吗?

编辑:

我是一个 git 初学者,所以如果我遗漏了一些完全明显的东西,请原谅我。我在网上四处寻找,但找不到我问题的直接答案。

4

3 回答 3

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

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

于 2013-07-03T20:45:03.330 回答
0

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

git merge --squash foo_baz
git commit
于 2013-07-03T19:33:56.243 回答
0

我想你正在寻找--squash国旗。

于 2013-07-03T19:34:16.280 回答