为什么 git revert 会产生冲突?

Why does git revert produce conflicts?

我有以下提交

dd9e52bafac5fa427ed64c5d9cf08015fa804ed4 Added Line 3
a000427a4c70781d0bed7b31f56f290ac1d636b7 Added Line 2
20baa578ae205768639620749f53bd318e329e73 Added Line 1
7c043a104394ba4ba5a2fb29d4526de50b7d12be Created file.txt

在提交 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 中查看冲突时显示以下内容

我想要发生的事情

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

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

git revert <commit> 创建一个新提交,它执行与给定提交相反的操作。在上述情况下,它尝试应用由 git diff -R 20baa57^..20baa57.

生成的补丁

如果更改不能完全反向应用,就会发生冲突。您可以解决冲突(修复、添加、提交),也可以中止还原并手动执行更改。

根据冲突的类型,提供不同的 merge strategy (--strategy) 或策略选项 (-X) 可能会更好。

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

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

-Line 1
 <nothing else in the file>

当尝试从任何 diff 对一行应用更改时,如果该行 从那时起它的两个相邻行发生了更改,Git 将引发冲突。这就是 Git 用来猜测同一文件中的更改是否重要到足以打扰您的启发式方法。使用这种启发式方法,上述差异与文件的最新状态冲突,即:

Line 1
Line 2
Line 3

它拒绝只删除第 1 行,因为下一行以前什么都没有,但现在是第 2 行。Git 认为可能会影响第 1 行的含义。它不会让你删除第 1 行而不确认后来添加的第 2 行并没有使第 1 行更重要,毕竟值得保留。