使用 git revert <commit-id>的时候,git 具体做了什么操作呢?

2014-08-20 13:52:43 +08:00
 snachx
比如一个文件内容为如下形式,每行一个字母:
a
b
c
d
e

commit流程如下:

commit5 abcze -> qxcze
commit4 amcze -> abcze
commit3 axcde -> amcze
commit2 abcde -> axcde
commit1 null -> abcde

revert commit2

这时候,结果会是冲突,内容变成如下:
<<<<<<< HEAD
q
x
===========
a
b
>>>>>>> parent of commit2
c
z
e

请问这个revert过程,git到底怎么处理的呢?不知道如何得到最终冲突结果的。
3962 次点击
所在节点    问与答
11 条回复
liwei
2014-08-20 15:37:31 +08:00
1. git format-patch -1 commit2
2. patch -R < commit2.patch
nicai000
2014-08-20 15:44:58 +08:00
@liwei 另外还修改了一下commit message并commit :)
liwei
2014-08-20 17:33:40 +08:00
@nicai000 是的 :)
snachx
2014-08-20 21:50:57 +08:00
@liwei 我试了一下,对于我举的例子,步骤2提示:

Hunk #1 FAILED at 1.
1 out of 1 hunk FAILED -- saving rejects to file test.rej

test.rej的内容是:
***************
*** 1,5 ****
a
- x
c
d
e
--- 1,5 ----
a
+ b
c
d
e

这个怎么和例子中的revert冲突联系起来呢?其实我就想知道,git是怎么得出a,b和q,x两行冲突的。

谢谢!
snachx
2014-08-20 21:52:07 +08:00
@nicai000 请看上一楼回复,忘了@ 了, 谢谢
julyclyde
2014-08-21 10:31:28 +08:00
@snachx 一处改了两遍,然后revert较早的那个commit
snachx
2014-08-21 10:51:38 +08:00
@julyclyde 可以用主贴中的例子详细说明么?非常感谢。
julyclyde
2014-08-21 10:54:31 +08:00
@snachx 你按@liwei 的命令执行一下就明白了。看看补丁的内容和要补的文件的内容
liwei
2014-08-21 10:58:24 +08:00
我觉得首先你得搞明白两种reject文件格式,然后自己做实验来验证,这些都要靠自己,别人一般没有时间来一步步的给你验证。
snachx
2014-08-21 11:03:23 +08:00
@julyclyde
@liwei

OK,tks,本来没问之前我就是@liwei 在一楼说的想法,自己实验了挺多次,换了几种不同的流程,发现和预期结果不一样。

来问了发现你们也是这种想法,但是解释不了疑问,抱歉,我再去试试。
liwei
2014-08-21 11:30:55 +08:00
1. git format-patch -1 commit2
2. patch -p1 -R --merge < 0001-commit-2.patch

只是因为git和patch采用了不同的方式来表达reject而已,你可以继续研究。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/128929

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX