So beheben, bearbeiten oder rückgängig machen von Git-Commits (Ändern des Git-Verlaufs)

0
201

Der Commit-Verlauf von Git ist unveränderlich (für die meistens) und verfolgen Sie jede Änderung in Ihrem Projekt, damit Sie nie Arbeit verlieren. Manchmal ist es jedoch notwendig, den Git-Verlauf neu zu schreiben, daher bietet Git einige Tools zum Bearbeiten vorhandener Commits.

Neue Änderungen an Commits hinzufügen< /h2>

Der häufigste Anwendungsfall dafür ist, wenn Sie eine Commit-Nachricht erstellen und dann, bevor Sie auf Ihre Fernbedienung übertragen, feststellen, dass Sie einen Fehler gemacht haben und eine kleine Änderung vornehmen müssen. Sie könnten natürlich einfach einen zweiten Commit machen, aber das ist unnötig und zeigt auch allen Ihren Kollegen Ihren dummen Fehler, wenn Sie irgendwann auf die Fernbedienung drücken.

Wenn Sie einfach hinzufügen Änderungen können Sie git commit –amend verwenden. Dadurch wird der letzte Commit geändert und die zusätzlichen Änderungen, die Sie bereitgestellt haben, zusammengeführt.

Zuerst müssen Sie Ihre Änderungen bereitstellen:

git add .

Und dann ändern:

git commit –amend –no-edit

Das Flag –no-edit bewirkt, dass der Befehl die Commit-Nachricht nicht ändert. Wenn Sie die neuen Änderungen in einer neuen Nachricht klären müssen, lassen Sie dieses Flag weg, und Sie werden zur Eingabe der neuen Commit-Nachricht aufgefordert.

Unter der Haube führt der Befehl amend einen neuen Commit mit den zusätzlichen Änderungen durch und ersetzt dann den Quell-Commit in der Git-Historie vollständig. Auf den alten Commit kann immer noch über git reflog zugegriffen werden (mehr dazu weiter unten), aber in Zukunft ist der neue Commit der einzige, der existiert. Wenn Sie auf ein Remote-Repository pushen, können Sie nicht wissen, dass der Commit geändert wurde, es handelt sich um eine rein lokale Änderung.

Werbung

Aus diesem Grund werden Sie nicht Commits ändern möchten, die bereits gepusht wurden, da Sie auf viele Probleme stoßen und zwangsweise auf die Fernbedienung pushen müssen, was für niemanden gut ist.

Nur die Git-Commit-Nachricht ändern

Wenn Sie keine Änderungen vornehmen müssen und nur einen Tippfehler korrigieren möchten, können Sie amend auch ohne Änderungen ausführen:

git commit –amend -m “eine aktualisierte Commit-Nachricht”

Destaging von Änderungen aus Commits

Gits amend-Befehl funktioniert nur, wenn Sie& #8217;Änderungen werden strikt hinzugefügt. Wenn wir sagen “hinzugefügt,” wir meinen nicht nur neue Codezeilen; Das Ändern einer Codezeile bedeutet auch das Hinzufügen von Änderungen. Das Entfernen einer Codezeile oder einer ganzen Datei ist ebenfalls eine Änderung, die hinzugefügt wird, obwohl Daten aus dem Projekt entfernt werden, wenn diese Änderung angewendet wird.

Es gibt jedoch auch Fälle, in denen Sie Änderungen aus Commits entfernen möchten. Angenommen, Sie haben Folgendes ausgeführt:

git add . git commit

Und jede Änderung in Ihrem Repository zu den inszenierten Änderungen hinzugefügt und sie festgeschrieben, bevor Sie bemerkten, “oh Mist! Ich wollte diese eine Datei nicht festschreiben!” In diesem Fall müssen Sie alle Änderungen an das Staging zurücksenden und dann die Dateien, die Sie nicht übertragen möchten, manuell aufheben.

Die Lösung besteht darin, einen Reset durchzuführen, den Commit zu entfernen und die Änderungen zurückzusenden. Es gibt einige Arten von Zurücksetzungen, aber alle beinhalten das Entnehmen von Commits aus dem Git-Verlauf und das Zurücksenden an das Staging, das lokale Verzeichnis oder direkt in den Papierkorb.

