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: Geben Sie hier die Bildbeschreibung ein

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 Geben Sie hier die Bildbeschreibung ein



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow