git revert:为什么我会遇到冲突?

时间:2017-09-18 08:45:38

标签: git

我使用Git,我知道:

git revert <hash-code>

用于创建一个新提交,该提交将与哈希代码中的过去提交相同。 例如,我有以下提交:

1f74a0e second commit
e72d8b8 first commit  

我想恢复第一次提交,所以我使用了:

git revert 1f74a0e

仍然,我收到以下错误:

  

错误:无法恢复1f74a0e ...首先提交提示:解析后   冲突,标记纠正的路径提示:使用&#39; git add&#39;   或者&#39; git rm&#39;提示:并使用&#39; git commit&#39;

提交结果

至于冲突,我输入:

$ git diff --name-only --diff-filter=U
file.txt

当我打开file.txt时,我看不到任何冲突迹象。

当然会有冲突。我希望git能够采取&#34;第一次提交&#34;并将其复制到第二次提交之上。我该怎么办?

4 个答案:

答案 0 :(得分:8)

实际上不是 revert的功能。 Revert没有“带你回去”提交并假装后续提交没有发生。它应用单个提交的逻辑否定 - 以及单独提交的 - 留下后续提交。

假设您有一些文件的初始提交 - 为简单起见,我们称之为提交#1,文件如下所示:

One
Two
Three
Four

现在假设您有一个更改一行的提交#2:

One
2
Three
Four

最后,提交更改不同行的#3:

One
2
Three
4

如果您尝试还原提交#2,它将仅撤消该提交中更改的行,并保留提交#3中引入的更改,因此结果将为:

One
Two
Three
4

现在,如果有后续提交更改了与您尝试还原的提交相同的行,那么您将发生冲突。例如,假设你有一个提交#4也改变了第二行:

One
TWO
THREE
4

现在,如果您的HEAD是#4提交并且您尝试还原提交#2,则会发生冲突。 Revert期望返回第二行 - 撤消commit#2中所做的更改。因此,它希望第二行当前为2,然后将其恢复为之前提交的内容,并将其设置为Two

然而,由于提交#4 更改了它,因此该期望无效。所以你有冲突。

如果你的目标不是要恢复,而是回到提交#1并忽略所有那些自那时以来发生的变化,那么你想要reset而不是revert

git reset --hard 1 

答案 1 :(得分:0)

您的索引中很可能已经存在未解决的冲突,可能是因为某些合并已经存在,或者还原本身导致了冲突。无论如何,您需要解决冲突并提交。

git status
# You would find files with conflicts
# resolve the commits

git add -u
git commit

答案 2 :(得分:0)

我正在补充@爱德华的答案。首先,revert命令要求“您的工作树必须是干净的(HEAD提交没有任何修改)”(请参见文档here)。 revert 命令将还原给定提交的更改,并将当前状态与要还原其更改的提交的PARENT进行比较。如果当前状态和该PARENT发生冲突,则git将指出这一点。如果没有,您将不会发生冲突。

以下是基于@Edward的示例:

假设您有三个修改文件的提交:

commit1:

One
Two

commit2

One
2       # < we introduced this changed in commit 2

commit3

One
2
three   # < we introduced this change in commit 3

如果您从当前状态还原提交2引入的更改(提交3,假设清除了3,即HEAD提交没有任何修改),则git将

  1. 删除该commit 2引入的修改,将2改回two
  2. 保留three中引入的commit 3行。因为当前状态(commit 3)与我们正在还原(commit 1)的提交的父级(commit 2)不冲突,所以不会发生冲突

现在,假设您的情况有所不同:

commit1:

One
Two
three

commit2

One
2       # < we introduced this changed in commit 2
three

commit3

One
2
3   # < we introduced this change in commit 3

如果您从当前状态(commit 2恢复commit 3引入的更改,假设清除了三个,即HEAD提交没有任何修改),git将会

  1. 删除该提交2引入的修改,将2改回两个`
  2. commit 3中引入的行与commit 2的父行进行比较并表明存在冲突:行three更改为3并与该行的父行(提交1)发生冲突。提交我们正在还原的更改(提交2)

答案 3 :(得分:-1)

Git通常会告诉您解决冲突,如果您在目录中编辑了但未提交的文件,即使它们不会直接影响您的提交。首先存储你编辑过的每一个