Git 恢复未按预期工作

Bud*_*udM 5 git revert

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

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

为了进行尝试,git revert我又生成了 3 个提交,每个提交都添加了一行文本。所以我的master提交历史如下所示:

A - B - C - D
Run Code Online (Sandbox Code Playgroud)

在哪里

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

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

line1
line2
line3
line4
line5
Run Code Online (Sandbox Code Playgroud)

然后,我想恢复 commit B,这将渲染没有 的文件line3,该文件是由 commit 添加的B

git status
# On branch master
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)

我输入:

git revert -n master~2
Run Code Online (Sandbox Code Playgroud)

恢复提交的效果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'
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么会遇到冲突,即为什么 Git 在确定文件中需要更改的内容时遇到问题。

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

Von*_*onC 4

删除该行将与更高版本产生冲突,从而更改同一

因此,正如“当 git revert 中止并出现错误消息时我应该做什么? ”中提到的,您需要解决合并、添加和提交问题。

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

git rebase -i <SHA1 commit a>
Run Code Online (Sandbox Code Playgroud)

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

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


详细信息:您的示例生成以下合并冲突:

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

* 10b9953  - (HEAD)
* 07fff99  - c
* 3d888c4  - b
* 8c7155f  - a
Run Code Online (Sandbox Code Playgroud)

git lg幻想的别名git log

如果存在冲突,我更喜欢像合并或恢复之前一样看到源(他们的)、目标(我们的)和原始部分:

git config merge.conflictstyle diff3
Run Code Online (Sandbox Code Playgroud)

然后恢复:

git revert -n master~2
Run Code Online (Sandbox Code Playgroud)

那会给出:

line1
line2
<<<<<<< HEAD
line3
line4
line5
||||||| 3d888c4... b
line3
=======
>>>>>>> parent of 3d888c4... b
Run Code Online (Sandbox Code Playgroud)

这样,您就会看到什么git revert合并

  • commit 的父级b(显然不包含b修改)
  • HEAD

合并无法决定对第三行开始的部分做什么:

  • 该部分不存在于a=== >>>>部分:“他们的”一侧)
  • 它被修改为b||||和之间的原始部分====,如之前一样revert,只有line3
  • 并且它也在HEAD(<<<< ||||部分,添加了line4line5,尽管line3看起来没有变化)进行了修改

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

line1
line2
line3
line4
line5
Run Code Online (Sandbox Code Playgroud)

最终提交d为:

line1
line2
line3b
line4c
line5d
Run Code Online (Sandbox Code Playgroud)

(提交b将“ ”添加d到第 3 行,提交c将“ ”添加c到第 4 行,提交将“ ”d添加d到第 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
Run Code Online (Sandbox Code Playgroud)

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

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

三个不同的内容,并且合并无法知道要做什么。