Frage

Ich würde gerne wissen, wie löschen Sie ein commit.

Von delete, Ich meine, es ist, als ob ich nicht machen, die zu Begehen, und wenn ich eine push-in die Zukunft, meine änderungen nicht drücken, um den remote-Zweig.

Ich lese git helfen, und ich denke, der Befehl, den ich verwenden sollte, ist git reset --hard HEAD.Ist das richtig?

War es hilfreich?

Lösung

Achtung: git reset --hard IHRE ARBEITS Directory-Änderungen DELETE . Achten Sie darauf, bunkern alle lokalen Änderungen halten wollen, bevor dieser Befehl ausgeführt wird.

Unter der Annahme, auf dem Sie sitzen, die zu begehen, dann wird dieser Befehl wack es ...

git reset --hard HEAD~1

Die HEAD~1 bedeutet das vor dem Kopf zu begehen.

Oder Sie am Ausgang des git log aussehen könnte, finden die Commit-ID des begehen Sie, die gesichert werden sollen und dann dies tun:

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

Wenn Sie es bereits gedrückt haben, müssen Sie eine Kraft Push tun, es loszuwerden ...

git push origin HEAD --force

Doch , wenn andere haben es gezogen können, dann würden Sie besser dran, eine Niederlassung zu starten. Denn wenn sie ziehen, wird es nur verschmelzen sie in ihre Arbeit, und Sie werden es wieder zurück nach oben geschoben bekommen.

Wenn Sie bereits gedrückt wird, kann es sein, besser zu nutzen git revert, ein „Spiegelbild“ zu erstellen, dass begeht die Änderungen rückgängig machen. Doch beiden Commits im Protokoll sein werden.


FYI - git reset --hard HEAD ist groß, wenn Sie unfertiger loswerden wollen. Es wird Sie zurück wieder auf den neuesten begehen, und alle die Änderungen in Ihrem Arbeits Baum und Index löschen.


Schließlich, wenn Sie feststellen, müssen eine Festschreibung, dass Sie „gelöscht“, ist es typischerweise in git reflog es sei denn, Sie haben Müll Repository gesammelt.

Andere Tipps

Wenn Sie noch nicht gedrückt die überall begehen, können Sie git rebase -i entfernen , die zu begehen. Zuerst ist herauszufinden, wie weit zurück, die zu begehen ist (ungefähr). Dann tun:

git rebase -i HEAD~N

Die ~N Mittel rebase den letzten N Commits (N muss eine Zahl sein, zum Beispiel HEAD~10). Dann können Sie die Datei bearbeiten, dass Git präsentiert Ihnen die säumige begehen zu löschen. Auf diese Datei speichern, wird Git dann neu schreiben alle die folgenden Commits als das von Ihnen noch nicht existierte gelöscht.

Das Git Buch hat eine gute Abschnitt auf Rebasing mit Bildern und Beispiele.

Seien Sie vorsichtig mit dieser aber, weil, wenn Sie etwas ändern, dass Sie Haben gedrückt anderswo, wird ein anderer Ansatz erforderlich sein, es sei denn, Sie planen, eine Kraft Push zu tun.

Eine andere Möglichkeit ist einer meiner persönlichen Favoriten Befehle:

git rebase -i <commit>~1

Dies wird das Fütterungsmaterial im interaktiven Modus -i an dem Punkt beginnt kurz vor dem Festschreiben Sie whack wollen. Der Editor wird gestartet alle Commits seitdem auflistet. Löschen Sie die Zeile mit dem Commit Sie auszulöschen und die Datei zu speichern. Fütterungsmaterial wird den Rest der Arbeit tun, das Löschen nur das begehen, und die Wiedergabe aller andere in das Protokoll unterstützen.

Ich anhängen diese Antwort, weil ich sehe nicht, warum jemand, der gerade versucht hat, Arbeit zu begehen will alle, dass die Arbeit löschen, weil einige Fehler mit Git!

Wenn Sie Ihre Arbeit behalten wollen und nur ‚Undo‘, der Befehl commit (Sie gefangen vor dem Repo-Schieben):

git reset --soft HEAD~1

