Der Fehler:
I git rebase -i --root
Ich habe meinen Zweig umgeschrieben, weil ich dachte, ich könnte den ersten Commit umschreiben, der sich vom Master unterscheidet (der GitHub für Windows Standardansicht ist der Vergleich mit dem Master, der die Gesamtheit der Daten verbirgt).
Ich habe mir einen Silicon-Valley-Bart wachsen lassen, während sich 900+ Commits in Sublime geladen haben. Als ich das Projekt ohne Änderungen beendete, lud ich meinen Akku auf und rasierte mich, während alle 900+ individuellen Commits nonchalant rebased wurden und ihre Commit-Zeiten auf jetzt zurückgesetzt wurden.
Entschlossen, Git zu schlagen und die Originalzeiten zu bewahren, löschte ich dieses lokale Repository und klonte es erneut aus dem Remote-Repository.
Nun hatte es eine letzte nicht benötigte Übergabe an den Master hinzugefügt, die ich entfernen wollte, also ging ich so vor.
Ausschöpfung der Möglichkeiten:
Ich wollte nicht, dass git revert
- würde ein zusätzlicher Commit erstellt, wodurch Git die Oberhand gewinnen würde.
git reset --hard HEAD
hat nichts bewirkt, nachdem ich die reflog
der letzte und einzige HEAD
war der Klon - Git gewinnt.
Um die neueste SHA zu erhalten, habe ich das Remote-Repository auf github.com überprüft - ein kleiner Erfolg.
Nachdenken git reset --hard <SHA>
funktioniert hatte, aktualisierte ich einen anderen Zweig auf Master und 1... 2... puff! war der Commit wieder da - Git gewinnt.
Zurück zum Master, Zeit zum Ausprobieren git rebase -i <SHA>
und entfernen Sie dann die Linie... leider ohne Erfolg. " Wenn Sie hier eine Zeile entfernen, wird diese Verbindung verloren gehen. ". Ah...neue Funktion beschönigt den N00b trollen im 2.8.3 Versionshinweise .
Die Lösung:
git rebase -i <SHA>
dann d, drop = remove commit
.
Um das zu überprüfen, habe ich in einen anderen Zweig ausgecheckt, und voila - kein versteckter Commit zum Holen/Pullen vom Master.
https://twitter.com/holman/status/706006896273063936
Ich wünsche Ihnen einen guten Tag.
64 Stimmen
Ich denke, das ist no ein Duplikat von Git letzte Übergabe rückgängig machen da er fragt, wie er löschen soll cualquier von einem Zweig übertragen. Ich denke auch, dass keine der Antworten auf diese Frage eingeht. Sie alle spulen die letzten Commits zurück, nicht
cherry-pick
ydelete
eine einzelne Übergabe, die vielleicht schon eine Weile zurückliegt.22 Stimmen
@Chris, die Antwort mit
git rebase -i HEAD~10
geht auf diese Frage ein, da es Ihnen erlaubt, die zu löschenden Commits willkürlich auszuwählen. Git wendet die Commits in dem von Ihnen angegebenen Bereich einzeln an und ignoriert dabei Commits, die Sie aus dem Protokoll entfernt haben. Ich habe diesen Befehl heute verwendet, um die zweit- und drittjüngsten Commits in meinem Repo zu löschen, während ich den obersten beibehalten habe. Ich stimme zu, dass keine der anderen Antworten zufriedenstellend ist.0 Stimmen
@MST ja, ich hätte sagen sollen, dass keine der Optionen in der akzeptierten Antwort auf diese Frage eingeht, aber Sie haben absolut Recht - dieser Befehl scheint zu funktionieren
2 Stimmen
Ich denke
git reset --soft HEAD~1
ist genau das, was Sie brauchen. In diesem Fall können Sie die Übergabe rückgängig machen und Ihre Arbeit speichern.reset --hard
wird Commit vollständig entfernen.0 Stimmen
Befehl: git log | head -n 1 | git revert
0 Stimmen
Glücklicherweise konnte ich einfach eine leere Commit-Nachricht schreiben und damit wurde der Commit nicht gecancelt :), so dass ich ihn nicht zu löschen brauchte. TL/DR: Ich hatte zufällig den Befehl
git commit -a
und dachte, es sei eine Kurzform vongit commit --amend
(was nicht der Fall ist) und war in einer neuen leeren Commit-Nachricht. Ich konnte den Editor einfach abbrechen (mit:wq
in vim) mit der leeren Nachricht und git hat die Übergabe nicht erstellt und gibt stattdessenAborting commit due to empty commit message.