我试图在中间撤消提交,同时保持以下内容不变。我认为在找到这些帖子之前可能是不可能的: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还在这里以及为什么会有冲突。任何人都可以帮助我获得预期的结果吗?提前谢谢!
答案 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
通常可以确定自动进行哪些更改,而您不会遇到冲突。