Auf einem lokalen Repo habe ich gerade ausgeführt git cherry-pick SHA
ohne Konflikte oder Probleme ausgeführt. Dann wurde mir klar, dass ich nicht das tun wollte, was ich gerade getan hatte. Ich habe das nirgendwo geschoben.
Wie kann ich nur diesen Kirschpickel entfernen?
Ich würde gerne wissen, ob es einen Weg gibt, dies zu tun:
- wenn ich andere lokale Änderungen habe
- wenn ich keine anderen lokalen Änderungen habe
Vorzugsweise mit einem Befehl für beide Fälle, wenn möglich.
Um Ihr letztes Commit rückgängig zu machen, tun Sie es einfach
git reset --hard HEAD~
.Bearbeiten : Diese Antwort galt für eine frühere Version der Frage, in der die Beibehaltung lokaler Änderungen nicht erwähnt wurde. Die akzeptierte Antwort von Tim ist in der Tat die richtige. Danke an qwertzguy für das Heads Up.
quelle
HEAD
) sind robuster: Betrachten Sie den unglücklichen Fall, in demhead
der Name einer vorhandenen Referenz steht.Vermeiden Sie nach Möglichkeit Hard-Resets. Hard Resets sind eine der wenigen zerstörerischen Operationen in Git. Glücklicherweise können Sie einen Kirschpflücker ohne Zurücksetzen rückgängig machen und alles Zerstörerische vermeiden.
Beachten Sie den Hash der Kirschpickel, die Sie rückgängig machen möchten
${bad_cherrypick}
. Mach agit revert ${bad_cherrypick}
. Jetzt ist der Inhalt Ihres Arbeitsbaums so, wie er vor Ihrem schlechten Kirschbaum war.Wiederholen Sie Ihren Vorgang
git cherry-pick ${wanted_commit}
, und wenn Sie mit dem neuen Kirschpickel zufrieden sind, tun Sie agit rebase -i ${bad_cherrypick}~1
. Löschen Sie während des Rebases beide${bad_cherrypick}
und den entsprechenden Revert.Der Zweig, an dem Sie arbeiten, hat nur den guten Kirschbaum. Keine Resets erforderlich!
quelle
git reflog
kann zu Ihrer Rettung kommen.Geben Sie es in Ihre Konsole ein und Sie erhalten eine Liste Ihres Git-Verlaufs zusammen mit SHA-1, das diese darstellt.
Überprüfen Sie einfach alle SHA-1, zu denen Sie zurückkehren möchten
Bevor wir antworten, fügen wir einige Hintergrundinformationen hinzu und erklären, was dies ist
HEAD
.First of all what is HEAD?
HEAD
ist einfach ein Verweis auf das aktuelle Commit (aktuell) in der aktuellen Verzweigung.Es kann immer nur eine einzige
HEAD
geben. (ohnegit worktree
)Der Inhalt von
HEAD
wird im Inneren gespeichert.git/HEAD
und enthält die 40 Bytes SHA-1 des aktuellen Commits.detached HEAD
Wenn Sie sich nicht im letzten Commit befinden, bedeutet dies, dass
HEAD
auf ein vorheriges Commit in der Geschichte verwiesen wirddetached HEAD
.In der Befehlszeile sieht es so aus: SHA-1 anstelle des Zweignamens, da der
HEAD
nicht auf die Spitze des aktuellen Zweigs zeigtEinige Optionen zur Wiederherstellung nach einem abgetrennten KOPF:
git checkout
Dadurch wird ein neuer Zweig ausgecheckt, der auf das gewünschte Commit verweist.
Dieser Befehl checkt zu einem bestimmten Commit aus.
An diesem Punkt können Sie einen Zweig erstellen und ab diesem Punkt mit der Arbeit beginnen.
git reflog
Sie können das auch immer verwenden
reflog
.git reflog
zeigt jede Änderung an, die das aktualisiert hat,HEAD
und das Auschecken des gewünschten Reflog-Eintrags setztHEAD
diesen Commit zurück.Jedes Mal, wenn der KOPF geändert wird, wird ein neuer Eintrag in der
reflog
Dadurch kehren Sie zu Ihrem gewünschten Commit zurück
git reset --hard <commit_id>
"Bewegen" Sie Ihren HEAD zurück zum gewünschten Commit.
Sie auch das verwenden
git rebase --no-autostash
.git revert <sha-1>
"Rückgängig machen" des angegebenen Commits oder Commit-Bereichs.
Der Befehl zum Zurücksetzen "macht" alle Änderungen rückgängig, die im angegebenen Commit vorgenommen wurden.
Ein neues Commit mit dem Undo-Patch wird festgeschrieben, während das ursprüngliche Commit ebenfalls im Verlauf verbleibt.
Dieses Schema zeigt, welcher Befehl was tut.
Wie Sie dort sehen können,
reset && checkout
ändern Sie dieHEAD
.quelle
git reset --hard
Angesichts des gleichen Problems stellte ich fest, dass Sie die SHA des Kirschpflückers finden, indem Sie Folgendes ausführen, wenn Sie sich seit Ihrem erfolgreichen Kirschpflücken verpflichtet und / oder auf die Fernbedienung verschoben haben und diese entfernen möchten.
git log --graph --decorate --oneline
Dann können Sie (nach
:wq
dem Beenden des Protokolls) den Kirschpflücker mit entfernengit rebase -p --onto YOUR_SHA_HERE^ YOUR_SHA_HERE
wo
YOUR_SHA_HERE
entspricht die 40- oder abgekürzte 7-Zeichen-SHA des von Kirschen gepflückten Commits.Zunächst können Sie Ihre Änderungen nicht weitergeben, da Ihr Remote-Repo und Ihr lokales Repo unterschiedliche Commit-Historien haben. Sie können Ihre lokalen Commits dazu zwingen, die Daten auf Ihrer Fernbedienung durch zu ersetzen
git push --force origin YOUR_REPO_NAME
(Ich habe diese Lösung von Seth Robertson angepasst : Siehe "Entfernen eines gesamten Commits".)
quelle
Ein Befehl und verwendet nicht den destruktiven
git reset
Befehl:GIT_SEQUENCE_EDITOR="sed -i 's/pick/d/'" git rebase -i HEAD~ --autostash
Es lässt einfach das Commit fallen und versetzt Sie genau in den Zustand vor dem Cherry-Pick zurück, selbst wenn Sie lokale Änderungen hatten.
quelle
git reset HEAD^
macht?git reset
macht die Festschreibungsaktion rückgängig, ohne die Änderungen zu löschen . Ich empfehle Ihnen, git-scm.com/docs/git-reset zu lesen . Die Frage von OP ist, einen Kirschbaum rückgängig zu machen. Probieren Sie beide Befehle aus. Mein Befehl versetzt Sie wieder in den Zustand, in dem Sie sich vor dem Kirschpflücken befanden.git reset
wird Ihren Arbeitsbaum durcheinander bringen, da er die von Kirschen gepflückten Änderungen hinterlässt und sie nicht mehr von Ihren bereits vorhandenen lokalen Änderungen zu unterscheiden sind.reset --hard
. Es hinterlässt keine Änderungengit reset --hard
ist ein destruktiver Befehl, der auch nicht verwandte lokale Änderungen entfernt und dies auf nicht wiederherstellbare Weise tut! Das hat das OP also nicht verlangt.sed
Befehl tut, wie sich dieser von der manuellen Ausführung unterscheidet und was er--autostash
tut.