为什么 git revert 给我冲突
Why does git revert give me conflicts
说我有一个空的 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
。
通过 git revert 4c79a7f
,您试图恢复(即 "undo")提交 b
,而不是 return。但是 git 不知道该怎么做:它不知道是否应该保留 ccc
。
当git尝试做一个revert
时,它会为每个文件生成一个补丁(使用文件的差异格式),这与提交引入的更改的差异完成相反。
您的 "problem" 是由于 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);
}
您可以看到添加 (+) 和删除 (-) 的代码。
但您也可以看到修改行周围有上下文行。
如果应用补丁的文件中的上下文行之一已更改,则不会自动应用补丁,并且会发生合并冲突。
这是你的情况。
您在修改的行上没有冲突,但在上下文行上...
说我有一个空的 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
。
通过 git revert 4c79a7f
,您试图恢复(即 "undo")提交 b
,而不是 return。但是 git 不知道该怎么做:它不知道是否应该保留 ccc
。
当git尝试做一个revert
时,它会为每个文件生成一个补丁(使用文件的差异格式),这与提交引入的更改的差异完成相反。
您的 "problem" 是由于 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);
}
您可以看到添加 (+) 和删除 (-) 的代码。 但您也可以看到修改行周围有上下文行。
如果应用补丁的文件中的上下文行之一已更改,则不会自动应用补丁,并且会发生合并冲突。
这是你的情况。
您在修改的行上没有冲突,但在上下文行上...