git - 在 Git 中尝试还原时发生冲突

标签 git version-control

我正在学习 git。 我有以下场景:

1) 一个名为 test.txt 的文件 文件的初始内容:

one line

我提交包含此内容的文件。

2) 我在文件中添加了一个新行 现在文件的内容是:

one line
two line

我提交这个内容的文件

3)我在文件中添加了一个新行 现在文件的内容是:

one line
two line
three line

我提交包含此内容的文件。

现在我想恢复第二次提交。 所以我文件的内容应该是

one line

three line

但是当我运行时: git revert commitid_2 我收到以下错误消息:

error: could not revert 4d417ed... two line
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'

当我打开 test.txt 文件时:我看到内容被以下内容替换:

<<<<<<< HEAD
one line
two line
three line
=======
one line
>>>>>>> parent of 4d417ed... two line

这是什么意思? 我如何才能单独恢复提交 2 所做的更改,同时保持提交 1 和提交 3 所做的更改不变?

最佳答案

这是git revert确实如此,简化了(希望不要过于简单化)。你给它一个提交 ID,或者一个解析为提交 ID 的名称——在这种情况下,显然是 4d417ed — 并通过 diff 找出该提交中发生的变化- 将提交中的文件与之前提交中的文件 merge 。即:

git diff 4d417ed^ 4d417ed

差异显示:

diff --git a/test.txt b/test.txt
index [something]..[something] 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,2 @@
 one line
+two line

(index 和模式并不那么重要;关键是它以“统一差异”显示旧版本和新版本)。统一差异显示(只有)添加行上方有一行,下方没有行

在统一差异中,每个更改的两边都有额外的“上下文”行。这是一个更典型的统一差异 block ,我将一行代码向上移动了几行:

@@ -12,9 +12,9 @@ class Peer(object):

     def _renew(self):
         self._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
         self._sock.bind(self._local_addr)
         self._sock.setblocking(False)
-        self._sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
         self._state = 'bound'

     def is_open(self):

看看+之前怎么有三行, 和 - 之后的三行?对于 test.txt但是,由于没有“之后”上下文行,因此文件必须在添加的行之后结束。缺少三行“之后”上下文意味着“文件在这里结束”。 (而且,单一的“之前”行告诉 git——冗余地,从行号可以明显看出——文件在更改“之前”只有一行。)

无论如何,因为你正在做一个 revert , git 现在尝试使用上面显示的更改“反向修补”文件的当前版本。

为了做一个“前向补丁”,git 希望文件看起来像“之前”的版本——也就是说,它会使用行号和上下文行,找到最接近给定行号的行完全相同的上下文,并将它们更改为看起来像“之后”。要反转补丁,git 期望它看起来像“之后”,并将其更改为看起来像“之前”。但是文件的当前版本在 two line 行之后有“额外内容” .也就是说,上下文不匹配。如果文件在 two line 行之后结束, git 会知道该怎么做:删除行 two line .但是 git 不知道该怎么做,所以它留下了修改后的文件,带有冲突标记,供您手动解决。

如果你设置merge.conflictstylediff3 , git 会在你的 test.txt 中留下这个文件:

one line
<<<<<<< HEAD
two line
three line
||||||| 4d417ed... add a line
two line
=======
>>>>>>> parent of 4d417ed... add a line

有些人觉得这更容易阅读(尽管在这种情况下它并没有多大帮助)。

(旁白:我不确定您为什么不想读取文件:

one line
three line

中间也没有空行。但这是一个完全不同的问题。)

关于git - 在 Git 中尝试还原时发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388382/

相关文章:

git - 在 TeamCity 构建服务器上仅下载 GitHub 存储库的一部分

oracle - 如何仅为模式的两个不同版本之间的增量生成 DDL?

git - 本地分支机构跟踪其他本地分支机构的用例是什么?

git - Cherry-Picking 来自另一个分支的少数提交

git - 带有 VCS 后端的 Wiki?

oracle - 在协作的,版本控制的环境中,您如何处理Oracle软件包?

git - 与本地存储库相比,为什么使用 GitHub 操作时 `git rebase upstream/main` 的行为不同?

Git 和 PowerShell 以及德语变音符号

Git 未知开关 'C'

git - 运行 git stash show -p 时忽略特定文件