【问题标题】:Use `git rebase` to remove a commit in the middle使用 `git rebase` 删除中间的提交
【发布时间】:2016-11-22 22:24:42
【问题描述】:

我正在尝试撤消中间的提交,同时保持以下提交不变。在找到这些帖子之前,我认为这可能是不可能的:Post 1 & Post 2。 (最终目标可能会重复,但我确实没有成功。对此我深表歉意。)

不幸的是,我仍然不知道如何正确使用git rebase -i。我创建了一个示例存储库,如下所示:

commit cc2576365a9716bb9f96e195e599190d3c70fba0
Author: zzy
Date:   Sun Jul 17 14:30:53 2016 -0400
commit #3

commit 11d9f8fdc69be8b4530e4b70c9661b4e34287afe
Author: zzy
Date:   Sun Jul 17 14:30:36 2016 -0400
commit #2

commit 4770e08eb54d0d582bd4b391f2361a328b417cdf
Author: zzy
Date:   Sun Jul 17 14:29:58 2016 -0400
commit #1

每次提交都会在名为a 的文件中添加一个新行(请参阅下面a 的内容):

提交 #1 之后

1

提交 #2 之后

1
2

在提交 #3 之后

1
2
3

现在我打算删除提交 #2,a 应该如下所示:

1
3

我尝试了git rebase -i 11d9f8fdc69be8^ 的命令,得到的文本文件为:

pick 11d9f8f commit #2
pick cc25763 commit #3

我删除了第一行,只保留了提交 #3 并退出了文件。但我收到以下错误:

error: could not apply cc25763... commit #3

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
Could not apply cc2576365a9716bb9f96e195e599190d3c70fba0... commit #3

文件a变成:

1
<<<<<<< HEAD
=======
2
3
>>>>>>> cc25763... commit #3

我很困惑为什么 2 还在这里以及为什么会有冲突。谁能帮我得到预期的结果?提前致谢!

【问题讨论】:

  • 您在提交中引入的更改彼此过于接近。它们不重叠,但为了确保不会丢失任何内容,Git 和任何其他diff 程序在差异中至少包含两行上下文(一前一后)。从这个角度来看,您的提交引入的更改重叠,这就是发生冲突的原因。使用更大的文件重试,并注意将更改分开几行,它会按预期工作。
  • 除了what axiac mentioned,您可能还想将merge.conflictstyle 设置为diff3,这样Git 不仅会显示两个不同的版本,还会显示共同的基础部分。对于这个特殊的微不足道的例子来说,它并不是很有用,但总的来说,我发现使用diff3 模式集更容易阅读合并冲突。
  • @axiac 非常感谢你!!!!是的,我用完全相同的命令更改为一个更大的示例,它可以工作!
  • @torek 请问如何启用它?我做了一个快速调查,发现这个命令:git config --global merge.conflictstyle diff3。是你在这里提到的吗?
  • 您可以使用 git revert 撤消提交,而不是变基。值得一提的是..即使您明确要求重新定位解决方案。 $git revert SHA_commit2.. 这样做可以跟踪更改

标签: git github version-control rebase


【解决方案1】:

基本上,由于提交 #2 和提交 #3 在同一个文件中更改了彼此非常接近的行,所以 git 不知道如何在提交 #2 之后“重放”提交 #3 中的更改不再存在,因此您会遇到冲突。

在包含冲突的文件中,您会看到:

<<<<<<< HEAD
=======
2
3
>>>>>>> cc25763... commit #3

&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD======= 之间的空格显示了在提交 #1、提交 #2 或提交 #3 创建之前该位置包含的文件。 =======&gt;&gt;&gt;&gt;&gt;&gt;&gt; cc25763... commit #3 之间的空格包含提交 #3 中该文件部分的内容,在添加提交 #2 和提交 #3 之后。 Git 希望您使用此信息手动决定提交 #3 的 版本应该包含哪些内容,因为您正在尝试在不提交 #2 的情况下重播它。

在重放提交 #3 后,将文件的整个部分替换为您希望文件包含的内容。在这种情况下,您将替换:

<<<<<<< HEAD
=======
2
3
>>>>>>> cc25763... commit #3

与:

3

然后,运行 git add a 以暂存这些更改,并运行 git rebase --continue 以继续 rebase。

请注意,您只需要在遇到冲突时在变基期间执行此操作。对于更改无关内容的提交(例如,如果提交 #2 和 #3 更改了完全不同的文件,或者同一文件的完全不同的部分),git rebase 通常可以自动确定要进行哪些更改,并且您不会遇到冲突.

【讨论】:

    猜你喜欢
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-22
    • 2022-07-03
    • 2011-12-19
    • 2022-01-10
    • 2017-11-04
    • 2014-01-02
    相关资源
    最近更新 更多