我遇到了git revert
命令的问题。我使用的是Ubuntu 12.04 Linux和Git 1.7.9.5版。
b_test_repo
,并通过远程origin b_test_repo
跟踪它。A
),其中包含两行文本,并且仅在本地master
分支中成功提交。为了试用git revert
我生成了3个提交,每个提交都添加了一行文本。所以我的master
提交历史记录如下:
A - B - C - D
其中
A
- 包含第1行和第1行的新文件2 B
- 添加了一行C
- 添加了一行D
- 添加了一行在所有这些提交之后,文件包含5行:
line1
line2
line3
line4
line5
然后,我想恢复提交B
,这将提交没有line3
的文件,该文件是由提交B
添加的:
git status
# On branch master
nothing to commit (working directory clean)
我输入:
git revert -n master~2
在不提交更改的情况下还原提交B
的效果,但请获取以下内容:
error: could not revert 1a13ad6... Adding one line
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
我很困惑为什么我会遇到冲突,也就是为什么Git在找出文件中需要更改的内容时遇到了问题。
我在这里缺少什么?请赐教!
答案 0 :(得分:4)
删除该行会与更高版本产生冲突,这会更改相同的行。
正如“What should I do when git revert aborts with an error message?”中提到的那样,您需要解决合并,添加和提交。
恢复该提交的一种更简单的方法是交互式rebase:
git rebase -i <SHA1 commit a>
然后放弃提交b
但是,只有当您没有将分支推送到 upstream repo 时,这才有效,因为它会重写提交历史记录。
如果您已经推送,那么git revert
是正确的方法,以便生成新的提交取消b
(并在上游存储处推送新的提交)。
详细信息:您的示例生成以下合并冲突:
C:\Users\VonC\prog\git\tests\18779372\r1>git lg
* 10b9953 - (HEAD)
* 07fff99 - c
* 3d888c4 - b
* 8c7155f - a
(git lg
是alias for a fancy git log
)
如果存在冲突,我希望在合并或还原之前看到源(他们的),目的地(我们的)和原始部分:
git config merge.conflictstyle diff3
然后恢复:
git revert -n master~2
这会给:
line1
line2
<<<<<<< HEAD
line3
line4
line5
||||||| 3d888c4... b
line3
=======
>>>>>>> parent of 3d888c4... b
这样,您就会看到git revert
的作用:合并:
b
的父级(显然不包含b
修改)HEAD
合并无法决定从第三行开始为部分做什么:
a
中不存在该部分(=== >>>>
部分:'他们的一面)b
中进行了修改(||||
和====
之间的原始部分,与revert
之前一样,只有line3
)HEAD
<<<< ||||
部分 进行了修改,但添加了line4
和line5
,即使{{} 1}}看起来没有变化)如果以commit line3
开头,则合并冲突更加清晰:
a
最终将提交line1
line2
line3
line4
line5
作为:
d
(提交line1
line2
line3b
line4c
line5d
将“b
”添加到第3行,提交d
将“c
”添加到第4行,提交c
添加“{{1 ''到第5行)
然后一个还原会给你:
d
这里是从第3行开始的部分:
d
中的git config merge.conflictstyle diff3
git revert -n master~2
cat afile.txt
line1
line2
<<<<<<< HEAD
line3b
line4c
line5d
||||||| 4ddccc1... b
line3b
line4
line5
=======
line3
line4
line5
>>>>>>> parent of 4ddccc1... b
,line3 -line4 -line5
的父亲,或者提交=== >>>
)b
中的a
(原始部分line3b-line4 -line5
,合并/恢复之前)b
'我们的'||| ===
line3b-line4c-line5d
三种不同的内容,合并无法知道该怎么做。