Verwenden Sie nicht die --hard Flagge, wenn Sie Ihre Arbeit in Fortschritt zerstören wollen seit dem letzten begehen.

Entfernen eines gesamten commit

git rebase -p --onto SHA^ SHA

ersetzt Offensichtlich „SHA“ mit der Referenz Sie wollen, sich wieder loszuwerden. Die "^" in diesem Befehl ist wörtlich zu nehmen.

http://sethrobertson.github.io/GitFixUm/fixup.html

Wenn Sie, keine Änderungen veröffentlichen entfernen neuesten begehen, können Sie

$ git reset --hard HEAD^

(beachten Sie, dass dies auch alle unbestätigten Änderungen entfernen, die Nutzung mit Sorgfalt).

Wenn Sie bereits veröffentlichten-Lösch begehen, verwenden git revert

$ git revert HEAD
git reset --hard commitId

git push <origin> <branch> --force

PS: CommitId bezieht sich die eine, die Sie zurück zu

zurückkehren möchten

Say wollen wir Commits 2 & 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 Administratorrechte haben, über die Repo , da Sie --hard und -f verwenden

.
  • git checkout b3d92c5 Kasse der letzte nutzbare begehen.
  • Erstellen git checkout -b repair eine Niederlassung zu arbeiten.
  • git cherry-pick 77b9b82 Run bis 3 begehen.
  • git cherry-pick 2c6a45b Run durch 1 verpflichten.
  • git checkout master Kasse Master.
  • git reset --hard b3d92c5 Reset-Master zum letzten nutzbaren begehen.
  • git merge repair unsere neue Niederlassung auf Master Merge.
  • git push -f origin master Push-Master an die Remote-Repo.

Gewaltsam Änderungsverlauf

Angenommen, Sie nicht nur löschen wollen, dass die letzten Commit, aber Sie wollen spezifische Commits der letzten n Commits zu löschen, gehen Sie mit:

git rebase -i HEAD~<number of commits to go back>, so git rebase -i HEAD~5, wenn Sie die letzten fünf Commits sehen.

Dann im Texteditor ändert das Wort pick drop neben jedem Commit Sie entfernen möchten. Speichern und beenden Sie den Editor. Voila!

additiv Änderungsverlauf

Versuchen git revert <commit hash>. Revert wird erstellen neue commit dass die rückgängig gemacht Commithäufigkeit.

Wenn Sie reparieren wollen neueste begehen, können Sie rückgängig machen, die zu begehen, und unstage die Dateien darin, indem Sie:

git reset HEAD~1

Das wird Ihr Repository in seinen Zustand vor dem git add Befehle zurück, die die Dateien in Szene gesetzt. Ihre Änderungen werden in Ihrem Arbeitsverzeichnis sein. HEAD ~ 1 bezieht sich auf die commit unter der aktuellen Spitze der Branche.

Wenn Sie wollen uncommit N Commits, aber die Code-Änderungen in Ihrem Arbeitsverzeichnis halten:

git reset HEAD~N

Wenn Sie Ihre neuesten loswerden wollen begehen, und wollen nicht auf die Code-Änderungen zu halten, können Sie ein „hartes“ Reset durchführen.

git reset --hard HEAD~1

Ebenso, wenn Sie die letzten N Commits verwerfen wollen, und wollen nicht auf die Code-Änderungen halten:

git reset --hard HEAD~N
git rebase -i HEAD~2

Hier ‚2‘ ist die Zahl der Commits Sie rebase wollen.

'git rebase -i HEAD`

Wenn Sie wollen, dass alle Commits rebase.

Dann können Sie eine der folgenden Optionen wä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

können diese Linien werden nachbestellt; sie werden von oben nach unten ausgeführt.  Wenn Sie hier eine Linie entfernen, die verloren gehen COMMIT.  Wenn Sie jedoch alles entfernen, wird das Fütterungsmaterial abgebrochen.  Beachten Sie, dass leere Commits sind auf Kommentar

Sie können einfach entfernen, die zu begehen mit der Option „d“ oder eine Zeile entfernen, die Ihre begehen hat.

Um in lokalen Zweig zu löschen, verwenden Sie

git reset --hard HEAD~1

in einem entfernten Zweig zu löschen, verwenden

