git squash并保持最后一次提交

时间:2013-05-12 13:00:24

标签: git workflow squash

我在压缩提交时遇到合并冲突,最后一次提交的结果与壁球之前不同。为什么运行

时最终结果会发生变化

git rebase -i someothercommit

然后压缩不需要的中间提交只留下第一个?考虑到每个提交是串联的,我不明白可能存在合并冲突。更多细节如下:

对于我的工作流程,我有几个分支机构  主  0somefeature  1anotherfeature  2lastfeature

一般0feature是基于master,1是基于0等当我对master进行更改时我将master合并为0feature,然后0feature为1newfeature等。

这就是我的目的:

$ git log --online -5
990cfb1 combine dump, add prog, combine validate
41013a9 Merge branch '5flash_addr' into 6flash_bankcheck
6f5e8f1 nothing interesting
7b8140d nothing interesting
2347714 implementation of dump and program

$ git rebase -i 2347714

然后我压缩除990cfb1之外的所有提交,最终出现合并冲突,我的新提交现在与合并之前的提交不同!!

谢谢!

2 个答案:

答案 0 :(得分:1)

“删除”一词在您的声明中不正确“然后我删除除990cfb1以外的所有提交”。您需要使用squash

当您运行$ git rebase -i 2347714时,您会看到弹出的文本编辑器显示您的所有消息:

pick 990cfb1 combine dump, add prog, combine validate
pick 41013a9 Merge branch '5flash_addr' into 6flash_bankcheck
pick 6f5e8f1 nothing interesting
pick 7b8140d nothing interesting
pick 2347714 implementation of dump and program

此时,我会说不要接触第一个!(990cfb1)。然后,对于剩下的,用“squash”或“s”替换“pick”作为别名。

现在,保存文件并退出编辑器。

然后,git rebase将继续运行。几秒钟后,将弹出另一个文本编辑器窗口,显示所有提交消息。

此时,您可以安全地删除所有邮件并将其重写为一个句子作为最终提交邮件。

现在,保存并离开。 Git会自动执行以下操作。完成!

旁注

您可能在执行上述过程后遇到问题,因为您的“rebase”已经运行但暂停了一些错误。

你需要:

  1. 首先将整个git项目的物理副本发送到其他地方!!!
  2. 然后,运行git rebase --abort
  3. 按照上述流程从干净状态开始。

答案 1 :(得分:0)

我现在已经做得更好了..主要问题是将“旧”分支合并到新分支中,我多次执行,然后在合并步骤中进行重新定位并压缩所有提交。哈希更改或提交被无序压缩一定存在问题。

更好的做法是将新分支重新绑定到旧分支上的附加提交,以便提交历史是线性的(而不是将H合并到G中)。

             0feature    1feature
                |           |
                v           |
A --  B -- C -- D -- H      |
                 \          v
                  E -- F -- G

换句话说,使用上面的原理图,如果我在D上进行额外的提交H(将0feature指针移动到H),则将0feature合并为1feature(并多次执行此操作),然后尝试rebase / sqash 0feature& amp; 1特征我最终会遇到问题。而不是git checkout G; git merge H我应该为每个小清理使用git rebase --onto H D G。自从最初的帖子以来,我一直在做这些选项中的第二个,从那时起一直很好。

另外,如果这是我的提交日志:

990cfb1 combine dump, add prog, combine validate
41013a9 Merge branch '5flash_addr' into 6flash_bankcheck
6f5e8f1 nothing interesting
7b8140d nothing interesting
2347714 implementation of dump and program

我从2347714转出,rebase选项应如下所示:

pick 7b8140d nothing interesting
s 6f5e8f1 nothing interesting
s 41013a9 Merge branch '5flash_addr' into 6flash_bankcheck
s 990cfb1 combine dump, add prog, combine validate