2012-07-14 8 views
14

Wenn ich versehentlich eine Datei an die falsche Verzweigung übergeben habe, verwende ich normalerweise git reset --hard HEAD~1. Bei der Verwendung dieser Methode verliere ich jedoch generell alle festgeschriebenen Dateien. Gibt es eine Möglichkeit, ein Commit zurückzusetzen, ohne die bearbeiteten Dateien zu verlieren?Zurücksetzen, ohne bereits festgeschriebene Dateien zu verlieren

Antwort

25

nicht verwenden --hard verwenden Sie stattdessen --soft.

Wenn Sie also Ihre neuesten entfernen möchten commit Sie tun würde:

git reset --soft HEAD^

+0

@cherrun, auch über das Lesen [Reset Demystified] (http://git-scm.com/2011/07/11/reset.html). – kostix

+0

+1 für eine kurze und genaue Antwort. Zusammenfassend verwenden Sie: 'git reset --soft HEAD ~ 1' – VarunPandey

5

Während Alex sehr korrekt ist, könnte ich versucht sein, eine andere Reihenfolge versuchen:

Wenn ich wollte commit auf einem noch-zu-sein-geboren Zweig:

git branch newbranch 
git reset --hard HEAD^ 

Wenn ich das Commit auf einem bestehenden Zweig wollte:

git checkout otherbranch 
git cherry-pick firstbranch 
git checkout firstbranch 
git reset --hard HEAD^ 

Das vollständige Beispiel für die Antwort von Alex

git reset --soft HEAD^ 
git checkout otherbranch 
git commit -am "Message" 

Hinweis das letzte Beispiel schlecht ausfallen wird, wenn der Versuch der Wechsel in den anderen Zweig zu „schweben“ aufgrund von Konflikten fehlschlägt. Sie müssen dann stash/checkout/anwenden, um in Konfliktlösung zu gelangen.

+1

große Antwort! Ich denke, es geht darum, nur einige Änderungen wegzuwerfen, die beim letzten Commit gemacht wurden und die andere Hälfte behalten. In diesem Fall würden Sie das Commit einfach wegwerfen und die Änderungen, die Sie behalten möchten, erneut hinzufügen. In diesem Fall könnte "git add --interactive" auch nützlich sein! – Alex