Löschen Sie Commits aus einem Zweig in Git

3233

Ich möchte wissen, wie man ein Commit löscht.

Damit deletemeine 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?

hap497
quelle
41
Ich denke, dies ist kein Duplikat von Git, das das letzte Commit rückgängig macht, da gefragt wird, wie ein Commit aus einem Zweig gelöscht werden soll . Ich denke auch, dass keine der Antworten diese Frage tatsächlich anspricht. Sie alle spulen die letzten Festschreibungen zurück, nicht cherry-pickund deleteeine einzelne Festschreibung, die möglicherweise vor einiger Zeit stattgefunden hat.
Chris
12
@Chris, die Antwort mit git rebase -i HEAD~10adressiert 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.
MST
@ MST ja, ich hätte sagen sollen, keine der Optionen in der akzeptierten Antwort adressieren diese Frage, aber Sie haben absolut Recht - dieser Befehl scheint zu funktionieren
Chris

Antworten:

4126

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 ...

git reset --hard HEAD~1

Das HEAD~1bedeutet 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:

git reset --hard <sha1-commit-id>

Wenn Sie es bereits gedrückt haben, müssen Sie einen Kraftdruck ausführen, um es loszuwerden ...

git push origin HEAD --force

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 HEADIhrer 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 reflogdenn, Sie haben Ihr Repository durch Müll gesammelt.

gahooa
quelle
59
HEAD~1oder einfach HEAD^. Wenn Sie gedrückt haben, sollten Sie git revertstattdessen verwenden.
Jakub Narębski
13
Natürlich können Sie auch Commits von Ihrem Kopf HEAD~naus "zurückgehen" n. Vielleicht können Sie ab diesem Punkt ... --hard HEADauch als HEAD~0=> Löschen laufender Arbeiten interpretieren .
Nuala
13
@ Beamrider9 Imho Git Rebase ist fast immer der bessere Weg, um Commits zu löschen (wie in Greg Hewgills Antwort beschrieben) - nicht zuletzt, weil Rebase tatsächlich eine große Warnung enthält, dass Sie Sachen 4realz löschen werden.
Noah Sussman
20
Dadurch werden jedoch keine Änderungen aus dem Festschreibungsbaum gelöscht. Das OP bat um ein bereits gemachtes Commit. Wenn Sie reset --hardund überprüfen Sie das log --oneline --all, bleiben die Commits weiterhin im Baum. Wie löschen wir diese Commits aus dem Baum? Vielen Dank.
iGbanam
17
Verwenden Sie reset --softdiese Option, um das lokale Commit zu löschen, OHNE laufende Arbeiten zurückzusetzen!
704

Wenn Sie das Commit noch nicht an eine beliebige Stelle verschoben haben, können Sie git rebase -idieses Commit entfernen. Stellen Sie zunächst fest, wie weit dieses Commit (ungefähr) zurückliegt. Dann mach:

git rebase -i HEAD~N

