2012-04-15 14 views
4

Der folgende Pastebin ist ein Repo mit einer Datei mit einer, zwei, drei, vier, fünf in jeder Zeile getippt.Verwenden Sie "git revert", um eine Änderung rückgängig zu machen, indem Sie eine Zeile hinzufügen?

Jede Zeile wurde separat in git commited:

http://pastebin.ca/raw/2136179

ich die Linie zwei mit dem Befehl git revert <commmit which creates two>

Und bekommen dann versucht, zu löschen: sein

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' 

Es sollte kein Konflikt für etwas so einfaches? Oder mache ich es falsch/habe den falschen Befehl bekommen?

Die merge Details scheinen nicht Sinn zu machen, entweder:

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

Ist das nicht nur ein löschen alles sagen? Ich hatte erwartet, nur zwei betroffen sein ...

git 1.7.10

Antwort

1

Änderungen werden als Kontext diffs gespeichert ... wenn man sich die diff sucht third, werden Sie feststellen, dass es in angewendet wird Bedingungen der Zeile, die two enthält, was bedeutet, dass es abhängig von dem Commit ist, das two eingeführt wurde. Ebenso hängt jedes nachfolgende Commit dann von dem unmittelbar vorhergehenden Commit ab, weshalb es alle Commits entfernen will, die dem Commit folgen, das two eingeführt hat (da sie letztendlich alle von diesem Commit abhängen). Deshalb sollten Sie sich nicht darauf verlassen, Commits im allgemeinen Fall rückgängig machen zu können, sondern erst unmittelbar nach deren Begehung.

+0

Ah ok, sagst du, dass ich diesen Befehl nur verwenden sollte, wo ich wahrscheinlich nur git reset --hard HEAD^machen würde? – sabgenton

+0

Nun, es wäre immer noch nützlich, wenn Sie gepusht hätten, aber nicht so nützlich, wie ich es gehofft hatte. (Ich bin weniger wahrscheinlich, dass ich nur einen einzigen Druck gemacht habe) – sabgenton

+0

Ich habe den manuellen Weg versucht, 'hg backout' zu tun hier beschrieben http://mercurial.selenic.com/wiki/Backout (Ersetzen mit der Überprüfung zurück .) und das Gleiche passiert! – sabgenton

2

Ich habe versucht, Ihre Schritte zu wiederholen und das gleiche Problem gefunden. Es scheint, dass Sie nur die letzten Commits zurücksetzen können. In meinem Repository:

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

eine beliebige Menge von Commits Zurückkehren, die nicht eine Reihe von aufeinander folgenden Commits einschließlich HEAD (die jüngste Festschreibung) scheint nicht zugelassen werden soll.

Natürlich können Sie dies tun:

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

und dann das Ergebnis begehen.

+0

Sie können Commits, die nicht neu sind, mit Sicherheit zurücksetzen. Es funktioniert einfach nicht in diesem Fall. – svick

+1

Yuck aber gut gesagt!Wenn die neueste Version von git eine --strategy = Korrektur hat, würde ich gerne wissen, ob nicht, werde ich Ihnen das Häkchen für die Pipe zu 'Patch -R 'schließlich geben. – sabgenton

+0

Ich musste 'patch -R -p1' verwenden, um Dinge (fast) funktionieren zu lassen. Die Ausgabe von 'git show' hat einen Unterschied zwischen' a/file' und 'b/file', der nicht ohne die Option' -p1' angewendet werden kann. Letztendlich haben sich die Dinge so sehr verändert, dass viele der Änderungen in meinem Fall sowieso durch "Patch" abgelehnt wurden, aber ich kann sie aussortieren. – tripleee

Verwandte Themen