In einem meiner Entwicklungszweige habe ich einige Änderungen an meiner Codebasis vorgenommen. Bevor ich die Funktionen, an denen ich arbeitete, fertigstellen konnte, musste ich meinen aktuellen Zweig auf Master umstellen, um einige Funktionen zu testen. Durch die Verwendung eines "Git Checkout-Masters" wurden die Änderungen, die ich auch in meinem Entwicklungszweig vorgenommen habe, beibehalten, wodurch einige der Funktionen im Master beeinträchtigt wurden. Also habe ich die Änderungen in meinem Entwicklungszweig mit einer Festschreibungsnachricht "temporäres Festschreiben" festgeschrieben und dann den Master für die Demo ausgecheckt.
Nachdem ich mit der Demo fertig bin und wieder an meinem Entwicklungszweig arbeite, möchte ich das "temporäre Commit" entfernen, das ich vorgenommen habe, während ich die vorgenommenen Änderungen beibehalten habe. Ist das möglich?
git stash
git stash
ein gutes Werkzeug ist „work in progress“ Wegwerf-Commits sind ein ganz legitimes Gerät auch.git stash
in der Zwischenzeit einen anderen Zweig verwendet habe.stash
ist, dass es vollständig lokal ist und anfällig für Codeverlust durch Repo-Löschung oder Neuerstellung oder Hardwarefehler oder -verlust ist. IMO, es sollte wirklich nur für sehr kurzfristige WIP verwendet werden. Lieben Sie ein WIP-Commit, bevor Sie in den Urlaub fahren: P .. nennen Sie es ein Brain Dump-Commit!Antworten:
So einfach ist das:
Hinweis: Einige Shells werden
^
als Sonderzeichen behandelt (z. B. einige Windows-Shells oder ZSH mit aktiviertem Globbing )."HEAD^"
In diesen Fällen müssen Sie möglicherweise Anführungszeichen setzen .git reset
ohne a--hard
oder--soft
verschiebt IhrenHEAD
to-Punkt auf das angegebene Commit, ohne Dateien zu ändern.HEAD^
bezieht sich auf das (erste) übergeordnete Commit Ihres aktuellen Commits, in Ihrem Fall das Commit vor dem temporären.Beachten Sie, dass eine andere Option darin besteht, wie gewohnt fortzufahren und stattdessen am nächsten Festschreibungspunkt auszuführen:
Dadurch wird stattdessen das letzte Commit bearbeitet , mit dem gleichen Effekt wie oben.
Beachten Sie, dass dies (wie bei fast jeder Git-Antwort) Probleme verursachen kann, wenn Sie das schlechte Commit bereits an einen Ort verschoben haben, an dem es möglicherweise von einer anderen Person abgerufen wurde. Versuche das zu vermeiden
quelle
More?
danach. Was auch immer ich an dieser Eingabeaufforderungfatal: ambiguous argument 'HEADwhateverItypedIn': unknown revision or path not in the working tree.
^
als Sonderzeichen behandelt wird . Sie können entweder die Referenz zitieren"HEAD^"
oder die alternative Syntax ohneHEAD~1
Anführungszeichen verwendengit reset HEAD\^
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
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.
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.
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 vonpick
infixup
odersquash
. Durchfixup
einfaches Verwerfen wird eine Nachricht festgeschrieben und die Änderungen werden mit ihrem unmittelbaren Vorgänger in der Liste zusammengeführt. Dassquash
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.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 ...
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 ...
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.
In Ihrem Fall haben Sie sich ein bisschen mehr um Zweige bewegt, aber die gleiche Idee gilt immer noch.
Hoffe das hilft.
quelle
git config --global alias.uncommit reset HEAD^
Nur Aliase, die nicht zum Zurücksetzen verpflichtet sind. Stattdessen tungit config --global alias.uncommit 'reset HEAD^'
Ich denke du suchst das
git reset --soft HEAD~1
Das letzte Commit wird rückgängig gemacht, während die in diesem Commit vorgenommenen Änderungen für die Bereitstellung beibehalten werden.
quelle
git reset HEAD^
Windows aufrufen, wird nur "Mehr?" - was auch immer das bedeutet^
ist ein Escape-Zeichen in DOS. Wenn es mit einer neuen Zeile gekoppelt ist, dient es als Fortsetzung der Eingabeaufforderung für den vorhergehenden Befehl. Die Eingabegit reset HEAD^^
sollte unter Windows funktionieren.Ja, Sie können Ihr Commit löschen, ohne die Änderungen zu löschen: git reset @ ~
quelle
git reset --soft
odergit reset --keep
?Sie suchen entweder
git reset HEAD^ --soft
odergit reset HEAD^ --mixed
.Es gibt 3 Modi für den Rücksetzbefehl, wie in den Dokumenten angegeben :
git reset HEAD^ --soft
rückgängig machen
git commit
. Änderungen sind noch im Arbeitsbaum (dem Projektordner) + im Index (--cached) vorhanden.git reset HEAD^ --mixed
rückgängig machen
git commit
+git add
. Im Arbeitsbaum sind noch Änderungen vorhandengit reset HEAD^ --hard
Als hätten Sie diese Änderungen nie an der Codebasis vorgenommen. Änderungen wurden vom Arbeitsbaum entfernt.
quelle
Für diejenigen, die zsh verwenden, müssen Sie Folgendes verwenden:
git reset --soft HEAD\^
Hier erklärt: https://github.com/robbyrussell/oh-my-zsh/issues/449
Für den Fall, dass die URL tot wird, ist der wichtige Teil:
quelle
git reset HEAD^
arbeitet in zsh für mich, kann behoben worden sein.zsh 5.3 (x86_64-apple-darwin18.0)
In meinem Fall habe ich schon zum Repo gedrängt. Autsch!
Sie können ein bestimmtes Commit zurücksetzen, während Sie die Änderungen in Ihren lokalen Dateien beibehalten, indem Sie Folgendes tun:
Auf diese Weise konnte ich die Änderungen beibehalten, die ich benötigte, und ein bereits verschobenes Commit rückgängig machen.
quelle
git revert bad-commit-sha
, danngit revert -n revert-commit-just-created-sha
und dann von dort zu reparieren. Du hast mich auf halbem Weg. Vielen Dank!Wenn Sie git 2.9 (genau 2.9.2.windows.1) verwenden, werden Sie
git reset HEAD^
nach mehr gefragt . Ich bin mir nicht sicher, was hier erwartet wird. Bitte sehen Sie unten ScreenshotEs wurde eine andere Lösung gefunden,
git reset HEAD~#numberOfCommits
mit der wir die Anzahl der lokalen Commits auswählen können, die Sie zurücksetzen möchten, indem Sie Ihre Änderungen beibehalten. Daher haben wir die Möglichkeit, alle lokalen Commits sowie eine begrenzte Anzahl lokaler Commits wegzuwerfen.Siehe folgende Screenshots, die
git reset HEAD~1
in Aktion gezeigt werden:quelle
Ein weiterer Weg, es zu tun.
Fügen Sie ein Commit über dem temporären Commit hinzu und führen Sie dann Folgendes aus:
Um zwei Commits zu einem zusammenzuführen (Befehl öffnet eine Textdatei mit expliziten Anweisungen, bearbeiten Sie sie).
quelle
git reset HEAD^
. Git Rebase hat hier viel Raum für Fehler.2020 Einfacher Weg:
(Der Commit-Hash des letzten Commits, den Sie behalten möchten).
Wenn das Commit verschoben wurde, können Sie Folgendes tun:
Sie behalten die jetzt nicht festgeschriebenen Änderungen lokal bei
quelle