为什么git revert给我冲突

时间:2018-09-20 07:25:43

标签: git git-revert git-merge-conflict

说我有一个空的git仓库。这是我执行的命令:

echo 'aaa' > file
git add .
git commit -m 'a'
echo 'bbb' >> file
git commit -am 'b'
echo 'ccc' >> file
git commit -am 'c'

然后我执行git reflog来获取日志:

d3f79b4 HEAD@{0}: commit: c
4c79a7f HEAD@{1}: commit: b
a31df0d HEAD@{2}: commit (initial): a

现在,我想恢复为commit: b,这意味着我想将file更改为

aaa
bbb
ccc

aaa
bbb

我尝试执行以下命令:git revert 4c79a7f,但收到一些有关冲突的错误消息:

error: could not revert 4c79a7f... b
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'

file变为:

aaa
<<<<<<< HEAD
bbb
ccc
=======
>>>>>>> parent of 4c79a7f... b

我不明白为什么会遇到这样的冲突。

此外,如果我在每次提交时都创建三个文件,如下所示:

touch file1
git add .
git commit -m 'a'
touch file2
git commit -am 'b'
touch file3
git commit -am 'c'

我可以恢复到任何历史提交。

我正在学习git,所以我知道我可以使用git reset,但是现在我想学习git revert

2 个答案:

答案 0 :(得分:1)

当git尝试执行revert时,它会为每个文件生成一个补丁(使用文件的diff格式),这与提交所引入的更改进行的区别相反。

您的“问题”归因于diff格式以及补丁的应用方式。

差异示例:

diff --git a/GitUI/UserControls/RevisionGrid/RevisionGridToolTipProvider.cs b/GitUI/UserControls/RevisionGrid/RevisionGridToolTipProvider.cs
index 985995f39..91af87f84 100644
--- a/GitUI/UserControls/RevisionGrid/RevisionGridToolTipProvider.cs
+++ b/GitUI/UserControls/RevisionGrid/RevisionGridToolTipProvider.cs
@@ -23,7 +23,6 @@ public void OnCellMouseEnter()
             _toolTip.AutoPopDelay = 32767;
         }

-        private int _oldIndex = -1;
         public void OnCellMouseMove(DataGridViewCellMouseEventArgs e)
         {
             var revision = _gridView.GetRevision(e.RowIndex);
@@ -36,9 +35,8 @@ public void OnCellMouseMove(DataGridViewCellMouseEventArgs e)
             var oldText = _toolTip.GetToolTip(_gridView);
             var newText = GetToolTipText();

-            if (newText != oldText || _oldIndex != e.RowIndex)
+            if (newText != oldText)
             {
-                _oldIndex = e.RowIndex;
                 _toolTip.SetToolTip(_gridView, newText);
             }

您可能会看到代码已添加(+)和已删除(-)。 但是您还可以看到修改后的行周围有上下文行。

如果应用补丁的文件中的上下文行之一已更改,则补丁不会自动应用,并且您存在合并冲突。

您的情况是什么

您在修改的行上没有冲突,但是在上下文行上却没有冲突...

答案 1 :(得分:0)

通过git revert 4c79a7f,您正在尝试还原(即“撤消”)提交b,而不是返回。但是git不知道该怎么做:它不知道是否应该保留ccc