使用`git rebase`删除中间的提交

时间:2016-07-19 21:00:16

标签: git github version-control rebase

我试图在中间撤消提交,同时保持以下内容不变。我认为在找到这些帖子之前可能是不可能的: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&#39}内容):

提交#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还在这里以及为什么会有冲突。任何人都可以帮助我获得预期的结果吗?提前谢谢!

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

使用:

3

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

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