删除坏变基后引入的重复提交

Posted

技术标签:

【中文标题】删除坏变基后引入的重复提交【英文标题】:Remove duplicate commits introduced after bad rebase(s) 【发布时间】:2016-11-22 02:42:01 【问题描述】:

我有 2 个分支,masterfeature。 Master 偶尔会收到快速上线所需的小调整。完成这些调整后,master 将重新定位为 feature,以便该功能保持最新。

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

查看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

【问题讨论】:

您可以使用 git rebase -i HEAD~x 替换 x 与您想从上到下查看的任何数量的提交,例如 git rebase -i HEAD~3 这将为您提供最后三个提交。然后,您可以选择要保留的提交以及要删除的提交。 提交 0eb277c 和 ebc279d 都被标记为提交 A,但显然它们的 sha1 不同,因此它们是不同的提交。实际上我在 sha1 列表中没有看到任何重复的提交。 我的意思是松散的重复,提交消息是相同的,并且应用的代码是相同的。但它被复制并保存为新的提交。 【参考方案1】:

要删除重复的提交,您必须浏览由git rebase master -i 生成的列表,并通过使用箭头键在列表上上下导航来删除重复的提交,在您想要@ 的提交上按 d 987654322@.

master 可以替换为提交哈希或任何有效的重新基点)

一旦您删除了所有重复项并有一个提交列表以查看您期望的历史记录,请按 esc 并键入 !wq 并按 enter 退出变基屏幕.

然后重新基准将继续并将您picked 的提交列表应用到您的重新基准点。

【讨论】:

很好的答案,请记住它引用 vim 作为 git commit 文本编辑器。比如我把nano设置为编辑器,热键完全不一样。【参考方案2】:

有一种比公认答案建议的更简单的方法。切换到feature 并运行常规的git rebase master。与交互式 rebase 不同,非交互式 rebase 足够聪明,不会两次应用相同的更改,从而产生清晰的线性提交历史记录。

【讨论】:

以上是关于删除坏变基后引入的重复提交的主要内容,如果未能解决你的问题,请参考以下文章

功能分支变基后 Git 推送被拒绝

功能分支变基后 Git 推送被拒绝

重复提交可能是因为来自多个来源的变基

在推入 Git 之前合并多个提交 [重复]

Git更改未推送提交的作者[重复]

删除选择提交并合并或变基并添加重要提交