为什么git还原会产生冲突?

时间:2018-04-13 17:24:35

标签: git revert git-revert

我有以下提交

dd9e52bafac5fa427ed64c5d9cf08015fa804ed4 Added Line 3
a000427a4c70781d0bed7b31f56f290ac1d636b7 Added Line 2
20baa578ae205768639620749f53bd318e329e73 Added Line 1
7c043a104394ba4ba5a2fb29d4526de50b7d12be Created file.txt
  • 在提交7c04时,我创建了一个名为file.txt
  • 的空白文件
  • 在提交20ba时,我将文本“第1行”添加到文件
  • 在提交a000时,我将文本“第2行”添加到文件
  • 在commit dd9e,我将文本“Line 3”添加到文件

在commit dd9e,file.txt现在读取

Line 1
Line 2
Line 3

Head和master指向最后一次提交(dd9e)。

如果我运行git命令

git revert 20baa

我被告知

error: could not revert 20baa57... Added Line 1
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'

我不明白为什么会发生冲突。

在VS Code中查看冲突时,它显示以下内容 git conflict

我想要发生什么

我想撤消在commit 20baa中完成的更改(即从文件中删除第1行)。我意识到我可以手动执行此操作然后提交更改,但我认为git revert是为了撤消更改?

我是否误解了git revert的作用?

2 个答案:

答案 0 :(得分:1)

import copy dcts = [] buffer = {} for i in list_of_dict: if not i or any(j in buffer for j in i.keys()): buffer = i else: new_ = copy.deepcopy(i) new_.update(buffer) buffer = copy.deepcopy(new_) dcts.append(buffer) print dcts 创建一个新的提交,它执行提交的反向。在上述情况下,它尝试应用git revert <commit>生成的补丁。

如果无法反过来干净地应用更改,则会发生冲突。您可以解决冲突(修复,添加,提交),也可以中止恢复并手动执行更改。

根据冲突的类型,您可能会更好地提供不同的merge strategygit diff -R 20baa57^..20baa57)或策略选项(--strategy)。

有关详细信息,请参阅man git-revert

答案 1 :(得分:1)

git revert查看原始提交中所做的更改,生成具有相反更改的差异,并尝试应用它。在你的情况下,Git正试图应用这个差异:

-Line 1
 <nothing else in the file>

当尝试将更改应用于来自任何差异的行时,如果该行其两条相邻行从那时起已发生更改,则Git将引发冲突。这是启发式Git用于猜测同一文件中的更改是否足以让您烦恼。使用此启发式,上面的diff与文件的最新状态冲突,即:

Line 1
Line 2
Line 3

它拒绝删除第1行,因为下一行曾经没有任何内容,但现在它是第2行.Git认为可能会影响第1行的含义。它不会让你删除第1行而不确认第2行的后续添加并没有使第1行更重要,毕竟值得保留。