Wie entferne ich das erste Commit in Git?

177

Ich bin gespannt, wie ich das erste Commit in Git entfernen kann.

Was ist die Überarbeitung, bevor etwas begangen wird? Hat diese Revision einen Namen oder ein Tag?

Jian Weihang
quelle
2
Für den Anfang mit git sollten Sie wissen, dass eine Überarbeitung bedeutungslos ist. Sie können über Commits oder deren relative SHAs sprechen. Warum sollten Sie das auch tun wollen? Das erste Commit ist, worauf alles aufgebaut ist. Sie könnten einige Commits zusammenfassen, einschließlich des ersten Commits, das zum neuen ersten Commit wird. Was bedeutet es jedoch, das erste Commit zu löschen (oder nur das letzte Commit zu löschen)?
Shahbaz
@ Shahbaz Ja, das ist der beste Weg, schauen Sie hier zum Beispiel: ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one
timaschew
5
Sie können verwenden git rebase -i --root. Siehe die folgende SO-Antwort für Details: stackoverflow.com/questions/2246208/…
MKroehnert
Mögliches Duplikat von Kann ich das anfängliche Commit aus einem Git-Repo entfernen?
Gordon Gustafson
Diese Antwort hat die richtige Lösung zum Löschen des Root-Commits des aktuellen Zweigs:git filter-branch --parent-filter "sed 's/-p <the_commit>//'" HEAD
Jody Bruchon

Antworten:

318

Für mich ist der sicherste Weg, den folgenden update-refBefehl zu verwenden:

git update-ref -d HEAD

Die benannte Referenz wird gelöscht HEAD, sodass alle Commits Ihres aktuellen Zweigs zurückgesetzt werden (leise verlieren Sie Ihre Arbeit nicht) .

Wenn Sie das erste Commit mit dem zweiten zusammenführen möchten, können Sie den folgenden rebaseBefehl verwenden:

git rebase -i --root

Eine letzte Möglichkeit könnte darin bestehen, einen verwaisten Zweig zu erstellen, einen Zweig mit demselben Inhalt, jedoch ohne Festschreibungsverlauf, und Ihren neuen Inhalt darauf festzuschreiben:

git checkout --orphan <new-branch-name>
tzi
quelle
7
Es ist schade, dass dies nicht die akzeptierte Antwort ist. Es ist auch schade, dass die meisten Treffer bei Google mehr oder weniger sagen "Sie können das erste Commit nicht rückgängig machen". Das hat den Trick für mich getan. Vielen Dank!
Danielpops
1
Vielen Dank an @danielpops für Ihre Unterstützung! Es ist gut zu bemerken, dass ich diese Frage 3 Jahre später beantwortet habe. Git hat sich inzwischen weiterentwickelt.
Tzi
Ich habe Rebase verwendet, das zweite Commit als "Squash" markiert und dann einen --force-Push zum Ursprung ausgeführt. Vielen Dank!
Philip Atz
1
git update-ref -d HEAD ist der sicherste Weg, um den gesamten Verlauf zu entfernen, nicht nur das anfängliche Festschreiben.
user1767316
Ich habe es getan und alle meine Dateien gelöscht, die ich zum ersten Commit hinzugefügt habe. Traurig. Zumindest war es nicht viel
Vyacheslav Tsivina
42

Vor dem ersten Festschreiben gibt es nichts, da jedes Festschreiben auf ein übergeordnetes Festschreiben verweist. Dies macht das erste Commit zu etwas Besonderem (ein verwaistes Commit), sodass es keine Möglichkeit gibt, auf einen vorherigen "Status" zu verweisen.

Wenn Sie also das Commit korrigieren möchten, können Sie einfach git commit --amendFolgendes tun : Dadurch wird das Commit geändert, ohne dass ein weiteres erstellt wird.

Wenn Sie nur von vorne beginnen möchten, löschen Sie das .gitRepository und erstellen Sie ein neues mitgit init

CharlesB
quelle
7
Diese Antwort ist falsch: Es gibt eine Möglichkeit, vor dem ersten Festschreiben zum Status zurückzukehren. Siehe die Antwort von tzi unten.
David Nelson
2
Der --amendAutor wird auch nicht richtig aktualisiert, wenn er ursprünglich falsch konfiguriert wurde. Das war es, was ich brauchte, also habe ich die akzeptierte Antwort verwendet und stattdessen einfach ein neues Commit durchgeführt.
Mark Edington
11
# Check out to a temporary branch:
git checkout --orphan TEMP_BRANCH

# Add all the files:
git add -A

# Commit the changes:
git commit -am "Initial commit"

# Delete the old branch:
git branch -D master

# Rename the temporary branch to master:
git branch -m master

