git 期间的冲突在单个文件上还原
Conflict during git revert on a single file
我在一个非常基本的用例上使用 git 还原,以了解它的实际工作原理,但我面临以下问题。我已经阅读了几篇关于类似场景的帖子,但我认为 none 对此提供了明确的答案。我上网冲浪,甚至粗略地阅读了 Git 文档中关于 reset/revert 命令的部分内容,但仍然无法弄清楚这里发生了什么。有任何帮助。
这些是我正在执行的确切步骤,顺序如下:
- 创建一个
~/gittest
目录并在其中创建一个 testfile
文件。
- 将以下行添加到
testfile
中:commit 1
- 执行
git add testfile; git commit -m 'commit 1'
- 将以下行添加到
testfile
:commit 2
- 执行
git add testfile; git commit -m 'commit 2'
- 将以下行添加到
testfile
中:commit 3
- 执行
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
如您所见,在从 base 到 theirs 的过渡中,删除了 commit 2
行,但在从 base 到 ours 的过渡,在行 commit 2
.
之后附加了行 commit 3
尽管您可能认为行 commit 3
独立于行 commit 2
,但合并算法(的作者)并不这么认为。相反,当相邻行发生变化时,它被认为是一个值得注意的事件,因此这种情况被标记为冲突。
我在一个非常基本的用例上使用 git 还原,以了解它的实际工作原理,但我面临以下问题。我已经阅读了几篇关于类似场景的帖子,但我认为 none 对此提供了明确的答案。我上网冲浪,甚至粗略地阅读了 Git 文档中关于 reset/revert 命令的部分内容,但仍然无法弄清楚这里发生了什么。有任何帮助。
这些是我正在执行的确切步骤,顺序如下:
- 创建一个
~/gittest
目录并在其中创建一个testfile
文件。 - 将以下行添加到
testfile
中:commit 1 - 执行
git add testfile; git commit -m 'commit 1'
- 将以下行添加到
testfile
:commit 2 - 执行
git add testfile; git commit -m 'commit 2'
- 将以下行添加到
testfile
中:commit 3 - 执行
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
如您所见,在从 base 到 theirs 的过渡中,删除了 commit 2
行,但在从 base 到 ours 的过渡,在行 commit 2
.
commit 3
尽管您可能认为行 commit 3
独立于行 commit 2
,但合并算法(的作者)并不这么认为。相反,当相邻行发生变化时,它被认为是一个值得注意的事件,因此这种情况被标记为冲突。