Ich möchte wissen, wie man ein Commit löscht.
Damit delete
meine ich, dass es so ist, als hätte ich dieses Commit nicht durchgeführt, und wenn ich in Zukunft einen Push mache, werden meine Änderungen nicht in den Remote-Zweig übertragen.
Ich lese Git-Hilfe und denke, der Befehl, den ich verwenden sollte, ist git reset --hard HEAD
. Ist das richtig?
git
git-rebase
git-reset
hap497
quelle
quelle
cherry-pick
unddelete
eine einzelne Festschreibung, die möglicherweise vor einiger Zeit stattgefunden hat.git rebase -i HEAD~10
adressiert die Frage, da Sie damit willkürlich Commits zum Löschen auswählen können. Git wendet die Commits in dem von Ihnen angegebenen Bereich einzeln an und ignoriert Commits, die Sie aus dem Protokoll entfernt haben. Ich habe diesen Befehl heute verwendet, um die zweit- und drittletzten Commits für mein Repo zu entfernen und gleichzeitig das oberste beizubehalten. Ich stimme zu, dass keine der anderen Antworten zufriedenstellend ist.Antworten:
Vorsicht:
git reset --hard
LÖSCHT IHRE ÄNDERUNGEN DES ARBEITSVERZEICHNISSES . Stellen Sie sicher, dass Sie alle lokalen Änderungen aufbewahren, die Sie behalten möchten, bevor Sie diesen Befehl ausführen.Angenommen, Sie sitzen auf diesem Commit, dann wird dieser Befehl es wackeln ...
Das
HEAD~1
bedeutet das Festschreiben vor dem Kopf.Sie können sich auch die Ausgabe von ansehen
git log
, die Commit-ID des Commits ermitteln, auf dem Sie eine Sicherungskopie erstellen möchten, und dann Folgendes tun:Wenn Sie es bereits gedrückt haben, müssen Sie einen Kraftdruck ausführen, um es loszuwerden ...
Aber wenn andere haben es, ziehen können, dann wäre es besser , eine Niederlassung zu starten. Denn wenn sie ziehen, wird es einfach in ihre Arbeit integriert, und Sie werden es wieder nach oben schieben.
Wenn Sie bereits gepusht haben, ist es möglicherweise besser
git revert
, ein "Spiegelbild" -Commit zu erstellen, mit dem die Änderungen rückgängig gemacht werden. Beide Commits befinden sich jedoch im Protokoll.Zu
git reset --hard HEAD
Ihrer Information - ist großartig, wenn Sie WORK IN PROGRESS loswerden möchten. Sie werden auf das letzte Commit zurückgesetzt und alle Änderungen in Ihrem Arbeitsbaum und Index gelöscht.Wenn Sie ein Commit suchen müssen, das Sie "gelöscht" haben, ist es normalerweise in vorhanden, es sei
git reflog
denn, Sie haben Ihr Repository durch Müll gesammelt.quelle
HEAD~1
oder einfachHEAD^
. Wenn Sie gedrückt haben, sollten Siegit revert
stattdessen verwenden.HEAD~n
aus "zurückgehen"n
. Vielleicht können Sie ab diesem Punkt... --hard HEAD
auch alsHEAD~0
=> Löschen laufender Arbeiten interpretieren .reset --hard
und überprüfen Sie daslog --oneline --all
, bleiben die Commits weiterhin im Baum. Wie löschen wir diese Commits aus dem Baum? Vielen Dank.reset --soft
diese Option, um das lokale Commit zu löschen, OHNE laufende Arbeiten zurückzusetzen!Wenn Sie das Commit noch nicht an eine beliebige Stelle verschoben haben, können Sie
git rebase -i
dieses Commit entfernen. Stellen Sie zunächst fest, wie weit dieses Commit (ungefähr) zurückliegt. Dann mach:Das
~N
Mittel basiert auf den letztenN
Commits (N
muss zum Beispiel eine Zahl seinHEAD~10
). Anschließend können Sie die Datei bearbeiten, die Git Ihnen vorlegt, um das fehlerhafte Commit zu löschen. Beim Speichern dieser Datei schreibt Git dann alle folgenden Commits neu, als ob die von Ihnen gelöschte nicht vorhanden wäre.Das Git-Buch enthält einen guten Abschnitt zum Umbasieren mit Bildern und Beispielen.
Seien Sie jedoch vorsichtig, denn wenn Sie etwas ändern, das Sie an anderer Stelle gedrückt haben , ist ein anderer Ansatz erforderlich, es sei denn, Sie planen einen Force-Push.
quelle
push -f
, um den Push zu erzwingen und den Remote-Zweig durch Ihren lokalen zu ersetzen. Wenn es nur Ihr eigenes Remote-Repo ist, kein Problem. Der Ärger beginnt, wenn in der Zwischenzeit jemand anderes geholt hat.git rebase -i HEAD~5
Befehl war genau das , was ich brauchte, um dieses Commit vollständig aus meinem lokalen Repo zu entfernen! Vielen Dank!rebase -i
werden die Änderungen, die dem gelöschten Commit entsprechen, nicht beibehalten.Eine andere Möglichkeit ist einer meiner persönlichen Lieblingsbefehle:
Dadurch wird die Rebase im interaktiven Modus
-i
an dem Punkt unmittelbar vor dem Commit gestartet, den Sie schlagen möchten. Der Editor listet seitdem alle Commits auf. Löschen Sie die Zeile mit dem Commit, das Sie löschen möchten, und speichern Sie die Datei. Rebase erledigt den Rest der Arbeit, löscht nur dieses Commit und spielt alle anderen wieder im Protokoll ab.quelle
git rebase --continue
git rebase -i HEAD~1
git rebase -i HEAD~1
hat das Repo wirklich sehr aufgeräumt! Es ist schwer genau zu sagen, was es getan hat, aber das Ganze sieht viel ordentlicher aus. Eigentlich ein bisschen alarmierend.Ich füge diese Antwort hinzu, weil ich nicht verstehe, warum jemand, der gerade versucht hat, Arbeit zu leisten, diese Arbeit wegen eines Fehlers bei der Verwendung von Git löschen möchte!
Wenn Sie Ihre Arbeit behalten und nur diesen Commit-Befehl rückgängig machen möchten (den Sie vor dem Drücken auf Repo abgefangen haben):
Verwenden Sie das Flag --hard nur, wenn Sie Ihre seit dem letzten Commit laufenden Arbeiten zerstören möchten.
quelle
git reset --hard HEAD~1
Ihr letztes Commit per Reflog verfügbar war (bis Sie es ablaufen lassen). siehe auch hier: gitready.com/intermediate/2009/02/09/…Entfernen eines gesamten Commits
Ersetzen Sie "SHA" offensichtlich durch die Referenz, die Sie entfernen möchten. Das "^" in diesem Befehl ist wörtlich.
http://sethrobertson.github.io/GitFixUm/fixup.html#change_deep
quelle
-p, --preserve-merges
Erstellen Sie Zusammenführungs-Commits neu, anstatt den Verlauf zu reduzieren, indem Sie Commits wiedergeben, die durch ein Zusammenführungs-Commit eingeführt werden. Zusammenführungskonfliktlösungen oder manuelle Änderungen zum Zusammenführen von Commits bleiben nicht erhalten.Wenn Sie keine Änderungen veröffentlicht haben, können Sie dies tun, um das letzte Commit zu entfernen
(Beachten Sie, dass dadurch auch alle nicht festgeschriebenen Änderungen entfernt werden; vorsichtig verwenden).
Wenn Sie bereits ein Commit zum Löschen veröffentlicht haben, verwenden Sie git revert
quelle
tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'
Angenommen, wir möchten die Commits 2 und 4 aus dem Repo entfernen.
Hinweis: Sie müssen über Administratorrechte für das Repo verfügen, da Sie
--hard
und verwenden-f
.git checkout b3d92c5
Überprüfen Sie das letzte verwendbare Commit.git checkout -b repair
Erstellen Sie einen neuen Zweig, an dem Sie arbeiten möchten.git cherry-pick 77b9b82
Führen Sie Commit 3 durch.git cherry-pick 2c6a45b
Führen Sie Commit 1 durch.git checkout master
Kasse Master.git reset --hard b3d92c5
Setzen Sie den Master auf das letzte verwendbare Commit zurück.git merge repair
Führen Sie unseren neuen Zweig auf Master zusammen.git push -f origin master
Schieben Sie den Master zum Remote-Repo.quelle
git push -f origin master
dass es keine Option gibt--hard
commit 0
ist älter alscommit 1
. Könnten Sie mir bitte sagen, warum Sie zuerst durchcommit 3
(mit Kirschbaum) und dann durchcommit 1
? Nach dem Auscheckenb3d92cd
(commit 0
) würde ich erwarten , herauspickencommit 1
, danncommit 3
. Vielen Dank.PS: CommitId bezieht sich auf diejenige, auf die Sie zurückgreifen möchten
quelle
Ändern Sie die Geschichte mit Nachdruck
Angenommen, Sie möchten nicht nur das letzte Commit löschen, sondern auch bestimmte Commits der letzten n Commits löschen, gehen Sie wie folgt vor:
git rebase -i HEAD~<number of commits to go back>
, damitgit rebase -i HEAD~5
, wenn Sie die letzten fünf Commits sehen wollen.Ändern Sie dann im Texteditor das Wort
pick
indrop
neben jeder begehen würden Sie entfernen möchten. Speichern Sie den Editor und beenden Sie ihn. Voila!Additiv den Verlauf ändern
Versuchen Sie es
git revert <commit hash>
. Durch Zurücksetzen wird ein neues Commit erstellt, das das angegebene Commit rückgängig macht.quelle
drop
Schlüsselwort ist nicht definiert. Um ein Commit zu löschen, entfernen Sie einfach die gesamte Zeile.Wenn Sie Ihr letztes Commit reparieren möchten, können Sie das Commit rückgängig machen und die darin enthaltenen Dateien entfernen, indem Sie Folgendes tun:
Dadurch wird Ihr Repository in den Status zurückgesetzt, bevor der Befehl git add die Dateien bereitstellt. Ihre Änderungen befinden sich in Ihrem Arbeitsverzeichnis. HEAD ~ 1 bezieht sich auf das Commit unterhalb der aktuellen Spitze des Zweigs.
Wenn Sie N Commits aufheben möchten, aber die Codeänderungen in Ihrem Arbeitsverzeichnis behalten möchten:
Wenn Sie Ihr letztes Commit entfernen und die Codeänderungen nicht beibehalten möchten, können Sie einen "Hard" -Reset durchführen.
Wenn Sie die letzten N Commits verwerfen und die Codeänderungen nicht beibehalten möchten:
quelle
Hier ist '2' die Anzahl der Commits, die Sie neu aufbauen möchten.
Wenn Sie alle Commits neu starten möchten.
Dann können Sie eine dieser Optionen auswählen.
p, pick = use commit
r, reword = use commit, but edit the commit message
e, edit = use commit, but stop for amending
s, squash = use commit, but meld into previous commit
f, fixup = like "squash", but discard this commit's log message
x, exec = run command (the rest of the line) using shell
d, drop = remove commit
Diese Zeilen können nachbestellt werden. Sie werden von oben nach unten ausgeführt. Wenn Sie hier eine Zeile entfernen, wird dieses Commit verloren gehen. Wenn Sie jedoch alles entfernen, wird die Rebase abgebrochen. Beachten Sie, dass leere Commits auskommentiert sind
Sie können dieses Commit einfach mit der Option "d" oder "Entfernen einer Zeile mit Ihrem Commit" entfernen.
quelle
Verwenden Sie zum Löschen in einem lokalen Zweig
Verwenden Sie zum Löschen in einem Remote-Zweig
quelle
[Schnelle Antwort]
Sie haben viele Alternativen, zum Beispiel:
Alternative 1:
Alternative 2:
Alternative 3:
quelle
Quelle: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
Löschen Sie das letzte Commit
Zum Beispiel Ihr letztes Commit
Git Push Origin + aa61ab32 ^: Master
Jetzt möchten Sie dieses Commit löschen und dann auf einfache Weise Folgendes tun
Schritte
Setzen Sie zuerst den Zweig auf das übergeordnete Element des aktuellen Commits zurück
Drücken Sie es mit Gewalt auf die Fernbedienung.
Für ein bestimmtes Commit, das Sie zurücksetzen möchten, folgt Folgendes
quelle
Hier ist eine andere Möglichkeit, dies zu tun:
Überprüfen Sie den Zweig, den Sie zurücksetzen möchten, und setzen Sie dann Ihre lokale Arbeitskopie auf das Commit zurück, das Sie als letztes auf dem Remote-Server verwenden möchten (alles, was danach passiert, wird auf Wiedersehen). Dazu habe ich in SourceTree mit der rechten Maustaste auf "BRANCHNAME auf dieses Commit zurücksetzen" geklickt und ausgewählt. Ich denke, die Kommandozeile lautet:
Da Sie gerade Ihren Zweig von der Fernbedienung ausgecheckt haben, müssen Sie keine lokalen Änderungen vornehmen, um sich Sorgen über den Verlust zu machen. Aber das würde sie verlieren, wenn du es tust.
Navigieren Sie dann zum lokalen Verzeichnis Ihres Repositorys und führen Sie den folgenden Befehl aus:
Dadurch werden alle Commits nach dem aktuellen in Ihrem lokalen Repository gelöscht, jedoch nur für diesen einen Zweig.
quelle
Der Fehler:
Ich habe
git rebase -i --root
meinen Zweig bearbeitet und unwissentlich gedacht, ich könnte das erste vom Master abweichende Commit umformulieren (die Standardansicht von GitHub für Windows ist der Vergleich mit dem Master, wobei die Gesamtheit ausgeblendet wird ).Ich habe mir einen Silicon Valley Bart wachsen lassen, während sich mehr als 900 Commits in Sublime geladen haben. Nachdem ich ohne Änderungen beendet hatte, lud ich meinen Akku auf und rasierte mich weiter, da alle über 900 einzelnen Commits nonchalant neu basiert wurden und die Commit-Zeiten auf jetzt zurückgesetzt wurden.
Entschlossen, Git zu schlagen und die ursprünglichen Zeiten beizubehalten, habe ich dieses lokale Repository gelöscht und von der Fernbedienung neu geklont.
Jetzt hatte es ein letztes nicht benötigtes Commit für Master, das ich entfernen wollte, wieder hinzugefügt, also ging es so weiter.
Erschöpfung der Möglichkeiten:
Ich wollte nicht
git revert
- es würde ein zusätzliches Commit erzeugen und Git die Oberhand geben.git reset --hard HEAD
tat nichts, nachdem ich das überprüft hattereflog
, das letzte und einzigeHEAD
war der Klon - Git gewinnt.Um die neueste SHA zu erhalten, habe ich das Remote-Repository auf github.com überprüft - kleiner Gewinn.
Nachdem das Denken
git reset --hard <SHA>
funktioniert hatte, aktualisierte ich einen anderen Zweig auf Master und 1 ... 2 ... Poof! Das Commit war zurück - Git gewinnt.Auschecken zum Master, Zeit zum Ausprobieren
git rebase -i <SHA>
, dann Entfernen der Leitung ... ohne Erfolg, traurig zu sagen. " Wenn Sie hier eine Zeile entfernen, wird dieses Commit verloren gehen ". Ah ... beschönigte das neue Feature des n00b in den Versionshinweisen zu 2.8.3 .Die Lösung:
git rebase -i <SHA>
dannd, drop = remove commit
.Um dies zu überprüfen, habe ich in einem anderen Zweig ausgecheckt und voila - kein verstecktes Commit zum Abrufen / Ziehen vom Master.
https://twitter.com/holman/status/706006896273063936
Guten Tag Ihnen.
quelle
Alle oben genannten Befehle stellen den Status Ihres Arbeitsbaums und Index wieder her, wie sie vor dem Festschreiben waren, stellen jedoch den Status des Repositorys nicht wieder her. Wenn Sie es sich ansehen, wird das "entfernte" Commit nicht tatsächlich entfernt, es ist einfach nicht das an der Spitze des aktuellen Zweigs.
Ich denke, dass es keine Möglichkeit gibt, ein Commit mit Porzellanbefehlen zu entfernen . Die einzige Möglichkeit besteht darin, es aus dem Protokoll zu entfernen und erneut zu protokollieren und dann a auszuführen
git prune --expire -now
.quelle
git prune
ist eigentlich einer der "Porzellan" -Befehle . Es ist auch selten, dass Sie Ihr Reflog vollständig löschen möchten (ein Anwendungsfall besteht darin, vertrauliche Informationen aus Ihrem Repo zu entfernen, aber wie gesagt, das ist ein seltener Anwendungsfall). In den meisten Fällen möchten Sie alte Commits im Reflog beibehalten, falls Sie Daten wiederherstellen müssen. Siehe Pro Git: 9.7 Git Internals - Wartung und Datenwiederherstellung .Wenn Sie den Verlauf beibehalten und das Commit und das Zurücksetzen anzeigen möchten, sollten Sie Folgendes verwenden:
Geben Sie die Nachricht ein, in der erläutert wird, warum Sie zurückkehren, und dann:
Wenn Sie ein Problem ausgeben
git log
, werden sowohl das "falsche" Festschreiben als auch das Zurücksetzen von Protokollnachrichten angezeigt.quelle
Wenn Sie gerade Ihr letztes Commit durcheinander gebracht haben (falsche Nachricht, einige Änderungen vergessen) und es beheben möchten, bevor Sie es an ein öffentliches Repo senden, warum nicht:
Wenn Sie neu bereitgestellte Änderungen vorgenommen haben, werden diese mit dem letzten Commit (das Sie entfernen möchten) kombiniert und ersetzen dieses Commit.
Wenn Sie ein Commit ändern, nachdem Sie es verschoben haben, schreiben Sie natürlich den Verlauf neu. Wenn Sie dies tun, müssen Sie die Auswirkungen verstehen.
Sie können auch die Option '--no-edit' anstelle von '-m' übergeben, wenn Sie die Nachricht des vorherigen Commits verwenden möchten.
Dokumente: http://git-scm.com/docs/git-commit.html
quelle
Wenn Sie bereits gepusht haben, suchen Sie zuerst das gewünschte Commit bei HEAD ($ GIT_COMMIT_HASH_HERE) und führen Sie dann Folgendes aus:
Führen Sie dann an jeder Stelle, an der das Repo geklont wurde, Folgendes aus:
quelle
Was ich normalerweise mache, wenn ich ein Commit mache und pushe (wenn jemand sein Commit drückt, löst dies das Problem):
Ich hoffe das hilft
quelle
Ich habe schon geschoben. Einige Commits müssen remote zurückgegeben werden. Habe viele Variationen ausprobiert, aber nur das von Justin via Git Bush funktioniert gut für mich:
quelle
Auf lokalen Zweig zurücksetzen
Force Push to Origin
quelle
Erstellen Sie eine Sicherungskopie Ihres Codes im temporären Ordner. Der folgende Befehl wird wie der Server zurückgesetzt.
Wenn Sie Ihre Änderungen beibehalten und die letzten Commits entfernen möchten
quelle
Referenz: So löschen Sie ein Commit in git, local und remote
quelle
Wie Sie auf dem obigen Bild sehen können, möchte ich das Festschreiben " Teständerung 2" löschen (SHA1-ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (Sie können die SHA1-ID mit dem
gitk
Befehl in git bash erhalten)).Dafür kann ich verwenden (alle folgenden Befehle funktionieren nur auf lokaler Ebene. Sie müssen nach dem Löschen pushen):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
// Es sichert Sie bei diesem Commit (SHA1-ID des Commits für Teständerung 4 lautet 515b5220c50e3dfbb1063f23789d92ae1d3481a2 ).git reset --hard HEAD~1
// es sichert dich vor einem Commit.git reset --hard HEAD^
// Um das letzte Commit von git zu entfernennach dem Löschen:
quelle
git reset --hard HEAD~1
Sie werden jetzt am vorherigen Kopf sein. Ziehen Sie den Ast. Neuen Code drücken. Commit wird aus git entfernt
quelle
git reset --hard
Git Push Origin HEAD --force
Wenn eines oder mehrere der Commits markiert sind, löschen Sie zuerst die Tags. Andernfalls wird das getaggte Commit nicht entfernt.
quelle
Verwenden Sie git revert https://git-scm.com/docs/git-revert. Es wird der gesamte Code zurückgesetzt, dann können Sie das nächste Commit ausführen. Dann zeigt head auf das letzte Commit. Zurückgesetzte Commits werden niemals gelöscht, haben jedoch keine Auswirkungen auf Ihr letztes Commit.
quelle
In meinem Fall ist mein magischer Code für diesen Schüler dieser:
Teste es und sag es mir. Ich habe ein paar verschiedene ausprobiert, aber diese war die einzige, die mir geholfen hat.
quelle