git push origin HEAD --force

Hier ist eine andere Art und Weise dies zu tun:

Zur Kasse der Filiale Sie zurücksetzen wollen, dann Ihre lokale Arbeitskopie wieder zurückgesetzt das Festschreiben, dass Sie das späteste auf dem Remote-Server sein sollen (alles nach wird es gehen bye-bye). Um dies zu tun, in SourceTree ich rechts geklickt hat auf die und ausgewählt „Reset branch dazu verpflichten“. Ich denke, dass die Befehlszeile:

git reset --hard COMMIT_ID

Da Sie gerade Ihre Branche aus der Ferne ausgecheckt, Sie gehen nicht alle lokalen Änderungen an Sorge haben, zu verlieren. Aber das würde sie verlieren, wenn Sie getan haben.

wechseln Sie dann zu Ihrem Repository lokalen Verzeichnis und führen Sie diesen Befehl:

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

Dies wird alle Commits nach dem aktuellen in Ihrem lokalen Repository löscht, sondern nur für die eine Verzweigung auf.

Der Fehler:

git rebase -i --root'ed ich meine Zweig, unwissend dachte ich das erste verpflichten sich von dem Master umformulieren könnte (die GitHub for Windows Standardansicht der Vergleich zu meistern, es ist vollständig versteckt).

wuchs ich ein Silicon Valley Bart während 900+ Commits sich in Sublime geladen. Beenden ohne Änderungen, aufgeladen ich meine Batterie zu rasieren fährt dann fort, da alle 900+ einzelnen Commits nonchalant umbasiert -. Neueinstellung ihrer Zeit verpflichten, jetzt

Bestimmt Git zu schlagen und die ursprünglichen Zeiten zu bewahren, löschte ich diese lokalen Repository und von der Remote-Wieder geklont.

Nun war es wieder hinzugefügt ein letztes nicht benötigte befiehlt ich meistern wollte so entfernen, wie so fort.

Anstrengend die Optionen:

Ich wollte nicht git revert -. Es schaffen würde eine zusätzliche begehen, was Git die Oberhand

git reset --hard HEAD nichts tat, nachdem er die reflog Überprüfung, die letzte und einzige HEAD war der Klon -. Git gewinnt

die neueste SHA zu erhalten, überprüfte ich die Remote-Repository auf github.com -. Minor win

Nach dem Denken git reset --hard <SHA> gearbeitet hatte, habe ich einen anderen Zweig zu Master aktualisiert und 1 ... 2 ... puh! die Festschreibung war zurück -. Git gewinnt

Überprüfen wieder heraus zu meistern, Zeit git rebase -i <SHA>, um zu versuchen, dann entfernen Sie die Zeile ... ohne Erfolg, traurig zu sagen. „ Wenn Sie hier eine Linie entfernen, die COMMIT VERLOREN WERDEN“. Ah ... beschönigt neue Funktion troll die n00b in 2.8.3 Release Notes .

Die Lösung:

git rebase -i <SHA> dann d, drop = remove commit.

Um zu überprüfen, überprüfte ich zu einem anderen Zweig aus, und voila -. Kein Versteck begeht vom Master zum Abruf / Pull

https://twitter.com/holman/status/706006896273063936

Guter Tag zu Ihnen.

Alle Befehle den Zustand Ihrer Arbeit Baum und Index oben wiederherstellen, wie sie, bevor sie waren die begehen, aber nicht wieder her den Zustand des Repository. Wenn man es betrachtet, die „entfernt“ begehen nicht tatsächlich entfernt wird, es ist einfach nicht der auf der Spitze des aktuellen Zweiges.

Ich denke, dass es keine Mittel gibt ein entfernen begehen mit Porzellan Befehle . Der einzige Weg ist es aus dem Protokoll zu entfernen und reflog und dann ein git prune --expire -now auszuführen.

Quelle: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

Löschen der letzten Commit

Zum Beispiel Ihre letzte commit

git push origin + aa61ab32 ^: Master

Nun möchten Sie diese löschen begehen dann eine einfache Möglichkeit, dies folgende

zu tun

Schritte

  1. Zuerst setzen Sie den Zweig an die Eltern des aktuellen commit

  2. Kraft-schieben Sie es auf die Fernbedienung.

