Es gibt zwei Möglichkeiten, damit umzugehen. Was einfacher ist, hängt von Ihrer Situation ab
Zurücksetzen
Wenn das Commit, das Sie entfernen möchten, das letzte Commit war und Sie keine zusätzliche Arbeit geleistet haben, können Sie es einfach verwenden git-reset
git reset HEAD^
Bringt Ihren Zweig kurz vor Ihrem aktuellen HEAD zum Commit zurück. Die Dateien in Ihrem Arbeitsbaum werden jedoch nicht geändert. Infolgedessen werden die Änderungen in diesem Commit als geändert angezeigt - es ist wie ein Befehl zum Aufheben der Festschreibung. Tatsächlich habe ich einen Alias, um genau das zu tun.
git config --global alias.uncommit 'reset HEAD^'
Dann können Sie git uncommit
in Zukunft nur noch ein Commit sichern.
Quetschen
Das Quetschen eines Commits bedeutet, zwei oder mehr Commits zu einem zu kombinieren. Ich mache das ziemlich oft. In Ihrem Fall haben Sie eine halbfertige Funktion festgeschrieben, und dann würden Sie sie beenden und erneut mit der richtigen, dauerhaften Festschreibungsnachricht festschreiben.
git rebase -i <ref>
Ich sage oben, weil ich klarstellen möchte, dass dies eine beliebige Anzahl von Commits zurück sein kann. Führen git log
Sie das Commit aus, das Sie entfernen möchten, kopieren Sie das SHA1 und verwenden Sie es anstelle von <ref>
. Git versetzt Sie in den interaktiven Rebase-Modus. Es werden alle Commits zwischen Ihrem aktuellen Status und dem angezeigt, was Sie anstelle von <ref>
. Wenn <ref>
es also 10 Commits her ist, werden Ihnen alle 10 Commits angezeigt.
Vor jedem Commit steht das Wort pick
. Suchen Sie das Commit, das Sie entfernen möchten, und ändern Sie es von pick
in fixup
oder squash
. Durch fixup
einfaches Verwerfen wird eine Nachricht festgeschrieben und die Änderungen werden mit ihrem unmittelbaren Vorgänger in der Liste zusammengeführt. Das squash
Schlüsselwort macht dasselbe, ermöglicht es Ihnen jedoch, die Festschreibungsnachricht des neu kombinierten Festschreibens zu bearbeiten.
Beachten Sie, dass die Festschreibungen in der Reihenfolge erneut festgeschrieben werden, in der sie in der Liste angezeigt werden, wenn Sie den Editor verlassen. Wenn Sie also ein temporäres Commit durchgeführt, dann andere Arbeiten an demselben Zweig ausgeführt und die Funktion in einem späteren Commit abgeschlossen haben, können Sie die Commits mithilfe von rebase neu sortieren und quetschen.
WARNUNG:
Durch erneutes Basieren wird der Verlauf geändert. Führen Sie dies NICHT für Commits durch, die Sie bereits mit anderen Entwicklern geteilt haben.
Verstauen
Um dieses Problem in Zukunft zu vermeiden, sollten Sie in Betracht ziehen, git stash
nicht festgeschriebene Arbeiten vorübergehend zu speichern.
git stash save 'some message'
Dadurch werden Ihre aktuellen Änderungen seitlich in Ihrer Stash-Liste gespeichert. Oben ist die expliziteste Version des Befehls stash aufgeführt, die einen Kommentar enthält, der beschreibt, was Sie verstecken. Sie können auch einfach ausführen git stash
und nichts anderes, aber es wird keine Nachricht gespeichert.
Sie können Ihre Vorratsliste durchsuchen mit ...
git stash list
Dies zeigt Ihnen alle Ihre Verstecke, welche Zweige sie bearbeitet haben, sowie die Nachricht und am Anfang jeder Zeile und die Kennung für diesen Versteck, der so aussieht, stash@{#}
wobei # seine Position im Array der Verstecke ist.
Um einen Stash wiederherzustellen (was in jedem Zweig möglich ist, unabhängig davon, wo der Stash ursprünglich erstellt wurde), führen Sie einfach ...
git stash apply stash@{#}
Wieder gibt es # die Position im Array der Stashes. Wenn sich der Speicher, den Sie wiederherstellen möchten, in der 0
Position befindet, dh wenn es sich um den letzten Speicher handelt. Dann können Sie den Befehl einfach ausführen, ohne die Stash-Position anzugeben. Git geht davon aus, dass Sie die letzte meinen : git stash apply
.
Wenn ich zum Beispiel am falschen Zweig arbeite, kann ich die folgende Befehlsfolge ausführen.
git stash
git checkout <correct_branch>
git stash apply
In Ihrem Fall haben Sie sich ein bisschen mehr um Zweige bewegt, aber die gleiche Idee gilt immer noch.
Hoffe das hilft.
git stash