我正在学习 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.conflictstyle
至 diff3
, 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/