git 期间的冲突在单个文件上还原

Conflict during git revert on a single file

我在一个非常基本的用例上使用 git 还原,以了解它的实际工作原理,但我面临以下问题。我已经阅读了几篇关于类似场景的帖子,但我认为 none 对此提供了明确的答案。我上网冲浪,甚至粗略地阅读了 Git 文档中关于 reset/revert 命令的部分内容,但仍然无法弄清楚这里发生了什么。有任何帮助。

这些是我正在执行的确切步骤,顺序如下:

  1. 创建一个 ~/gittest 目录并在其中创建一个 testfile 文件。
  2. 将以下行添加到 testfile 中:commit 1
  3. 执行git add testfile; git commit -m 'commit 1'
  4. 将以下行添加到 testfilecommit 2
  5. 执行git add testfile; git commit -m 'commit 2'
  6. 将以下行添加到 testfile 中:commit 3
  7. 执行git add testfile; git commit -m 'commit 3'

此时我执行git log --oneline,这是输出:

ba1810 (HEAD -> master) commit 3
88bc443 commit 2
802d820 commit 1

现在 testfile 看起来像这样:

commit 1
commit 2
commit 3

我想要完成的是恢复提交 88bc443 并因此期待 commit 2 消失,所以 testfile 结束看起来像这样:

commit 1
commit 3

在尝试恢复操作之前,我执行了 git status,实际上我的工作树是干净的:

On branch master
nothing to commit, working tree clean

所以当我执行git revert 88bc443时,我得到以下错误:

Auto-merging test
CONFLICT (content): Merge conflict in test
error: could not revert 88bc443... commit 2
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add ' or 'git rm '
hint: and commit the result with 'git commit'

这些是错误提示后tesfile上的git个指标:

commit 1
<<<<<<< HEAD
commit 2
commit 3
=======
>>>>>>> parent of 88bc443... commit 2

我根本没有进行任何合并。以上是我在终端上执行的唯一指令。我已经阅读了 revert 应该如何在分支 after/before 合并之间工作,但我看不到在这种情况下冲突会在哪里存在,因为没有覆盖我试图通过任何后续恢复的行犯罪。我正在处理单个文件,甚至不在分支或远程存储库之间。

Git version: 2.25.1
Operative System: Linux Mint 20.2

在内部,git revert确实执行合并操作。

合并算法需要一个文件的三个版本:

  • 一个基础版本;这是提交后还原的版本,即

    commit 1
    commit 2
    
  • 他们的版本;这是被还原的提交之前的版本,即

    commit 1
    
  • 我们的版本;这是在其上进行还原提交的版本,即

    commit 1
    commit 2
    commit 3
    

如您所见,在从 basetheirs 的过渡中,删除了 commit 2 行,但在从 baseours 的过渡,在行 commit 2.

之后附加了行 commit 3

尽管您可能认为行 commit 3 独立于行 commit 2,但合并算法(的作者)并不这么认为。相反,当相邻行发生变化时,它被认为是一个值得注意的事件,因此这种情况被标记为冲突。