git reset HEAD^ --hard

git push origin -f

Für bestimmte verpflichten, Sie wollen zurückgesetzt folgt

git reset bb676878^ --hard

git push origin -f

Wenn Sie gerade Ihre letzte Commit verkorkste (falsche Botschaft, vergaß einige Änderungen hinzufügen) und will es beheben, bevor es zu einem öffentlichen Repo drängt, warum nicht verwenden:

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

Wenn Sie neu Änderungen inszenierten sie mit dem letzten kombiniert werde begehen (dass Sie versuchen, loszuwerden) und ersetzen wird, die zu begehen.

Natürlich, wenn Sie ändern ein begehen, nachdem Sie es gedrückt haben, sind Umschreiben Sie Geschichte also, wenn Sie das tun werden, dass die Auswirkungen zu verstehen.

Sie können auch den Pass ‚--no-edit‘ Option anstelle von ‚-m‘, wenn Sie die vorherigen begeht die Nachricht zu verwenden, würden es vorziehen.

Text & Tabellen: http://git-scm.com/docs/git-commit.html

Wenn Sie die Geschichte halten wollen, zeigt die begehen und die revert, sollten Sie verwenden:

git revert GIT_COMMIT_HASH

Sie hier die Nachricht zu erklären, warum sind Sie zurückkehren und dann:

git push  

Wenn Sie git log ausgeben Sie werden sehen, sowohl die „falschen“ begehen und zurück wechseln Log-Meldungen.

Wenn Sie bereits gedrückt haben, zuerst finden die verpflichten Sie bei HEAD sein wollen ($ GIT_COMMIT_HASH_HERE) , dann führen Sie den folgenden:

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

Dann wird jeder Ort, der Repo geklont wurde, führen Sie:

git reset --hard origin/master

Was ich in der Regel tun, wenn ich begehen und Push (wenn jemand schob sein begehen dies das Problem lösen):

git reset --hard HEAD~1

git push -f origin

hoffen, dass diese Hilfe

Zurücksetzen auf lokale Niederlassung

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

Schubkraft auf die Herkunft

git push -f origin

Nehmen Sicherung Ihres Code in temporären Ordner. Befehl folgenden wird als Server gleichen zurückgesetzt.

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

Wenn Sie möchten, um Ihre Änderungen zu halten, und entfernen Sie den letzten Commits

git reset --soft HEAD^
git pull

delete local commit

Wie Sie sehen können auf dem Bild oben möchte ich löschen rückgängig"test ändern 2" commit(SHA1 ID: 015b5220c50e3dfbb1063f23789d92ae1d3481a2(Sie können SHA1-Hash-ID gitk Befehl in git bash)).

Für die, die ich verwenden kann(die alle unter-Befehl funktioniert nur lokal auf.müssen Sie drücken Sie nach dem löschen):

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2 //zurück-bis Sie zu Begehen (SHA1 ID test 4 ändern commit 515b5220c50e3dfbb1063f23789d92ae1d3481a2)
  2. git reset --hard HEAD~1 // it back-up, bevor Sie einen commit.
  3. git reset --hard HEAD^ // Entfernen des letzten commit von git

nach dem löschen:

after delete commit

Ich habe bereits gedrückt. Need zurückzukehren einige Commits remotly zurück. Haben Sie versucht, viele Variationen, aber nur diese von Justin über git Busch funktioniert gut für mich:

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

git reset --hard

git push origin HEAD --force

Wenn eine oder mehrere der Commits markiert ist, löschen Sie die Markierung (en) aus. Ansonsten ist die getaggt begehen nicht entfernt wird.

// 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 einen Commit in git, lokalen und Remote-

Angenommen, Sie nicht auf die Remote-Repository geschoben haben, können Sie das Repository erneut zu klonen. Dies war meine Methode der Wahl ein paar Mal.

git revert https://git-scm.com/docs/git-revert .Es wird der gesamte Code zurückkehren, dann können Sie zu diesem Punkt wird letzten Commit nächsten commit.Then Kopf tun. zurück Commits löschen nie, aber es wird keinen Einfluss auf Sie das letzte Mal begehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top