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

37voto

Alok Tripathi Punkte 614

Lösung - 1

A. Ziehen Sie Master in Ihren Feature-Branch (Stellen Sie sicher, dass Sie Ihren Master aktualisieren)

git pull origin master  

B. Setzen Sie den Master zurück

git reset --soft master

C. Machen Sie Ihre Änderungen

git commit -m “Commit-Nachricht"

D. Führen Sie git push aus

git push --force  

Lösung - 2

Commit zusammenführen mit git rebase

A.

$git rebase -i HEAD~3  (HEAD~)

B. Sie erhalten eine interaktive Aufforderung, in der Sie den obersten Commit auswählen und squash or s vor denjenigen einfügen müssen, die Sie kombinieren/zusammenführen möchten.

Hinweis: Stellen Sie sicher, dass Sie die Änderungen im Einfügemodus vornehmen und die Datei speichern (wq im VI Editor)

C. Nun erhalten Sie eine weitere interaktive Aufforderung, in der Sie die Nachrichten der Commits, die Sie nicht wollen, mit # versehen oder Ihre eigene Nachricht hinzufügen müssen. Speichern Sie erneut die Datei, und Ihre Commits werden erfolgreich neu basiert.

Prost!

30voto

seebi Punkte 369

Da ich einige Probleme mit den hier vorgeschlagenen Lösungen hatte, möchte ich eine wirklich einfache Lösung teilen (die wirklich funktioniert, unabhängig davon):

git merge origin/master && git reset --soft origin/master

Der vorhergehende Merge-Befehl stellt sicher, dass keine kürzlichen Änderungen von Master auf Ihren Kopf übertragen werden, wenn Sie committen! Danach einfach die Änderungen committen und git push -f ausführen

25voto

Travis Reeder Punkte 34348

Basierend auf dem Lesen mehrerer Stackoverflow-Fragen und -Antworten zum Thema Squashen, denke ich, dass dies eine gute Einzeiler-Lösung ist, um alle Commits in einem Branch zusammenzufassen:

git reset --soft $(git merge-base master DEIN_BRANCH) && git commit -am "DEINE COMMIT-NACHRICHT" && git rebase -i master

Dies setzt voraus, dass master der Basis-Branch ist.

19voto

Caveman Punkte 1734

Wie

Sie müssen die Basis Ihres Zweiges erhalten

git merge-base master your-branch
# 566f8438e0cd0e331ceb49a9cb0920143dfb065c

Dann können Sie sich daran anpassen

git rebase -i 566f8438e0cd0e331ceb49a9cb0920143dfb065c
# dann squash/pick/do commit messages

oder einfach ein Soft-Reset durchführen und alles bestätigen

git reset --soft 566f8438e0cd0e331ceb49a9cb0920143dfb065c
git add .
git commit -m "Der einzige Commit"

Automatisieren

Wenn Sie dies häufig tun, können Sie es automatisieren, indem Sie diese in Ihre .bashrc einfügen

g-rebase-branch() {
  git branch --show-current | xargs git merge-base master | xargs git rebase -i
}

g-one-commit() {
  lokaler last_commit_message=`git show -s --format=%s`
  git branch --show-current | xargs git merge-base master | xargs git reset --soft
  git add -A
  git commit -m "$last_commit_message"
  git commit --amend
}

und dann diese direkt im Terminal ausführen.

g-one-commit

aber wenn Sie gegen einen anderen Zweig als master zusammenführen, dann können Sie master durch "$1" ersetzen, um dies zu tun

g-one-commit staging

13voto

Rich Apodaca Punkte 26962

Um Cavemans Antwort etwas zu verfeinern, verwenden Sie git reset --soft . Laut der Dokumentation tut dieser Befehl folgendes:

Berührt weder die Indexdatei noch den Arbeitsbaum (setzt jedoch den Kopf auf , genau wie alle Modi es tun). Alle geänderten Dateien bleiben als "Änderungen, die übernommen werden sollen", wie git status es ausdrücken würde.

Mit anderen Worten, es macht alle deine Commits bis zu rückgängig. Aber es ändert nicht das Arbeitsverzeichnis. Du hast alle Änderungen ungestaged und uncommited. Es ist so, als ob die dazwischenliegenden Commits nie passiert wären.

Beispiel:

# auf dem Master
git checkout -b testzweig
# mache viele Commits
git reset --soft master
git add .
git commit -m 'Der einzige Commit.'

Zu diesem Zeitpunkt bist du immer noch auf testzweig, der einen einzigen Commit hat. Führe die Zusammenführung in den Master wie gewohnt durch.

Der erste Teil von Cavemans Antwort (git rebase -i) hat bei mir keine Commits zusammengeführt.

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