为什么git revert会产生冲突?

Sco*_*ott 5 git revert git-revert

我有以下承诺

\n\n
dd9e52bafac5fa427ed64c5d9cf08015fa804ed4 Added Line 3\na000427a4c70781d0bed7b31f56f290ac1d636b7 Added Line 2\n20baa578ae205768639620749f53bd318e329e73 Added Line 1\n7c043a104394ba4ba5a2fb29d4526de50b7d12be Created file.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 在提交 7c04 我创建了一个名为 file.txt 的空白文件
  • \n
  • 在提交 20ba 时,我将文本 \xe2\x80\x9cLine 1\xe2\x80\x9d 添加到文件中
  • \n
  • 在提交 a000 时,我将文本 \xe2\x80\x9cLine 2\xe2\x80\x9d 添加到文件中
  • \n
  • 在提交 dd9e 时,我将文本 \xe2\x80\x9cLine 3\xe2\x80\x9d 添加到文件中
  • \n
\n\n

在提交 dd9e 时,file.txt 现在读取

\n\n
Line 1\nLine 2\nLine 3\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

如果我运行 git 命令

\n\n
git revert 20baa\n
Run Code Online (Sandbox Code Playgroud)\n\n

有人告诉我

\n\n
error: could not revert 20baa57... Added Line 1\nhint: after resolving the conflicts, mark the corrected paths\nhint: with \'git add <paths>\' or \'git rm <paths>\'\nhint: and commit the result with \'git commit\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

我想要发生什么

\n\n

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

\n\n

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

\n

Ror*_*ane 4

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

-Line 1
 <nothing else in the file>
Run Code Online (Sandbox Code Playgroud)

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

Line 1
Line 2
Line 3
Run Code Online (Sandbox Code Playgroud)

它拒绝只删除第 1 行,因为下一行过去什么都没有,但现在是第 2 行。Git 认为这可能会影响第 1 行的含义。它不会让你在没有确认后面添加的情况下删除第 1 行毕竟2号线的开通并没有让1号线变得更加重要和值得保留。