# Finally, force update to our repository:
git push -f origin master
Megha Sahu
quelle
3
Keine Antwort: Die Frage lautete: "Wie entferne ich das erste Commit?" Und nicht "Wie lösche ich alles außer dem letzten Commit".
Peterh - Wiedereinsetzung Monica
1
Ich habe genau danach gesucht. Vielen Dank!
Krzysztof Tomaszewski
6

Möglicherweise möchten Sie nur Ihr erstes Commit bearbeiten (da es in einem Git-Repo immer ein erstes Commit gibt). Erwägen Sie die Verwendung git commit --amend --reset-authoranstelle des üblichen git commit --amend.

Max Beikirch
quelle
1
Keine Antwort: Die Frage wollte das erste Commit löschen und die Eigenschaften des letzten nicht ändern.
Peterh - Wiedereinsetzung Monica
@ peterh-ReinstateMonica Zur Verdeutlichung: Commits können während des interaktiven Rebases geändert werden, um ihren Inhalt vollständig zu ändern, aber --reset-author muss angegeben werden, um auch den Autor zu ändern. Damit können Sie das erste Commit nach Ihren Wünschen vollständig ersetzen. Siehe auch die Antwort von CharlesB.
Max Beikirch
3

Ich suchte nach einer Möglichkeit, alle Git-Commits von einem Repo rückgängig zu machen, als wären sie nie passiert.

Das Wiederherstellen funktioniert bis zu einem gewissen Punkt. Das allererste (chronologisch das älteste Git-Commit) wird jedoch immer problematisch sein, da es kein übergeordnetes Element hat, sodass ein Fehler auftritt.

Keine dieser Antworten hat es für mich ganz gelöst. Aber nach viel Suchen und Ausprobieren fand ich, dass dies funktioniert!

git update-ref -d HEAD
git push origin master -f

Hoffe das hilft dir. Ich wünsche ihnen einen wunderbaren Tag.

kp123
quelle
1
Um für jeden, der diese Antwort liest, klar zu sein: Dadurch wird jedes Commit gelöscht, aber OP möchte nur das erste Commit löschen, das für ein Repo vorgenommen wurde. Führen Sie dies nicht aus, um das erste Commit zu löschen, da dadurch ALLE Commits gelöscht werden.
Jody Bruchon
2

Sie können auch Folgendes tun:

  1. Kasse zu einer Filiale, die Sie behalten möchten (sagen wir dev) git checkout dev
  2. Löschen Sie nun den Zweig, den Sie zurücksetzen möchten git branch -D master
  3. Erstellen Sie nun einen leeren Zweig mit demselben Namen git checkout --orphan master

Natürlich hängt dies alles von Ihrem Anwendungsfall ab, aber wenn Sie mehr als einen Zweig haben, ist das Löschen des .gitVerzeichnisses nicht sinnvoll.

kumarharsh
quelle
3
Danach müssen Sie den Zweig in der Fernbedienung löschen, bevor Sie drücken. Andernfalls wird beim Versuch zu pushen der folgende Fehler angezeigt :! [abgelehnt] master -> master (nicht schneller Vorlauf) - Fehler: Einige Refs konnten nicht an '[email protected]: r1 / r2.git' gesendet werden. - Hinweis: Aktualisierungen wurden abgelehnt, da die Spitze Ihres aktuellen Zweigs lautet hinter - Hinweis: sein entferntes Gegenstück. Integrieren Sie die Remote-Änderungen (z. B. Hinweis: 'Git Pull ...'), bevor Sie erneut drücken ... - Wenn Sie einen Git Pull ausführen, werden alle Commits zurückgegeben.
Dxvargas
2

Wenn Sie andere Zweige behalten möchten, aber beispielsweise den masterZweig ohne gemeinsamen Verlauf für andere Zweige neu starten möchten, können Sie dies sicher erreichen, indem Sie ein neues Repository erstellen und dessen Inhalt in Ihr altes Repository übertragen:

cd ..
git init newrepo
cd newrepo
# make some initial commits
git push ../oldrepo master:newmaster

Dadurch wird ein newmasterZweig im alten Repository erstellt, dessen Verlauf mit keinem der anderen Zweige gemeinsam ist. Natürlich können Sie das auch einfach überschreiben mastermit git push -f.

Wenn Sie alle Zweige und alle vorhandenen Inhalte zerstören möchten, führen Sie sie einfach aus

