4

我在使用git revert命令时遇到问题。我使用 Ubuntu 12.04 Linux 和 Git 版本 1.7.9.5。

  1. 我在本地 PC 上创建了一个全新b_test_repo的,从远程跟踪它origin b_test_repo
  2. 我在本地创建了一个A包含两行文本的文件(commit),并且仅在本地master分支中成功提交了它。

为了尝试,git revert我又生成了 3 个提交,每个提交都添加了一行文本。所以我的master提交历史看起来像:

A - B - C - D

在哪里

  • A- 第 1 行和第 2 行的新文件
  • B- 添加了一行
  • C- 添加了一行
  • D- 添加了一行

在所有这些提交之后,该文件包含 5 行:

line1
line2
line3
line4
line5

然后,我想恢复 commit B,这将在没有 的情况下呈现文件line3,这是由 commit 添加的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 在确定文件中需要更改的内容时遇到问题。

我在这里想念什么?请赐教!

4

1 回答 1

4

删除该行将产生与将更改同一行的更高版本的冲突。

所以正如“当 git revert aborts with a error message? ”中提到的,你需要解决合并、添加和提交问题。

恢复该提交的一种更简单的方法是交互式变基:

git rebase -i <SHA1 commit a>

然后你放弃了 commit b
但这仅在您尚未将分支推送到上游 repo时才有效,因为它确实重写了提交的历史记录。

如果您已经推送,那么git revert正确的方法是生成一个新的提交取消b(并将该新提交推送到上游仓库)。


详细说明:您的示例生成以下合并冲突:

C:\Users\VonC\prog\git\tests\18779372\r1>git lg

* 10b9953  - (HEAD)
* 07fff99  - c
* 3d888c4  - b
* 8c7155f  - a

git lg幻想的别名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<<<< ||||部分,添加了line4and line5,即使line3看起来没有变化)

如果您从提交开始,合并冲突会更加清晰a

line1
line2
line3
line4
line5

最后提交d为:

line1
line2
line3b
line4c
line5d

(commit badd ' d' 到 line3,commitc添加 ' c' 到 line 4,commitd添加 ' d' 到 line 5)

然后恢复会给你:

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

这里从第 3 行开始的部分:

  • 等于line3 -line4 -line5'theirs' === >>>,它是b或 commit的父级a
  • 等于line3b-line4 -line5提交b(原始部分||| ===,合并/还原之前)
  • 等于“我们的line3b-line4c-line5dHEAD<<< |||

三个不同的内容,并没有办法让merge知道该怎么做。

于 2013-09-13T06:08:26.583 回答