Почему git revert дает мне конфликты - PullRequest
0 голосов
/ 20 сентября 2018

Сказать, что у меня есть пустой репозиторий 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 голосов
/ 20 сентября 2018

Когда git пытается сделать revert, он генерирует для каждого файла патч (используя формат diff файлов), который противоположен разнице изменений, вносимых коммитом.

Your "Проблема "связана с форматом 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);
             }

Вы могли видеть код, добавленный (+) и удаленный (-).Но вы также можете видеть, что есть строки контекста вокруг измененных строк.

Если одна из строк контекста в файле, к которому применяется исправление, изменилась, исправление не применяется автоматически, и у вас возник конфликт слияния.

В вашем случае.

У вас нет конфликтов в измененных строках, но в контекстных строках ...

0 голосов
/ 20 сентября 2018

К git revert 4c79a7f вы пытаетесь отменить (то есть «отменить») коммит b, а не вернуться к нему.Но git не знает, как это сделать: он не знает, должен ли он хранить ccc или нет.

...