在糟糕的变基之后删除重复提交记录

22

我有两个分支,masterfeature。Master偶尔会接收到需要快速上线的小调整。完成这些调整后,将master重新基于feature,以使feature保持最新状态。

master上更改的文件通常与feature上的大部分开发无关,但我一直遇到复杂的三路合并冲突。

在查看了feature的提交记录后,我发现问题出在几个重复的提交上,并尝试使用交互式变基解决它。

我的问题是:

这是问题的最佳解决方案吗?如果是,我可以删除重复项并基本上按照我的预期构建历史记录吗?还是应该删除较高(旧原始)或较低(新副本)的重复项?

git rebase master -i 获取的摘要列表:

pick 0eb277c Commit A
pick ced2556 Commit B
pick 640e049 Commit C
pick b248ff7 Commit D
pick 9903094 Commit E
pick ebc279d Commit A
pick 313385b Commit F
pick 0d55178 Commit G
pick c8f09f9 Commit H
pick e877be3 Commit I
pick 9859aa0 Commit J
pick c3c8e0f Commit K
pick 8abc68c Commit L
pick 84a5c89 Commit A
pick 30570e4 Commit B
pick 937ff2f Commit C
pick 8e6d911 Commit D
pick 1dd3a09 Commit E
pick fe79288 Commit F
pick 9e790bb Commit G
pick 0924916 Commit H
pick 90d59d7 Commit I
pick ba06c55 Commit J
pick 7452fad Commit K  ** Dupes end here** and features then has 30+ more commits.
pick d1dca3d Commit M
pick 6c85f76 Commit N
pick ad53b78 Commit O
pick f166471 Commit P

2
你可以使用 git rebase -i HEAD~x 命令,将 x 替换为你想要从上到下查看的提交数量,例如 git rebase -i HEAD~3 将会显示最近的三个提交。然后你可以选择保留哪些提交,删除哪些提交。 - e.doroskevic
提交记录0eb277c和ebc279d都被标记为提交A,但它们的SHA1显然不同,因此它们是不同的提交。实际上,在SHA1列表中我没有看到任何重复的提交。 - Frodon
我的意思是松散的重复,提交消息相同,应用的代码也相同。但它是重复的并保存为一个新提交。 - Kiee
2个回答

20
为了删除重复的提交,您必须通过由 git rebase master -i 生成的列表,使用箭头键上下导航,并按下 d 键删除您想要 drop 的提交。(master 可以替换为提交哈希或任何有效的re-base点) 一旦您删除了所有重复项并拥有看起来符合您期望的历史记录的提交列表,则通过按下 esc 并键入 !wq 然后按下 enter 退出 rebase 屏幕。
然后,re-base 将继续并将您选择的提交列表应用于您的 re-base 点。请注意保留原始HTML标记。

1
很好的答案,只需记住它将vim作为git提交文本编辑器的参考。例如,我将编辑器设置为nano,快捷键完全不同。 - Dmitriy Popov

0

有一种比被接受的答案建议的更简单的方法。切换到feature并运行常规的git rebase master。与交互式变基不同,非交互式变基足够聪明,不会重复应用相同的更改,从而产生清晰、线性的提交历史。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接