我正在学习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所做的更改?
答案 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}}
中间也没有空行。但这是一个完全不同的问题。)