首页 > 解决方案 > git revert 是如何工作的

问题描述

我有一个包含以下提交历史的文件:

$git log --oneline
49740e5 3: Third version
796a330 2: Second version
539aa76 1: First version
647d060 file C creation

在每个版本中,我只是在我的文件中添加了一个文本字符串。我虽然如果我恢复“796a330 2:第二版”git会自动生成一个恢复提交,我会得到这样的东西:

3: Third version
1: First version
file C creation

但实际上这个动作不是自动的,我有一个合并冲突要解决。为什么?

标签: git

解决方案


使用git revert 796a330,796a330 2不会从日志中消失。相反,创建了另一个提交,它尝试应用 on 的反向796a330 2补丁49740e5 3

至于冲突,这里有一个例子。假设 in539a76 1 C为空。然后在 中796a330 2,添加了一行hello\n。然后在 中49740e5 3,该行被替换为world\n

的补丁796a330 2是从无到hello\n,的补丁49740e5 3是从hello\nworld\n。的反转补丁796a330 2hello\n从无到有。当将反转的补丁应用到 上49740e5 3时,它无法像only has一样找到hello\n。所以它报告了冲突。CCworld\n

换句话说, 的变化49740e5 3依赖于796a330 2的变化。如果您想在796a330 2没有冲突的情况下还原 的更改,则需要先还原49740e5 3。如果这两组变化是独立的,git revert 796a330在这种情况下不会引起冲突。

冲突不是错误。您可以通过保留您想要的代码并删除您不需要的代码来解决它们。应始终删除冲突的标记。


推荐阅读