Ich möchte wissen, wie man ein Commit löscht.
Mit delete
meine ich, es ist, als ob ich das Commit nicht gemacht hätte, und wenn ich in Zukunft einen Push mache, werden meine Änderungen nicht auf den entfernten Zweig verschoben.
Ich lese die git-Hilfe, und ich denke, der Befehl, den ich verwenden sollte, ist git reset --hard HEAD
. Ist das richtig?
Achtung:git reset --hard
löscht Ihre Änderungen im Arbeitsverzeichnis. Stellen Sie sicher, dass alle lokalen Änderungen, die Sie behalten möchten} vor dem Ausführen dieses Befehls verwahrt werden.
Angenommen, Sie sitzen auf diesem Commit, dann wird dieser Befehl es verpassen ...
git reset --hard HEAD~1
Der HEAD~1
steht für das Commit vor dem Kopf.
Oder Sie können sich die Ausgabe von git log
anschauen, die Festschreibungs-ID des Festschreibens finden, zu dem Sie ein Backup durchführen möchten, und dann Folgendes tun:
git reset --hard <sha1-commit-id>
Wenn Sie es bereits geschoben haben, müssen Sie einen Push ausführen, um es loszuwerden ...
git Push Origin HEAD --force
Wie auch immer, wenn andere es gezogen haben könnten, wäre es besser, einen neuen Zweig zu gründen. Denn wenn sie ziehen, wird sie einfach in ihre Arbeit integriert, und Sie werden sie wieder hochschieben lassen.
Wenn Sie bereits gepusht haben, ist es möglicherweise besser, git revert
zu verwenden, um eine "Spiegelbild" -Methode zu erstellen, die die Änderungen rückgängig macht. Beide Commits werden jedoch im Protokoll angezeigt.
FYI - git reset --hard HEAD
ist großartig, wenn Sie ARBEIT IN PROGRESS loswerden möchten. Sie werden auf den letzten Commit zurückgesetzt und alle Änderungen in Ihrem Arbeitsbaum und Index gelöscht.
Wenn Sie nach einem Commit suchen, das Sie "gelöscht" haben, ist es normalerweise in git reflog
vorhanden, es sei denn, Sie haben Ihr Repository von Garbage gesammelt.
Wenn Sie das Commit noch nicht übertragen haben, können Sie git rebase -i
verwenden, um das Commit zu entfernen. Ermitteln Sie zunächst, wie weit dieses Commit (ungefähr) zurückliegt. Dann mach:
_git rebase -i HEAD~N
_
Der _~N
_ bedeutet, dass die letzten N
Commits erneut erstellt werden (N
muss eine Zahl sein, z. B. _HEAD~10
_). Anschließend können Sie die Datei, die Git Ihnen präsentiert, bearbeiten, um das anstößige Commit zu löschen. Beim Speichern dieser Datei schreibt Git dann alle folgenden Commits neu, als ob das gelöschte nicht vorhanden wäre.
Das Git-Buch hat ein gutes Abschnitt über das Umbasieren mit Bildern und Beispielen.
Seien Sie jedoch vorsichtig, denn wenn Sie etwas ändern, das Sie an einer anderen Stelle verschoben haben , ist ein anderer Ansatz erforderlich, es sei denn, Sie planen einen Force-Push.
Eine andere Möglichkeit ist einer meiner persönlichen Lieblingsbefehle:
git rebase -i <commit>~1
Dies startet die Erneuerung im interaktiven Modus -i
an der Stelle kurz vor dem Commit, das Sie schlagen wollen. Der Editor beginnt mit der Auflistung aller Commits seitdem. Löschen Sie die Zeile mit dem zu löschenden Commit und speichern Sie die Datei. Rebase erledigt den Rest der Arbeit, löscht nur diesen Commit und gibt alle anderen wieder in das Protokoll zurück.
Ich füge diese Antwort an, weil ich nicht sehe, warum jeder, der gerade versucht hat, Arbeit zu begehen, diese Arbeit wegen eines Fehlers mit Git löschen möchte!
Wenn Sie Ihre Arbeit behalten und den Commit-Befehl "rückgängig machen" möchten (Sie haben ihn erwischt, bevor Sie die Repo-Aktion ausführen):
git reset --soft HEAD~1
Verwenden Sie nicht das Flag --hard , es sei denn, Sie möchten Ihre laufenden Arbeiten seit dem letzten Commit zerstören.
Entfernen eines gesamten Commits
git rebase -p --onto SHA^ SHA
Ersetzen Sie offensichtlich "SHA" durch die Referenz, die Sie entfernen möchten. Das "^" in diesem Befehl ist wörtlich.
Wenn Sie keine Änderungen veröffentlicht haben, können Sie das letzte Commit entfernen
$ git reset --hard HEAD^
(Beachten Sie, dass dadurch auch alle nicht festgeschriebenen Änderungen entfernt werden.
Wenn Sie das zu löschende Commit bereits veröffentlicht haben, verwenden Sie git revert
$ git revert HEAD
git reset --hard commitId
git Push <Origin> <branch> --force
PS: CommitId verweist auf die, auf die Sie zurückkehren möchten
Wenn Sie Ihre letzte Festschreibung korrigieren möchten, können Sie die Festschreibung rückgängig machen und die darin enthaltenen Dateien aufheben, indem Sie Folgendes tun:
git reset HEAD~1
Dadurch wird das Repository vor den Befehlen git add, die die Dateien bereitgestellt haben, in den Status zurückgesetzt. Ihre Änderungen werden in Ihrem Arbeitsverzeichnis gespeichert. 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 beibehalten:
git reset HEAD~N
Wenn Sie Ihre letzte Festschreibung loswerden möchten und die Codeänderungen nicht beibehalten möchten, können Sie einen "harten" Reset durchführen.
git reset --hard HEAD~1
Ebenso, wenn Sie die letzten N-Commits verwerfen möchten und die Codeänderungen nicht beibehalten möchten:
git reset --hard HEAD~N
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 --hard
und -f
verwenden.
git checkout b3d92c5
Das letzte verwendbare Commit auschecken.git checkout -b repair
Erstellen Sie einen neuen Zweig, an dem Sie arbeiten möchten.git cherry-pick 77b9b82
Durchschreiben 3.git cherry-pick 2c6a45b
Durchlaufen von commit 1.git checkout master
Checkout-Master.git reset --hard b3d92c5
Master auf zuletzt verwendbares Commit zurücksetzen.git merge repair
Füge unseren neuen Zweig auf Master zusammen.git Push -f Origin master
Schieben Sie den Master zum Remote-Repo.Historie gewaltsam ändern
Angenommen, Sie möchten nicht nur das letzte Commit löschen, sondern bestimmte Commits der letzten n Commits löschen, gehen Sie wie folgt vor:
git rebase -i HEAD~<number of commits to go back>
, also git rebase -i HEAD~5
, wenn Sie die letzten fünf Commits sehen möchten.
Ändern Sie dann im Texteditor das Wort pick
in drop
neben jedem Commit, den Sie entfernen möchten. Speichern Sie und beenden Sie den Editor. Voila!
Additiv Änderungsverlauf
Versuchen Sie git revert <commit hash>
. Revert erstellt ein new-Commit, das das angegebene Commit rückgängig macht.
git rebase -i HEAD~2
Hier ist '2' die Anzahl der Commits, die Sie zurücksetzen möchten.
'git rebase -i HEAD`
wenn Sie alle Festschreibungen wiederherstellen 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, geht DIESES COMMIT verloren. Wenn Sie jedoch alles entfernen, wird die Wiederherstellung abgebrochen. Beachten Sie, dass leere Commits auskommentiert werden
Sie können dieses Commit einfach entfernen, indem Sie die Option "d" verwenden oder eine Zeile mit Ihrem Commit entfernen.
Verwenden Sie zum Löschen in der lokalen Zweigstelle
git reset --hard HEAD~1
Um in einem entfernten Zweig zu löschen, verwenden Sie
git Push Origin HEAD --force
Hier ist eine andere Möglichkeit, dies zu tun:
Überprüfen Sie den Zweig, den Sie wiederherstellen möchten, und setzen Sie dann Ihre lokale Arbeitskopie auf den Commit zurück, den Sie auf dem Remote-Server als letztes verwenden möchten (alles, was danach passiert, wird auf Wiedersehen gehen). Dazu habe ich in SourceTree mit der rechten Maustaste auf das geklickt und "BRANCHNAME auf dieses Commit zurücksetzen" ausgewählt. Ich denke, die Befehlszeile lautet:
git reset --hard COMMIT_ID
Da Sie Ihren Zweig gerade aus der Ferne ausgecheckt haben, haben Sie keine lokalen Änderungen, um sich Sorgen um den Verlust zu machen. Aber das würde sie verlieren, wenn Sie es tun würden.
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.
Der Fehler:
Ich git rebase -i --root
te meinen Zweig und dachte unwissend, ich könnte das erste Commit anders als den Master umformulieren (die GitHub für Windows - Standardansicht ist der Vergleich mit dem Master und verbirgt seine Gesamtheit).
Ich habe einen Silicon Valley-Bart wachsen lassen, während sich 900+ Commits in Sublime geladen haben. Nachdem ich keine Änderungen vorgenommen hatte, lud ich meinen Akku auf und rasierte mich dann weiter, da alle 900+ Einzelbenutzer nonchalant umbasiert wurden und ihre Commit-Zeiten bis jetzt zurücksetzen.
Entschlossen, Git zu schlagen und die ursprünglichen Zeiten beizubehalten, löschte ich dieses lokale Repository und klonierte es erneut aus der Ferne.
Nun hatte es eine letzte nicht benötigte Festschreibung für den Master hinzugefügt, den ich entfernen wollte, also ging es so weiter.
Die Möglichkeiten erschöpfen:
Ich wollte nicht git revert
- es würde ein zusätzliches Commit erzeugen, das Git die Oberhand gibt.
git reset --hard HEAD
tat nichts, nachdem er die reflog
überprüft hatte, war die letzte und einzige HEAD
der Klon - Git gewinnt.
Um den neuesten SHA zu erhalten, habe ich das Remote-Repository auf github.com überprüft - minor win.
Nachdem ich überlegt hatte, dass git reset --hard <SHA>
funktioniert hatte, habe ich einen anderen Zweig auf master und 1 ... 2 ... poof aktualisiert! Das Commit war zurück - Git gewinnt.
Zum Master zurückkehren, Zeit, um git rebase -i <SHA>
auszuprobieren, dann die Zeile zu entfernen ... vergeblich, traurig zu sagen. Msgstr "Wenn Sie hier eine Zeile entfernen, VERLIERT. Ah ... überarbeitetes neues Feature troll den n00b in den Versionshinweisen 2.8.3 .
Die Lösung:
git rebase -i <SHA>
dann d, drop = remove commit
.
Um zu überprüfen, habe ich zu einem anderen Zweig ausgecheckt, und voila - keine versteckte Verpflichtung zum Abrufen/Ziehen vom Master.
https://Twitter.com/holman/status/706006896273063936
Guten Tag Ihnen.
Alle obigen Befehle stellen den Status Ihrer Arbeitsstruktur und des Index wie vor dem Festschreiben wieder her, jedoch nicht den Zustand des Repositorys. Wenn Sie es betrachten, wird das "entfernte" Commit nicht wirklich entfernt, es ist einfach nicht das an der Spitze des aktuellen Zweigs.
Ich denke, dass es keine Möglichkeit gibt, ein Commit mit Porcelain-Befehlen zu entfernen. Die einzige Möglichkeit ist es, es aus dem Log zu entfernen und einen neuen Report durchzuführen und dann einen git Prune --expire -now
auszuführen.
Wenn Sie gerade Ihren letzten Commit durcheinander gebracht haben (falsche Nachricht, vergessen, einige Änderungen hinzuzufügen) und den Fehler beheben möchten, bevor Sie ihn für ein öffentliches Repo verwenden, warum nicht verwenden
git commit --amend -m "New message here"
Wenn Sie neu bereitgestellte Änderungen vorgenommen haben, werden diese mit dem letzten Commit (das Sie loswerden möchten) kombiniert und ersetzen diesen Commit.
Wenn Sie ein Commit ändern, nachdem Sie es gepusht haben, schreiben Sie den Verlauf natürlich neu. Wenn Sie dies tun, sollten 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
Wenn Sie den Verlauf beibehalten und das Commit und das Revert anzeigen möchten, sollten Sie Folgendes verwenden:
git revert GIT_COMMIT_HASH
geben Sie die Nachricht ein, aus der hervorgeht, warum Sie zurückkehren, und dann:
git Push
Wenn Sie git log
ausgeben, werden sowohl die "falschen" Commit- als auch die Reverse-Log-Meldungen angezeigt.
Quelle: https://Gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8
Zum Beispiel dein letzter Commit
git Drücken Sie Origin + aa61ab32 ^: master
Nun möchten Sie dieses Commit löschen und anschließend eine einfache Möglichkeit, dies zu tun
Schritte
Setzen Sie zuerst den Zweig auf das übergeordnete Element des aktuellen Commits zurück
Force-Push auf die Fernbedienung.
git reset HEAD^ --hard git Push Origin -f
Für ein bestimmtes Commit möchten Sie Folgendes zurücksetzen
git reset bb676878^ --hard
git Push Origin -f
Wenn Sie bereits gepusht haben, finden Sie zuerst das Commit, das Sie unter HEAD ($ GIT_COMMIT_HASH_HERE) finden möchten, und führen Sie dann Folgendes aus:
git reset --hard $GIT_COMMIT_HASH_HERE
git Push Origin HEAD --force
Dann wird an jedem Ort, an dem das Repo geklont wurde, Folgendes ausgeführt:
git reset --hard Origin/master
Was ich normalerweise mache, wenn ich ein Commit und Push mache (wenn jemand sein Commit dazu drängt, löst das Problem)
git reset --hard HEAD~1
git Push -f Origin
ich hoffe das hilft
Setzen Sie die lokale Zweigstelle zurück
git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3
Push zum Ursprung erzwingen
git Push -f Origin
// display git commit log
$ git log --pretty=oneline --abbrev-commit
// show last two commit and open in your default editor
// then delete second commit line and save it
$ git rebase -i HEAD~2
Referenz: So löschen Sie ein Commit in git, local und remote
Sichern Sie Ihren Code im temporären Ordner. Der folgende Befehl wird auf den 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
git reset --hard
git Push Origin HEAD --force
Wenn eine oder mehrere Commits markiert sind, löschen Sie zuerst die Tags. Andernfalls wird das gekennzeichnete Commit nicht entfernt.
Wie Sie auf dem obigen Bild sehen können, möchte ich das Zurücksetzen "test change 2" löschen (SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2 (Sie können die SHA1-ID mithilfe des gitk
-Befehls in git bash erhalten).
Dafür kann ich verwenden (alle folgenden Befehle funktionieren nur auf lokal. Sie müssen nach dem Löschen drücken):
git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2
/ Sie werden mit diesem Commit gesichert (SHA1-ID von _/test change 4 commit ist 515b5220c50e3dfbb1063f23789d92ae1d3481a2) git reset --hard HEAD~1
// Sie werden vor einem Commit gesichert.git reset --hard HEAD^
// Um das letzte Commit aus git zu entfernennach löschen: