2012-04-15 2 views
4

Следующий pastebin - это репо с одним файлом с одним, двумя, тремя, четырьмя, пятью печатными буквами на каждой строке.Использовать «git revert», чтобы отменить изменение, добавив строку?

Каждая линия поручены отдельно в мерзавца:

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 

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

мерзавец 1.7.10

ответ

1

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

+0

О, хорошо, вы говорите, что я должен использовать эту команду только там, где я, вероятно, просто сделаю git reset - hard HEAD ^? – sabgenton

+0

Хорошо бы это было бы полезно, если бы ты толкнул, но не так полезен, как я надеялся .. (я, скорее всего, набился всего одним нажатием) – sabgenton

+0

Я попробовал ручной способ сделать «hg backout» описанный здесь http://mercurial.selenic.com/wiki/Backout (замена возвращается с оформлением .) и то же самое происходит! – sabgenton

2

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

$ 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. 

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

+0

Вы, безусловно, можете отменить фиксации, которые не являются последними. В этом случае это просто не работает. – svick

+1

Yuck но хорошо изложенный!Если в последней версии git есть --strategy = fix, я бы с удовольствием узнал, не могу ли я дать вам галочку для трубы для 'patch -R', в конце концов. – sabgenton

+0

Мне нужно было использовать 'patch -R -p1', чтобы заставить (почти) работать. Выход из 'git show' имеет разницу между' a/file' и 'b/file', которые не могут применяться без добавления опции' -p1'. В конечном счете, все изменилось настолько, что многие изменения в конечном итоге были отклонены «патчем» в любом случае, но я могу разобраться в них. – tripleee