Git revert无法按预期工作

时间:2013-09-13 04:51:16

标签: git revert

我遇到了git revert命令的问题。我使用的是Ubuntu 12.04 Linux和Git 1.7.9.5版。

  1. 我在本地PC上创建了一个全新的b_test_repo,并通过远程origin b_test_repo跟踪它。
  2. 我在本地创建了一个文件(commit A),其中包含两行文本,并且仅在本地master分支中成功提交。
  3. 为了试用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在找出文件中需要更改的内容时遇到了问题。

    我在这里缺少什么?请赐教!

1 个答案:

答案 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 lgalias 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 <<<< ||||部分 进行了修改,但添加了line4line5,即使{{} 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

三种不同的内容,合并无法知道该怎么做。