rm -rf .git/
user1338062
quelle
1
Keine Antwort: Das OP wollte das erste Commit entfernen und kein neues Git-Repo mit dem aktuellen Arbeitsbaum als erstem Commit starten.
Peterh - Wiedereinsetzung Monica
@peterh Ich stimme zu, git rebase --rootist wahrscheinlich das, was OP wollte, aber da diese Antwort zwei positive Stimmen hat, werde ich sie nicht löschen, falls jemand sie immer noch für relevant hält.
user1338062
Ich denke , diese Antwort genau relevant ist - wenn man das erste begehen in einigen Zweig löschen wollen, und es ist nur ein begehen! (Aber Sie möchten auch die anderen Commits in anderen Zweigen behalten; und Sie möchten dies auch tun, damit die Änderungen nicht nur lokal, sondern auch in Bitbucket oder Github enden.) Ich glaube, diese Antwort ist eine Möglichkeit, dies zu tun, und Ich denke, dies ist möglicherweise der einzige Weg, dies zu tun. (Das liegt daran, dass es - soweit ich sehen kann - keine Möglichkeit gibt, einen lokalen Zweig ohne Commits mit einigen Commits über einen Remote-Zweig zu schieben.)
MikeBeaton
0

Wenn Sie es gerade festgeschrieben, aber nicht gepusht haben, entfernen Sie einfach das .git- Verzeichnis und git initerneut ...

Ali Sajid
quelle
@ Peter Ja, das tut es. Sie gehen davon aus (glaube ich), dass es bei der Frage des OP darum geht, das erste Commit zu löschen, aber nachfolgende Commits beizubehalten. Eine weitere Möglichkeit (die ich denke , die Frage des OP paßt sehr gut - und was diese Antwort ist eine Antwort auf) fehlt die ersten zu löschen und nur von einem Zweig zu begehen, es wieder vollständig leer wieder zurückkehrte.
MikeBeaton
@ MikeBeaton Du hast recht. Ich entferne meinen Kommentar, muss dann aber abstimmen, um die Frage als unklar zu schließen. Beachten Sie, obwohl nur ich diesen Kommentar abgegeben habe, aber hinter mir sind 40000 Besucher, und ein erheblicher Teil von ihnen hat diese Frage bei Google gefunden - und sie haben nicht bekommen, was sie wollten.
Peter - Wiedereinstellung Monica
Das scheint extrem. Frage löschen? Könnte nicht (vollkommen gut) argumentiert werden, dass eine vollständige Antwort auf eine völlig vernünftige Frage darin besteht, dass zwei verschiedene Ansätze gewählt werden müssen, je nachdem, ob ... usw.? (Ich meine, ich für meinen Teil, würde gerne wissen , wie das entfernen erste begehen , wenn es nicht das ist nur begehen, und auch , wie die erste entfernen begehen , wenn es ist die einzige begehen. Es ist sicherlich nicht auf der Hand, und schon gar abhängt Bei implementierungsspezifischen Details stellt sich heraus, dass in jedem Fall wirklich ziemlich unterschiedliche Ansätze erforderlich sind.)
MikeBeaton
0

Die Antwort auf die Frage hängt davon ab, ob:

  • Sie möchten das erste UND NUR Commit für einen Zweig entfernen (während andere Zweige unverändert bleiben) oder ob

  • Sie möchten das erste Commit für einen Zweig entfernen, während Sie die nachfolgenden Commits (und die anderen Zweige) an Ort und Stelle lassen.

Die zweite davon ist relativ einfach. Sie müssen sich im Wesentlichen auf root stützen - die meisten Antworten hier beziehen sich auf Möglichkeiten, dies zu tun.

Das zweite zu tun (das erste zu entfernen und nur aus einem Zweig festzuschreiben, während andere Zweige in Ruhe gelassen werden) ist schwieriger. Oder zumindest besonders schwierig, wenn Sie möchten, dass dies geschieht und die Änderung in GitHub oder Bitbucket wiedergegeben wird. Es gibt (soweit ich das beurteilen kann) in Git überhaupt keine Möglichkeit, einen Zweig ohne Commits zu pushen oder zu pushen. Und es gibt auch (soweit ich sehen kann) überhaupt keine Möglichkeit, einen neuen, leeren Zweig ohne Commits in GitHub oder Bitbucket zu erstellen. Sie müssen also im Wesentlichen ein neues Repository erstellen, um einen vollständig leeren Zweig zu erstellen, und dann die gewünschten Zweige (einschließlich der gewünschten Commits) wieder hinzufügen - gemäß der Antwort von @ user1338062.

Ich hoffe, diese Antwort verdeutlicht, was möglicherweise nicht offensichtlich war - dass zwei verschiedene Ansätze für zwei verschiedene (mehr oder weniger vernünftige) Szenarien gewählt werden müssen, die beide Dinge sind, die Sie möglicherweise in der richtigen Reihenfolge tun möchten das, was das OP verlangt, vollständig zu beherrschen.

MikeBeaton
quelle