Werbung

In diesem Fall ist ein Soft-Reset was Sie wollen, der alle Änderungen zurücksendet zu inszenieren. Sie können die folgende Kurzform verwenden, um auf den Commit hinter dem HEAD zurückzusetzen, andernfalls müssen Sie die Referenz von git reflog abrufen:

git reset –soft HEAD~

Dann müssen Sie die Datei entfernen, die nicht übertragen werden soll. Der Weg, dies zu tun, ist eigentlich auch ein Reset, in diesem Fall ein gemischter Reset für eine bestimmte Datei:

git reset –mixed filename

Das funktioniert, weil das Zurücksetzen dieser einen Datei die Änderungen aus dem Staging entfernt. und es wird nicht festgeschrieben, wenn Sie das Festschreiben wiederholen.

Sie können auch einen gemischten Reset für das gesamte Repository durchführen und alle Dateien mit Ausnahme der nicht gewünschten hinzufügen. Dies ist einfacher, wenn Sie einen GUI-Git-Client verwenden.

Müssen Sie einen Commit rückgängig machen/entfernen? Zurücksetzen verwenden

Das Zurücksetzen eines Commits ist der einfachste Weg, um Änderungen zu entfernen. Grundsätzlich übernimmt es alle Änderungen aus dem Ziel-Commit und wendet das Gegenteil davon an. Wenn Sie eine Datei erstellt haben, wird sie entfernt. Wenn Sie eine Codezeile entfernt haben, wird dieser Code wieder hinzugefügt. Es ist die von Git genehmigte Methode zum “Entfernen” oder “Rückgängig machen” ein Commit, da das Original immer noch im git-Verlauf gespeichert ist.

Um es zu verwenden, führen Sie git log aus, um die Commits anzuzeigen:

git log

Kopieren Sie die Referenz-ID und machen Sie dann den Commit rückgängig:

git revert 62ff517cc7c358eaf0bffdebbbe1b38dea92ba0f

Wenn Sie gerade stecken geblieben sind Drücken Sie in vim Q und führen Sie möglicherweise git config –global core.editor “nano” aus.

Verwenden Sie Rebasing für alles Kompliziertere

Rebasing ist im Wesentlichen eine Methode zum Verschieben von Commits in Ihrem Repository. Anstatt zusammenzuführen, schreibt Rebase den Git-Verlauf neu, um einzelne Commits an einen neuen Speicherort zu verschieben. Die ursprünglichen Commits bleiben hängen und werden aus dem offiziellen Git-Verlauf entfernt, obwohl sie immer noch in git reflog vorhanden sind.

Werbung

Wir werden hier nicht auf die genauen Details eingehen, aber wenn Sie daran interessiert sind, wie es funktioniert, können Sie unseren Leitfaden zur Verwendung von git rebase lesen.

Was ist, wenn du zurück willst?

Zum Glück zeichnet Git jede einzelne Änderung auf, selbst wenn du gegen die Regeln verstößt und den Verlauf neu schreibst.

Jedes Mal, wenn Ihr Branch-Tipp aus irgendeinem Grund aktualisiert wird, speichert Git den Status des Verzeichnisinhalts vor der Aktualisierung im Referenzprotokoll oder Reflog. Sie können das Protokoll mit git reflog anzeigen:

git reflog

Viele davon werden tatsächliche Commits sein, aber es enthält auch andere Änderungen. Wenn Sie zu einer einzelnen Änderung zurückkehren müssen, können Sie einen Hard-Reset durchführen:

git reset –hard fdb9db9

Dies bietet ein nettes Sicherheitsnetz, aber Sie sollten gewarnt sein, dass reflog nur Änderungen verfolgt, die tatsächlich begangen, nicht nur inszeniert, und es verfolgt nur Bewegungen der Astspitze. Darüber hinaus speichert reflog Einträge nur 90 Tage lang. Danach können Sie nur noch auf die tatsächlichen Commits zurücksetzen.