在Git中尝试恢复时发生冲突

时间:2013-12-04 23:33:56

标签: 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

这是什么意思? 如何在保留commit 1和commit 3完成的更改的同时单独恢复commit 2所做的更改?

1 个答案:

答案 0 :(得分:4)

这是git revert所做的,简化的(希望不会过度简化)。你给它一个提交ID,或一个解析为提交ID的名称 - 在这种情况下,显然是4d417ed - 它通过diff找到文件中的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

@@ -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之后有三行?但是对于revert,由于没有“后”上下文行,文件必须在添加的行之后结束。缺少三行“后”上下文意味着“文件在这里结束”。 (并且,单个“之前”行告诉git-redundantly,从行号中可以明显看出 - 文件在更改之前只有一行。)

在任何情况下,由于你正在进行two line,git现在尝试使用上面显示的更改“反向修补”文件的当前版本。

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

如果您将diff3设置为test.txt,git会在one line <<<<<<< HEAD two line three line ||||||| 4d417ed... add a line two line ======= >>>>>>> parent of 4d417ed... add a line 文件中留下您的信息:

one line
three line

有些人发现这更容易阅读(虽然在这种情况下它并没有多大帮助)。

(旁白:我不确定你为什么不想要文件阅读:

{{1}}

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