it-swarm.com.de

Commits aus einem Zweig in Git löschen

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?

2755
hap497

Achtung:git reset --hardlö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.

3542
gahooa

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.

661
Greg Hewgill

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.

444

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.

305
Rob

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.

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

65
raittes

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
48
Jakub Narębski
git reset --hard commitId

git Push <Origin> <branch> --force

PS: CommitId verweist auf die, auf die Sie zurückkehren möchten

33
sun34

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
27
Anurag-Sharma

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

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.

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

19
Siva Praveen

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
12
thestar

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.

7
CommaToast

Der Fehler:

Ich git rebase -i --rootte 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.

7
Leo

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.

6
Angelo Borsotti

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

5
Pwnrar

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.

5
Paulo Fidalgo

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

Löschen Sie den letzten Commit

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 

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

  2. 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
4
sagar jethi

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
3
Justin

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

3
Chris Sim

Ich habe schon gepusht Einige Commits müssen remote zurückgegeben werden. Habe viele Variationen ausprobiert, aber nur dies von Justin über Git Bush funktioniert gut für mich:

git reset --hard $GIT_COMMIT_HASH_HERE
git Push Origin HEAD --force
2
Serg Burlaka

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
2
Ashish Singh
// 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

1
Shajid

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
0
Lava Sangeetham

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.

0
BillChan

 delete local commit

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

  1. git reset --hard 515b5220c50e3dfbb1063f23789d92ae1d3481a2/ Sie werden mit diesem Commit gesichert (SHA1-ID von _/test change 4 commit ist 515b5220c50e3dfbb1063f23789d92ae1d3481a2
  2. git reset --hard HEAD~1 // Sie werden vor einem Commit gesichert.
  3. git reset --hard HEAD^ // Um ​​das letzte Commit aus git zu entfernen

nach löschen:

 after delete commit

0
ankit