Wie drückst du dein gesamtes Repository auf den ersten Commit zusammen?
Ich kann zum ersten Commit neu basieren, aber dann hätte ich 2 Commits. Gibt es eine Möglichkeit, auf den Commit vor dem ersten zu verweisen?
Wie drückst du dein gesamtes Repository auf den ersten Commit zusammen?
Ich kann zum ersten Commit neu basieren, aber dann hätte ich 2 Commits. Gibt es eine Möglichkeit, auf den Commit vor dem ersten zu verweisen?
Für mich hat es so funktioniert: Ich hatte insgesamt 4 Commits und habe den interaktiven Rebase verwendet:
git rebase -i HEAD~3
Der allererste Commit bleibt und ich habe die letzten 3 Commits genommen.
Falls du im Editor stecken bleibst, der als nächstes erscheint, siehst du etwas wie:
pick fda59df Commit 1
pick x536897 Commit 2
pick c01a668 Commit 3
Du musst den ersten Commit nehmen und die anderen darauf squashen. Was du haben solltest, ist:
pick fda59df Commit 1
squash x536897 Commit 2
squash c01a668 Commit 3
Verwende dafür die Einfg-Taste, um in den 'Einfügen'- und 'Bearbeiten'-Modus zu wechseln.
Um den Editor zu speichern und zu verlassen, verwende :wq
. Wenn sich dein Cursor zwischen diesen Commit-Zeilen oder an einer anderen Stelle befindet, drück ESC und versuche es erneut.
Als Ergebnis hatte ich zwei Commits: den allerersten, der blieb, und den zweiten mit der Nachricht "Dies ist eine Kombination aus 3 Commits".
Überprüfe hier für Details: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
Ich habe verschiedene Befehle mit HEAD^{tree} ausprobiert, aber ich habe diesen Fehler von zsh erhalten:
zsh: no matches found: HEAD^{tree}
Es handelt sich um die Art und Weise, wie ohmyzsh die Erweiterung handhabt. Weitere Details finden Sie in diesem Problem: https://github.com/ohmyzsh/ohmyzsh/issues/449
Der einfachste Fix ist, diesen Befehl auszuführen:
unsetopt nomatch
Normalerweise lösche ich den gesamten Baum, wenn ich eine Vorlage aus einem Git-Repository wiederherstelle, um eine sauberere Historie zu erhalten und die rechtliche Konformität zu gewährleisten. Mein Workflow sieht wie folgt aus:
git clone https://git.invalid/my-awesome-template.git my-awesome-foo
cd !$
git branch -M master my-awesome-template/master
git checkout --orphan master
git rm -rf /
git commit --allow-empty --allow-empty-message -m 'Erster Commit'
git merge --squash --allow-unrelated-histories my-awesome-template/master
git commit
git branch -D my-awesome-template/master
# Sie können jetzt diesen "Erster Commit" 'fallen lassen':
git rebase -i --root
Dadurch werden Ihre gesamte Historie in eine einzelne große Commit-Nachricht zusammengedrückt.
In diesem speziellen Beispiel:
master
ist der Arbeitszweigmy-awesome-template/master
ist ein ZwischenzweigDies hat am besten für mich funktioniert.
git rebase -X ours -i master
Git wird hierbei deinen Feature-Branch master vorziehen; um mühsame Merge-Edits zu vermeiden. Dein Branch muss auf dem neuesten Stand mit master sein.
ours
Dies löst eine beliebige Anzahl von Köpfen auf, aber der resultierende Baum der Fusion ist immer der des aktuellen
Branch-Heads, wobei effektiv alle Änderungen aller anderen Branches ignoriert werden. Es ist dazu gedacht, alte Entwicklungs-Historie von Nebenzweigen zu übergehen. Beachte, dass dies sich von der Option -Xours der rekursiven Merge-Strategie unterscheidet.
Da ich einige Probleme mit den hier vorgeschlagenen Lösungen hatte, möchte ich eine wirklich einfache Lösung teilen (um alle Commits auf einem Feature-Zweig zusammenzufassen):
git merge origin/master && git reset --soft origin/master
Der vorherige Merge-Befehl stellt sicher, dass keine aktuellen Änderungen von master auf deinem Kopf landen, wenn du commitest! Danach einfach die Änderungen committen und git push -f
ausführen
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.
43 Stimmen
@innaM - Es ist der ursprüngliche Commit, der den Git hervorgebracht hat. (Hofft, dass der Humor gut genug durch das Internet übertragen wird).
14 Stimmen
Für diejenigen, die später zu dieser Frage kommen, achten Sie darauf, die modernere Antwort zu verwenden.
1 Stimmen
Verwandt, aber kein Duplikat (
--root
ist tatsächlich nicht die beste Lösung zum Zusammenfassen aller Commits, wenn es viele davon gibt, die zusammengefasst werden müssen): Kombinieren der ersten beiden Commits eines Git-Repositorys?.1 Stimmen
^ diese moderne Antwort ist nicht die beste, bessere Lösung ohne Overhead ist stackoverflow.com/questions/1657017#23486788
2 Stimmen
Imo: das ist das Beste von @MrTux: stackoverflow.com/questions/30236694/….
0 Stimmen
Möglicher Duplikat von Die ersten beiden Commits eines Git-Repository zusammenführen?
1 Stimmen
Ich weiß, die Frage verlangt eine schnelle Lösung, aber man könnte auch: ´rm -rf .git´ und ´git commit -m"neue Nachricht"´.