772 Stimmen

Wie kann man alle Git-Commits zu einem zusammenfassen?

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?

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?.

5voto

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

3voto

harre Punkte 39

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

0 Stimmen

Danke für Ihren Kommentar, oder entkommen Sie dem ^ wie folgt \^ git reset $(git commit-tree HEAD\^{tree} -m "initial commit")

2voto

rem Punkte 11

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 Arbeitszweig
  • my-awesome-template/master ist ein Zwischenzweig

0 Stimmen

Wirklich nützlich, vielleicht sind zwei Befehle nicht notwendig: rm und zweiter Commit

1voto

Derrick Petzold Punkte 1049

Dies 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.

1voto

seebi Punkte 369

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