Используйте "git revert", чтобы отменить изменение, добавив строку?

Следующий pastebin - это репо с одним файлом с одним, двумя, тремя, четырьмя и пятью строками в каждой строке.

Каждая строка помещалась отдельно в git:

http://pastebin.ca/raw/2136179

Затем я попытался удалить строку с помощью команды git revert <commmit which creates two>

И получим:

error: could not revert b4e0a66... second
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'

Не должно быть конфликта для чего-то такого простого? Или я делаю это неправильно/получил неправильную команду?

Детали слияния также не имеют смысла:

one
<<<<<<< HEAD
two
three
four
five
=======
>>>>>>> parent of b4e0a66... second

Разве это не означает удаление всего, кроме одного? Я ожидал, что только два будут затронуты...

git 1.7.10

Ответ 1

Я попытался повторить шаги и нашел ту же проблему. Кажется, что вы можете вернуть только самые последние коммиты. В моем репозитории:

$ git log --oneline
9a25594 five
f8f1ec4 four
3c75345 three
e6cd245 two
8349ccc one
d2f16c4 for stkofl  <<==== ignore this one

$ git revert 9a25 --no-edit
Finished one revert.
[master 82bbc79] Revert "five"
 1 files changed, 0 insertions(+), 1 deletions(-)
$ git reset --hard
HEAD is now at 82bbc79 Revert "five"

Отказ от любого набора коммитов, который не является набором последовательных коммитов, включая HEAD (последнее совершение), кажется, запрещен.

Конечно, вы можете сделать это:

    $ git show e6cd |patch -R
    patching file file
    Hunk #1 succeeded at 1 with fuzz 1.

а затем зафиксируйте результат.

Ответ 2

Изменения сохраняются как контекстные различия... если вы посмотрите на diff для third, вы заметите, что оно применяется в терминах строки, содержащей two, что означает, что она зависит от фиксации, введено two. Аналогично, каждая последующая фиксация зависит от непосредственно предшествующего фиксации, поэтому она хочет удалить все коммиты, следующие за тем, который ввел two (поскольку все они в конечном счете зависят от этого фиксации). Вот почему вы не должны полагаться на возможность вернуть фиксации в общем случае, но только сразу после их фиксации.