【问题标题】:How to nuke a commit before last commit如何在上次提交之前核对提交
【发布时间】:2015-05-07 02:04:41
【问题描述】:

假设我有 2 个分支 masterdev

dev 分支比 master 早 2 个提交,并且这些提交都没有被合并或推送到任何 remote

dev 分支如下所示:

dev A - B - C - D - E

而 A 是最旧的,E 是最新的提交。

我想达到这个状态:

dev A - B - C - E

基本上我想在最后一次提交之前取消提交,就好像它从未发生过一样。也不应该有冲突(E不依赖于D的变化)。

我可以使用交互式变基吗?

【问题讨论】:

  • stackoverflow.com/a/25490288/2541573顶部查看我的评论
  • 代替“Nuke”,更好的措辞可能是让 C 成为 E 而不是 D 的父级。如果没有任何东西指向 D,它最终将被垃圾收集。

标签: git


【解决方案1】:

我会使用变基的迭代形式。在dev 上时(您需要有干净的工作副本):

git rebase -i HEAD~~

在您最喜欢的文本编辑器中,您会获得最近 2 次提交的列表。只需评论/删除不需要的提交的行。

如果 HEAD 依赖于 HEAD~ 引入的更改,您可能会遇到合并冲突,并且在解决它们后,您将丢失以前的历史记录(当然,仍然可以通过 reflog 获得)。我通常更喜欢这种方法。

如果你想保存你以前的历史记录(和不需要的提交),你应该这样做

git checkout HEAD~~         # go to last good commit
git checkout -b new_branch  # create a new branch and forget about the original
git cherry_pick dev         # copy the commit on top of `dev` to `new_branch`

您仍然会遇到冲突,但您不会修改 dev 的历史记录。

另一方面,如果不需要的提交是在master 上并且你不想破坏任何人的构建,你会做git revert HEAD~

【讨论】:

  • 啊,最后我还是无法避免合并冲突。两个都解决了。谢谢。
  • @JanNetherdrake,你可以修改E来解决冲突,或者去一个新的分支。在答案中对此进行了扩展。顺便说一句,我喜欢 rebase -i - 您可以重新排序、拆分、压缩、重命名等提交。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
相关资源
最近更新 更多