Git
Verhängnis
Suche…
Zusammenführen rückgängig machen
Rückgängigmachen einer Zusammenführung noch nicht auf eine Fernbedienung verschoben
Wenn Sie Ihre Zusammenführung noch nicht in das Remote-Repository gepusht haben, können Sie dasselbe Verfahren wie beim Zurücknehmen des Commits ausführen, auch wenn einige geringfügige Unterschiede bestehen.
Ein Reset ist die einfachste Option, da sowohl das Merge-Commit als auch das Commit aus dem Zweig rückgängig gemacht werden. Sie müssen jedoch wissen, auf was SHA zurückgesetzt werden muss. Dies kann schwierig sein, da in Ihrem git log
jetzt Commits aus beiden Zweigen git log
werden. Wenn Sie auf das falsche Commit zurücksetzen (z. B. ein anderes auf dem anderen Zweig) , kann dies die festgelegte Arbeit zerstören.
> git reset --hard <last commit from the branch you are on>
Oder nehmen Sie an, die Verschmelzung war Ihre letzte Zusage.
> git reset HEAD~
Ein Revert ist sicherer, da es die festgelegte Arbeit nicht zerstört, sondern mehr Arbeit erfordert, da Sie den Revert rückgängig machen müssen, bevor Sie den Zweig wieder zusammenführen können (siehe nächster Abschnitt).
Rückgängigmachen einer Zusammenführung wurde auf eine Fernbedienung verschoben
Angenommen, Sie führen ein neues Feature zusammen (add-gremlins)
> git merge feature/add-gremlins
...
#Resolve any merge conflicts
> git commit #commit the merge
...
> git push
...
501b75d..17a51fd master -> master
Anschließend stellen Sie fest, dass das Feature, mit dem Sie gerade zusammengefügt wurden, das System für andere Entwickler brach, es muss sofort rückgängig gemacht werden. Die Korrektur des Features selbst dauert zu lange, sodass Sie die Zusammenführung einfach rückgängig machen möchten.
> git revert -m 1 17a51fd
...
> git push
...
17a51fd..e443799 master -> master
Zu diesem Zeitpunkt sind die Gremlins nicht im System und Ihre Entwickler haben aufgehört, Sie anzuschreien. Wir sind jedoch noch nicht fertig. Wenn Sie das Problem mit der Add-Gremlins-Funktion behoben haben, müssen Sie diese Zurücknahme rückgängig machen, bevor Sie sie wieder zusammenführen können.
> git checkout feature/add-gremlins
...
#Various commits to fix the bug.
> git checkout master
...
> git revert e443799
...
> git merge feature/add-gremlins
...
#Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push
Jetzt ist Ihre Funktion erfolgreich hinzugefügt. In Anbetracht der Tatsache, dass Fehler dieses Typs häufig durch Zusammenführungskonflikte verursacht werden, ist ein etwas anderer Arbeitsablauf manchmal hilfreicher, da Sie den Zusammenführungskonflikt in Ihrem Zweig beheben können.
> git checkout feature/add-gremlins
...
#Merge in master and revert the revert right away. This puts your branch in
#the same broken state that master was in before.
> git merge master
...
> git revert e443799
...
#Now go ahead and fix the bug (various commits go here)
> git checkout master
...
#Don't need to revert the revert at this point since it was done earlier
> git merge feature/add-gremlins
...
#Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push
Reflog verwenden
Wenn Sie eine Rebase vermasseln, besteht die Möglichkeit, erneut zu beginnen, zum Commit (Pre-Rebase). Sie können dies mit reflog
tun (das enthält den Verlauf reflog
die Sie in den letzten 90 Tagen erstellt haben - dies kann konfiguriert werden):
$ git reflog
4a5cbb3 HEAD@{0}: rebase finished: returning to refs/heads/foo
4a5cbb3 HEAD@{1}: rebase: fixed such and such
904f7f0 HEAD@{2}: rebase: checkout upstream/master
3cbe20a HEAD@{3}: commit: fixed such and such
...
Sie können das Festschreiben sehen, bevor die Rebase HEAD@{3}
(Sie können den Hash auch auschecken):
git checkout HEAD@{3}
Jetzt erstellen Sie einen neuen Zweig / löschen den alten Zweig / versuchen Sie es erneut.
Sie können auch direkt auf einen Punkt in Ihrem reflog
zurücksetzen. reflog
Sie reflog
jedoch nur, wenn Sie zu 100% sicher sind, dass Sie das tun möchten:
git reset --hard HEAD@{3}
Dadurch wird der aktuelle Git-Baum so eingestellt, dass er zu dem Zeitpunkt passt, an dem er sich zu diesem Zeitpunkt befand (siehe Änderungen rückgängig machen).
Dies kann verwendet werden, wenn Sie vorübergehend sehen, wie gut ein Zweig funktioniert, wenn er auf einen anderen Zweig umgestaltet wird, die Ergebnisse jedoch nicht beibehalten werden sollen.
Rückkehr zu einem vorherigen Commit
Um zu einem vorherigen Commit zurückzukehren, suchen Sie zunächst den Hash des Commits mithilfe von git log
.
Um vorübergehend zu diesem Commit zurückzukehren, entfernen Sie Ihren Kopf mit:
git checkout 789abcd
Dies bringt Sie zur 789abcd
. Sie können jetzt zusätzlich zu diesem alten Commit neue Commits vornehmen, ohne den Zweig zu beeinflussen, in dem sich Ihr Kopf befindet. Alle Änderungen können mit branch
oder checkout -b
in einen richtigen Zweig geändert werden.
So gehen Sie zu einem vorherigen Commit zurück und behalten die Änderungen bei:
git reset --soft 789abcd
So machen Sie den letzten Commit rückgängig:
git reset --soft HEAD~
Um nach einem bestimmten Commit vorgenommene Änderungen dauerhaft zu verwerfen, verwenden Sie:
git reset --hard 789abcd
Änderungen, die nach dem letzten Commit vorgenommen wurden, dauerhaft verwerfen:
git reset --hard HEAD~
Achtung: Während Sie die verworfenen Commits mithilfe von reflog
und reset
wiederherstellen können, können nicht reflog
Änderungen nicht wiederhergestellt werden. Verwenden Sie git stash; git reset
statt git reset --hard
um sicher zu gehen.
Änderungen rückgängig machen
Machen Sie Änderungen an einer Datei oder einem Verzeichnis in der Arbeitskopie rückgängig.
git checkout -- file.txt
Wird über alle Dateipfade rekursiv aus dem aktuellen Verzeichnis verwendet, werden alle Änderungen in der Arbeitskopie rückgängig gemacht.
git checkout -- .
Um nur Teile der Änderungen rückgängig zu machen, verwenden Sie --patch
. Sie werden für jede Änderung gefragt, ob sie rückgängig gemacht werden soll oder nicht.
git checkout --patch -- dir
Änderungen rückgängig machen, die dem Index hinzugefügt wurden.
git reset --hard
Ohne das Flag --hard
wird ein Soft-Reset durchgeführt.
Mit lokalen Commits, die Sie noch auf eine Fernbedienung verschieben müssen, können Sie auch einen Soft-Reset durchführen. Sie können also die Dateien und dann die Commits überarbeiten.
git reset HEAD~2
Das obige Beispiel würde Ihre letzten beiden Commits abwickeln und die Dateien in Ihre Arbeitskopie zurückbringen. Sie können dann weitere Änderungen und neue Commits vornehmen.
Achtung: Bei allen diesen Vorgängen werden Ihre Änderungen mit Ausnahme von Soft-Resets dauerhaft gelöscht. Verwenden Sie für eine sicherere Option git stash -p
bzw. git stash
. Sie können später mit stash pop
rückgängig machen oder mit stash drop
für immer löschen.
Wiederherstellen einiger vorhandener Commits
Verwenden Sie git revert, um vorhandene Commits rückgängig zu machen, insbesondere wenn diese Commits in ein Remote-Repository verschoben wurden. Es zeichnet einige neue Commits auf, um den Effekt einiger früherer Commits umzukehren, die Sie ohne Umschreiben des Verlaufs sicher verschieben können.
Verwenden Sie keine git push --force
, wenn Sie die opprobrium aller anderen Nutzer dieses Repository bringen möchten. Schreiben Sie niemals öffentliche Geschichte neu.
Wenn Sie beispielsweise gerade einen Commit mit einem Fehler nach oben verschoben haben und ihn zurücksetzen müssen, gehen Sie wie folgt vor:
git revert HEAD~1
git push
Jetzt können Sie das Zurücksetzungs-Commit lokal rückgängig machen, Ihren Code korrigieren und den guten Code pushen:
git revert HEAD~1
work .. work .. work ..
git add -A .
git commit -m "Update error code"
git push
Wenn das Commit, das Sie zurücksetzen möchten, bereits weiter hinten in der Historie ist, können Sie einfach den Commit-Hash übergeben. Git erstellt ein Gegen-Commit, um Ihr ursprüngliches Commit rückgängig zu machen, das Sie sicher auf Ihre Fernbedienung verschieben können.
git revert 912aaf0228338d0c8fb8cca0a064b0161a451fdc
git push
Eine Reihe von Commits rückgängig machen / wiederholen
Angenommen, Sie möchten ein Dutzend Commits rückgängig machen und nur einige davon.
git rebase -i <earlier SHA>
-i versetzt Rebase in den "interaktiven Modus". Es fängt wie die oben diskutierte Rebase an, aber bevor Commits erneut abgespielt werden, wird sie angehalten und Sie können jedes Commit während der Wiedergabe sanft ändern. rebase -i
wird in Ihrem Standard-Texteditor geöffnet, und eine Liste von Commits wird angewendet:
Um ein Commit zu löschen, löschen Sie einfach diese Zeile in Ihrem Editor. Wenn Sie die fehlerhaften Commits nicht mehr in Ihrem Projekt verwenden möchten, können Sie die obigen Zeilen 1 und 3-4 löschen. Wenn Sie zwei Commits miteinander kombinieren möchten, können Sie die Befehle squash
oder fixup