Das ~NMittel basiert auf den letzten NCommits ( Nmuss zum Beispiel eine Zahl sein HEAD~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.

Greg Hewgill
quelle
2
Hinweis: Wenn Sie zufällig --no-ff-Zusammenführungen in diesem letzten Stapel von Commits haben, werden diese durch Rebase geschlachtet :( Dies wird unter -p auf dieser Seite erwähnt . Das Problem ist, wenn Sie -i durch -p ersetzen, Sie erhalten nicht mehr das Popup mit der Auswahl für "Bearbeiten Sie dieses Commit, sqush das eine", etc. usw. Kennt jemand die Lösung?
Bukov
4
Was ist, wenn Sie es geschoben haben? (Nur ich benutze das Remote Repo)
Costa
6
@Costa können Sie verwenden 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.
Greg Hewgill
3
Ich habe eine Datendatei hinzugefügt und festgeschrieben, die für GitHub zu groß war (ja, sie sollte wahrscheinlich sowieso nicht im Quell-Repo enthalten sein; na ja). Als ich versuchte zu pushen, lehnte GitHub wegen der zu großen Datei ab. Alles, was ich tun wollte, war, dieses eine Commit rückgängig zu machen und ein paar andere nicht verwandte Commits zu speichern, die folgten. Der git rebase -i HEAD~5Befehl war genau das , was ich brauchte, um dieses Commit vollständig aus meinem lokalen Repo zu entfernen! Vielen Dank!
Aldo
4
@dumbledad: Mit rebase -iwerden die Änderungen, die dem gelöschten Commit entsprechen, nicht beibehalten.
Greg Hewgill
517

Eine andere Möglichkeit ist einer meiner persönlichen Lieblingsbefehle:

git rebase -i <commit>~1

Dadurch wird die Rebase im interaktiven Modus -ian 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.

1800 INFORMATIONEN
quelle
3
thx, übrigens, wenn Sie auf irgendwelche Probleme stoßen (wie leere Commits), die Sie verwenden könnengit rebase --continue
realgt
8
Noch einfacher: git rebase -i HEAD~1
mmell
2
Wowzers. git rebase -i HEAD~1hat 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.
Charles Wood
7
Ich denke, es ist erwähnenswert, dass das Commit nicht ausgelöscht, sondern lediglich von der Liste gestrichen wird. Wenn Sie es vermasseln, können Sie das Commit mithilfe des Reflogs zurückerhalten .
Zaz
6
Entspricht das Löschen der Zeile d / drop?
Leo
344

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):

git reset --soft HEAD~1

Verwenden Sie das Flag --hard nur, wenn Sie Ihre seit dem letzten Commit laufenden Arbeiten zerstören möchten.

rauben
quelle
5
Hier ist ein Beispiel dafür, warum: Sie erledigen eine kleine Arbeit auf einem Entwicklungsserver, den Sie festschreiben. Dann stellt sich heraus, dass dieser Server keinen ausgehenden HTTPS-Zugriff hat, sodass Sie das Commit nirgendwo verschieben können. Am einfachsten tun Sie einfach so, als wäre es nie passiert, und wiederholen den Patch von Ihrem lokalen Computer.
Steve Bennett
1
@KarthikBose würde es immer das Reflog geben. Auch nachdem git reset --hard HEAD~1Ihr letztes Commit per Reflog verfügbar war (bis Sie es ablaufen lassen). siehe auch hier: gitready.com/intermediate/2009/02/09/…
Codierung
4
Vielen Dank. Diese Antwort sollte höher eingestuft oder in der akzeptierten Antwort enthalten sein. Commit löschen! = Commit zurücksetzen.
Alsciende
2
@RandolphCarter: Sie werden dennoch alle nicht festgeschriebenen Änderungen verlieren.
naught101
7
@Rob, ein Beispiel ist, wenn Sie versehentlich eine Datei festschreiben, die ein Geheimnis enthält (z. B. ein Passwort), das niemals in der Quellcodeverwaltung sein sollte. Das lokale Commit muss zerstört und nicht nur rückgängig gemacht werden, damit es niemals auf den Server übertragen wird.
Bob Meyers
142

Entfernen eines gesamten Commits

git rebase -p --onto SHA^ SHA

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

raittes
quelle
26
Wie kann ich diese Antwort besser bewerten? Die anderen Lösungen zeigen nur, wie man es interaktiv macht oder die Top-Commits entfernt.
Ribamar
5
-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.
raittes
5
Dies ist die wirklich genaue Antwort
Hamman Samuel
9
Es heißt "SHA durch die Referenz ersetzen, die Sie entfernen möchten", aber die Zeile enthält zweimal SHA. Hier ist was ich getan habe. git rebase -p --onto 5ca8832c120 ^ 5ca8832c120 Aber nichts hat sich geändert. Soll ich zweimal denselben SHA verwenden? Wenn nicht, welche SHA soll dann das Commit entfernt werden und welche soll die andere SHA sein?
Rubicksman
3
WOW, es hat einwandfrei funktioniert! Dies sollte die akzeptierte Antwort sein!
Liran H
51

Wenn Sie keine Änderungen veröffentlicht haben, können Sie dies tun, um das letzte Commit zu entfernen

$ git reset --hard HEAD^

(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

$ git revert HEAD
Jakub Narębski
quelle
Das hat nicht funktioniert. Wenn ich mich anmelde, ist immer noch alles da, egal warum ich es mache, es fügt einfach mehr Commits hinzu. Ich möchte die Geschichte aufräumen.
Costa
@Costa: Was hat nicht funktioniert (dh welche Version hast du verwendet) und wie hast du das Protokoll erstellt?
Jakub Narębski
Ich habe fast alles in diesem Q & A ausprobiert. (Ich habe zuletzt versucht, Git HEAD zurückzusetzen) Mein Git-Protokoll: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)'
Costa
1
Ich möchte nur die Commits löschen (als ob sie nie existiert hätten). Ich habe ein seltsames Coding-Abenteuer mit mehreren neuen Commits begonnen, und alles endete als Müll. Wie kann ich diese einfach aus meinem Git-Log löschen?
Costa
2
Heiliger Mist, etwas hat auf magische Weise genau das getan, was ich wollte ... welcher dieser Befehle hat es getan? !!?!
Costa
44

Angenommen, wir möchten die Commits 2 und 4 aus dem Repo entfernen.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Hinweis: Sie müssen über Administratorrechte für das Repo verfügen, da Sie --hardund 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.
tk_
quelle
1
Der letzte Schritt sollte sein, git push -f origin masterdass es keine Option gibt--hard
Vivex
2
Ich denke commit 0ist älter als commit 1. Könnten Sie mir bitte sagen, warum Sie zuerst durch commit 3(mit Kirschbaum) und dann durch commit 1? Nach dem Auschecken b3d92cd( commit 0) würde ich erwarten , herauspicken commit 1, dann commit 3. Vielen Dank.
Jarek C
@JarekC Ich denke, das oberste Commit ist das neueste Commit hier, es sei denn, ich sehe etwas falsches ...
Jeff Huijsmans
41
git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId bezieht sich auf diejenige, auf die Sie zurückgreifen möchten

sun34
quelle
git push --force <origin> <branchName>. Ohne den Zweignamen zu erwähnen, werden möglicherweise alle Dateien auf der Fernbedienung geändert.
Sheelpriy
39

Ä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>, damit git rebase -i HEAD~5 , wenn Sie die letzten fünf Commits sehen wollen.

Ändern Sie dann im Texteditor das Wort pickindrop 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.

IliasT
quelle
dropSchlüsselwort ist nicht definiert. Um ein Commit zu löschen, entfernen Sie einfach die gesamte Zeile.
Shayan Salehian
1
Für mich wurde drop als Schlüsselwort definiert, aber das Löschen schien das Commit nicht aus dem Verlauf zu entfernen. Das Entfernen der Zeile aus der interaktiven Rebase hat dies jedoch getan.
Adam Parkin
Genau das brauchte ich. Funktioniert super; Vielen Dank!
diekunstderfuge
30

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:

git reset HEAD~1

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:

git reset HEAD~N

Wenn Sie Ihr letztes Commit entfernen und die Codeänderungen nicht beibehalten möchten, können Sie einen "Hard" -Reset durchführen.

git reset --hard HEAD~1

Wenn Sie die letzten N Commits verwerfen und die Codeänderungen nicht beibehalten möchten:

git reset --hard HEAD~N
Anurag-Sharma
quelle
22
git rebase -i HEAD~2

Hier ist '2' die Anzahl der Commits, die Sie neu aufbauen möchten.

'git rebase -i HEAD`

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.

Siva Praveen
quelle
In der neuesten Version git es nicht mehr Option d . Sie müssen nur Zeilen mit Commits aus der Rebase entfernen, um sie zu löschen.
Oleg Abrazhaev
17

Verwenden Sie zum Löschen in einem lokalen Zweig

git reset --hard HEAD~1

Verwenden Sie zum Löschen in einem Remote-Zweig

git push origin HEAD --force
der Stern
quelle
12

[Schnelle Antwort]

Sie haben viele Alternativen, zum Beispiel:

  • Alternative 1:

    git rebase -i <YourCommitId>~1
    

    Ändern Sie YourCommitId für die Nummer des Commits, zu dem Sie zurückkehren möchten.

  • Alternative 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force
    

    Ändern Sie YourCommitId für die Nummer des Commits, zu dem Sie zurückkehren möchten.

    Ich empfehle diese Option nicht, da Sie Ihre laufende Arbeit verlieren können.

  • Alternative 3:

    git reset --soft HEAD~1
    

    Sie können Ihre Arbeit behalten und nur das Commit rückgängig machen.

Javier C.
quelle
danke danke danke danke (Y)
Habib Rehman
11

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

  1. Setzen Sie zuerst den Zweig auf das übergeordnete Element des aktuellen Commits zurück

  2. Drücken Sie es mit Gewalt auf die Fernbedienung.

git reset HEAD^ --hard

git push origin -f

Für ein bestimmtes Commit, das Sie zurücksetzen möchten, folgt Folgendes

git reset bb676878^ --hard

git push origin -f
Sagar Jethi
quelle
9

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:

git reset --hard COMMIT_ID

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:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Dadurch werden alle Commits nach dem aktuellen in Ihrem lokalen Repository gelöscht, jedoch nur für diesen einen Zweig.

CommaToast
quelle
9

Der Fehler:

Ich habe git rebase -i --rootmeinen 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 HEADtat nichts, nachdem ich das überprüft hatte reflog, 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>dann d, 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.

Löwe
quelle
8

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.

Angelo Borsotti
quelle
1
Die Reihenfolge, in der die Antworten in StackOverflow angezeigt werden, ist nicht festgelegt. Bitte beziehen Sie sich nicht auf "Alle obigen Befehle". Machen Sie Ihre eigene Antwort in sich geschlossen.
Pascal Cuoq
Diese Antwort ist nicht ganz richtig. 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 .
8

Wenn Sie den Verlauf beibehalten und das Commit und das Zurücksetzen anzeigen möchten, sollten Sie Folgendes verwenden:

git revert GIT_COMMIT_HASH

Geben Sie die Nachricht ein, in der erläutert wird, warum Sie zurückkehren, und dann:

git push  

Wenn Sie ein Problem ausgeben git log, werden sowohl das "falsche" Festschreiben als auch das Zurücksetzen von Protokollnachrichten angezeigt.

Paulo Fidalgo
quelle
Ja, aber dem OP war klar, dass sie das nicht wollen.
Steve Bennett
7

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:

git commit --amend -m "New message here"

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

Pwnrar
quelle
2
Darum bittet OP nicht.
Steve Bennett
5

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:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

Führen Sie dann an jeder Stelle, an der das Repo geklont wurde, Folgendes aus:

git reset --hard origin/master
Justin
quelle
5

Was ich normalerweise mache, wenn ich ein Commit mache und pushe (wenn jemand sein Commit drückt, löst dies das Problem):

git reset --hard HEAD~1

git push -f origin

Ich hoffe das hilft

Chris Sim
quelle
5

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:

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force
Serg Burlaka
quelle
4

Auf lokalen Zweig zurücksetzen

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

Force Push to Origin

git push -f origin
Ashish Singh
quelle
3

Erstellen Sie eine Sicherungskopie Ihres Codes im temporären Ordner. Der folgende Befehl wird wie der Server zurückgesetzt.

git reset --hard HEAD
git clean -f
git pull

Wenn Sie Ihre Änderungen beibehalten und die letzten Commits entfernen möchten

git reset --soft HEAD^
git pull
Lava Sangeetham
quelle
2

lokales Commit löschen

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 gitkBefehl 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):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2// Es sichert Sie bei diesem Commit (SHA1-ID des Commits für Teständerung 4 lautet 515b5220c50e3dfbb1063f23789d92ae1d3481a2 ).
  2. git reset --hard HEAD~1 // es sichert dich vor einem Commit.
  3. git reset --hard HEAD^ // Um ​​das letzte Commit von git zu entfernen

nach dem Löschen:

nach dem Löschen festschreiben

Ankit
quelle
2

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

Jyotirmoy Upadhaya
quelle
Es sei denn, Sie haben die Änderungen bereits vorgenommen. In diesem Fall wird Ihre Fernbedienung durch einen Hard-Reset nicht bereinigt. In diesem Fall ist Rebase die gute Option
c0der512
1

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.

BillChan
quelle
0

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.

Uttam Rahane
quelle
0

In meinem Fall ist mein magischer Code für diesen Schüler dieser:

git reset --hard @{u}

Teste es und sag es mir. Ich habe ein paar verschiedene ausprobiert, aber diese war die einzige, die mir geholfen hat.

Mauro Bilotti
quelle