920 Stimmen

Git: Wie man alle Commits auf einem Branch zusammenführt

Ich erstelle einen neuen Branch von master mit:

git checkout -b testbranch

Ich mache 20 Commits darauf.

Jetzt möchte ich diese 20 Commits zusammenfassen. Ich mache das mit:

git rebase -i HEAD~20

Was ist, wenn ich nicht weiß, wie viele Commits es sind? Gibt es eine Möglichkeit, etwas Ähnliches zu tun wie:

git rebase -i all auf diesem Branch

1124voto

VonC Punkte 1117238

Ein weiterer Weg, um alle Ihre Commits zusammenzufassen, besteht darin, den Index auf master zurückzusetzen:


Hinweis: Der Standard-Branch-Name von Git ist weiterhin master ab Git-Version 2.41 (Q3 2023), wie auf der git init man-Seite zu sehen ist.
Git-Version 2.28 (Q3 2020) führte konfigurierbare Standard-Branch-Namen ein, was bedeutet, dass Ihr Remote-Repository möglicherweise einen anderen Standard-Branch-Namen wie main verwenden kann. Um die universellsten Beispiele bereitzustellen und Verwirrung zu vermeiden, geht diese Antwort von der Standardkonfiguration von Git aus.

Wenn Sie möchten, dass die folgenden Befehle für jeden Standard-Branch funktionieren, ersetzen Sie master durch ${defaultBranch}.
Und definieren Sie defaultBranch=$(git config --get init.defaultBranch || echo main).


Zurück zur Lösung: (um alle Ihre Commits zusammenzufassen) setzen Sie den Index auf master zurück:

git checkout yourBranch
git reset $(git merge-base master $(git branch --show-current))
git add -A
git commit -m "ein Commit auf Ihrem Branch"

Dies ist nicht perfekt, da es voraussetzt, dass Sie wissen, von welchem Branch "yourBranch" stammt.
Hinweis: Das Auffinden des Ursprungs-Branches ist mit Git nicht einfach/möglich (der visuelle Weg ist oft der einfachste, wie hier gesehen).

Hinweis: git branch --show-current wurde mit Git 2.22 (Q2 2019) eingeführt.


Oder, wie von Hiroki Osame in den Kommentaren erwähnt:

git switch yourBranch
git reset --soft $(git merge-base master HEAD)
git commit -m "ein Commit auf Ihrem Branch"
  • keine Notwendigkeit für git branch --show-current, da HEAD bereits eine Referenz auf diesen Branch ist.
  • kein Bedarf für git add -A, da git reset --soft nur HEAD verschiebt und den Index unberührt lässt (mit anderen Worten, die Dateien sind bereits "hinzugefügt").

EDIT: Sie müssen git push --force (oder git push --force-with-lease) verwenden
Siehe "git push --force-with-lease vs. --force"


Karlotcha Hoa fügt in den Kommentaren hinzu:

Für das Zurücksetzen können Sie das Folgende tun

git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD)) 

[Das] verwendet automatisch den Branch, auf dem Sie sich gerade befinden.
Und wenn Sie das verwenden, können Sie auch ein Alias verwenden, da der Befehl nicht vom Branch-Namen abhängt.

653voto

shanky Punkte 5025

Kasse den Zweig aus, für den Sie alle Commits zu einem Commit zusammenfassen möchten. Sagen wir, er heißt feature_branch.

git checkout feature_branch

Schritt 1:

Führen Sie einen Soft-Reset Ihres origin/feature_branch mit Ihrem lokalen main-Zweig durch (je nach Bedarf können Sie auch mit origin/main zurücksetzen). Dadurch werden alle zusätzlichen Commits in Ihrem feature_branch zurückgesetzt, ohne Änderungen an Ihren Dateiänderungen lokal vorzunehmen.

git reset --soft main

Schritt 2:

Fügen Sie alle Änderungen in Ihrem Git-Repo-Verzeichnis zum neuen Commit hinzu, der erstellt werden soll. Und committen Sie dasselbe mit einer Nachricht.

# Dateien für den Commit hinzufügen.
git add ...
git commit -m "Commit-Nachricht hier einfügen"

208voto

Eevee Punkte 45120

Was du machst, ist ziemlich fehleranfällig. Einfach:

git rebase -i master

ausführen, welches automatisch nur die Commits deines Branches auf den aktuellen neuesten master rebased.

183voto

WaZaA Punkte 1700

Ein weiterer einfacher Weg, dies zu tun: Gehen Sie auf den Ursprungsbranch und führen Sie einen merge --squash durch. Dieser Befehl führt keinen "zusammengeführten" Commit durch. Wenn Sie es ausführen, werden alle Commit-Nachrichten Ihres Branches gesammelt.

$ git checkout master
$ git merge --squash yourBranch
$ git commit # alle Commit-Nachrichten Ihres Branches in einem, wirklich nützlich
 > [status 5007e77] Zusammengeführter Commit der folgenden: ...

74voto

mles Punkte 4454

Angenommen, Sie haben sich vom Master-Zweig abgezweigt, müssen Sie nicht jedes Mal IhrZweig im Reset-Schritt eingeben:

git checkout IhrZweig
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "ein Commit auf Ihrem Zweig"

Erklärung:

  • git rev-list --count HEAD ^master zählt die Commits seit dem Zeitpunkt, an dem Sie Ihren Feature-Zweig vom Master abgezweigt haben, z.B. 20.
  • git reset --soft HEAD~20 führt einen Soft-Reset der letzten 20 Commits durch. Dadurch bleiben Ihre Änderungen in den Dateien erhalten, aber die Commits werden entfernt.

Verwendung:

In meiner .bash_profile habe ich ein Alias für gisquash hinzugefügt, um dies mit einem Befehl durchzuführen:

# Alle Commits zu einem zusammenfassen
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'

Nach dem Reset und Commit müssen Sie ein git push --force ausführen.

Hinweis:

Wenn Sie Gitlab >= 11.0 verwenden, müssen Sie dies nicht mehr tun, da es eine Zusammenführungsoption beim Zusammenführen von Zweigen gibt. Gitlab Squashing option

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