Wie komprimiere ich bestimmte Commits in einem lokalen Zweig?

Lesezeit: 3 Minuten

Ich kann da draußen ein paar Antworten finden, die meinen Wünschen nahe kommen, aber ich fürchte, ich bin nicht wirklich erfahren genug mit Git, um genau zu verstehen, wie ich das erreichen kann, was ich will.

Bei einem lokalen Zweig mit den Commits ABCDEFGHIJ möchte ich einige der Commits zusammenquetschen, sodass ich am Ende beispielsweise das Äquivalent von A-BCD-E-FGH-IJ habe.

Ist das möglich? Die Absicht besteht darin, dies nach der Umbasierung mit einem lokalen Zweig zu tun, aber bevor er wieder in den Master-Zweig zusammengeführt wird, um eine prägnantere und informativere Historie zu erstellen.

  • Mögliches Duplikat von Git-Squash-Commits mitten in einem Branch

    – Winkler

    18. Oktober 2018 um 10:59 Uhr

Wie komprimiere ich bestimmte Commits in einem lokalen Zweig
cmbuckley

Sie können dies mit tun rebase. Angenommen, die Commits A–J befinden sich in einem lokalen Zweig branchname darauf gebaut masterdann kannst du das machen:

git checkout branchname
git rebase -i master

Ihnen wird ein interaktives Fenster wie dieses angezeigt:

pick A Commit message A
pick B Commit message B
pick C Commit message C
pick D Commit message D
pick E Commit message E
...

Interaktive Rebase bietet Anweisungen für Ihr Szenario, daher sollten Sie “Pick” für C und D (und dasselbe für G, H und J) in “Squash” ändern:

pick A Commit message A
pick B Commit message B
squash C Commit message C
squash D Commit message D
pick E Commit message E

Dadurch werden B, C und D zu einem einzigen Commit zusammengefasst, sodass Sie die Commit-Nachricht ändern können.

Wenn Sie gerne die Commit-Nachricht von B verwenden, können Sie “fixup” anstelle von “squash” verwenden und werden nicht aufgefordert, die Commit-Nachricht zu aktualisieren.


Das interaktive Fenster ist sehr leistungsfähig, und Sie können Commits so oft neu anordnen, wie Sie möchten, oder einfach die Zeile löschen (oder das Präfix in „drop“ ändern) und dieses Commit wird entfernt. Wenn E beispielsweise einen Tippfehler behebt, den Sie in A gemacht haben, können Sie Folgendes tun:

pick A Commit message A
fixup E Commit message E
pick B Commit message B
pick C Commit message C
pick D Commit message D

Wenn Sie Commits jedoch neu anordnen, laufen Sie Gefahr, Konflikte auf dem Weg lösen zu müssen. Sie können immer verwenden git rebase --abort um in Ihren ursprünglichen Zustand zurückzukehren.

  • Was ist, wenn ich E zu A quetschen möchte, aber B, C, D noch bleiben muss?

    – Adriariyadi

    15. April 2018 um 13:11 Uhr

  • Sie müssten die Commits neu ordnen, sodass E unmittelbar auf A folgt. Die interaktive Rebase präsentiert Ihnen einen Editor, der Ihnen dies ermöglicht; Bewegen Sie einfach die Linie E zwischen den Linien A und B und ändern Sie sie pick E zu squash E nur das Gleiche. Da Sie hier den Commit-Verlauf ändern, müssen Sie möglicherweise mit Konflikten umgehen.

    – cmbuckley

    15. April 2018 um 16:47 Uhr

  • Gibt es eine Möglichkeit, anzunehmen, dass C in A gequetscht wird und nicht das Commit davor, dh B? @cmbuckley

    – RamPrasadBismil

    22. Oktober 2019 um 21:15 Uhr

  • @RamPrasadBismil, das ist dieselbe Frage, die Adrianriyadi gestellt hat – Sie müssen die Commits neu anordnen.

    – cmbuckley

    23. Oktober 2019 um 9:23 Uhr

  • Ich habe die ersten beiden Befehle oben auf Ihrem Vorschlag @cmbuckley ausgeführt. Aber der 2. Kommentar hat nicht funktioniert … könnte es stattdessen “git rebase -i origin/master” sein?

    – LED-Fantom

    8. Juli 2021 um 16:34 Uhr

git log --oneline
git checkout your-branch
git rebase -i HEAD~3

Schreiben Sie Ihre Kommentare, dann :wq(schreiben und beenden) und drücken Sie die Eingabetaste.

git log --oneline

Geben Sie hier die Bildbeschreibung ein

993800cookie-checkWie komprimiere ich bestimmte Commits in einem lokalen Zweig?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy