497 Stimmen

Wie rebaset man den ersten Commit in git?

Ich habe git init verwendet, um ein frisches Repo zu erstellen, dann drei Commits gemacht. Jetzt möchte ich rebase machen, um zu meinem ersten Commit zurückzukehren und ihn zu ändern, aber wenn ich git rebase -i HEAD~3 mache, zeigt es den Fehler - fatal: invalid upstream 'HEAD~3'!

Wenn ich dasselbe mit HEAD~2 versuche, funktioniert es irgendwie, aber es lässt mich nur die letzten zwei Commits neu anordnen.

Wie kann ich auf den 'Commit vor den Commits' verweisen oder zurückgehen und einen leeren Commit einfügen?


Fehler bei git rebase -i HEAD~3:

fatal: invalid upstream 'HEAD~3'

863voto

torek Punkte 381305

Der einfache Weg, mit einem aktuellen genug Git (das gibt es schon seit geraumer Zeit, also solltest du das haben):

git rebase -i --root

Der andere einfache Weg, wie twalberg in einem Kommentar bemerkte, der since gelöscht wurde, aber jetzt in https://stackoverflow.com/a/68279810/1256452's Antwort ausführlich erklärt ist, ist die Verwendung von git checkout --orphan, um sich für die Erstellung eines neuen Root-Commits vorzubereiten, auf den du die alten Commits kopieren kannst. (Das ist letztendlich das, was rebase -i --root intern macht.) Für einige Zwecke, wie das Aufteilen dessen, was der erste Commit war, ist dieser anfängliche leere Commit hilfreich.

Anmerkung aus der Zukunft (2022): Es ist oft eine gute Idee, den allerersten Commit nur wenige Vorlagen-Dateien wie ein README enthalten zu lassen. Der allererste Commit in einem neuen, leeren Repository ist immer etwas Besonderes. Beachte, dass wenn du Hosting-Sites wie Bitbucket, GitHub und GitLab verwendest, sie oft einen solchen initialen Commit für dich erstellen werden, wenn du dort ein Repository erstellst, so dass du das dadurch erstellte Repository klonen und einen Ausgangspunkt haben kannst.

23voto

sworisbreathing Punkte 579

toreks Antwort ist in Ordnung, wenn Sie Änderungen an Dateien vornehmen möchten, die bereits im Commit sind, den Autor/die Nachricht bearbeiten usw. Aber wenn Sie den Commit aufsplitten oder ähnliches möchten, dann werden Sie wahrscheinlich Probleme haben, weil Sie git reset HEAD~ nicht vom ersten Commit ausführen können.

Um dies möglich zu machen, können Sie einen leeren Initial-Commit einfügen, wie folgt:

git checkout --orphan empty-initial-commit
git rm -r --cached .
git clean -d -f
git commit --allow-empty -m 'Leerer Initial-Commit'
git checkout 
git rebase empty-initial-commit
git branch -d empty-initial-commit

dann können Sie git rebase -i machen, den Commit bearbeiten (den ersten nicht-leeren Commit) und git reset HEAD~ wie gewohnt durchführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X