wake-up-neo.com

So wählen Sie mehrere Commits aus

Ich habe zwei Zweige. Commit a ist der Kopf des einen, während der andere b, c, d, e und f über a hat. Ich möchte c, d, e und f in den ersten Zweig verschieben, ohne b festzuschreiben. Mit cherry pick ist es ganz einfach: checkout first branch cherry pick eins nach dem anderen c bis f und rebase second branch auf first Aber gibt es eine Möglichkeit, alle c-f in einem Befehl auszuwählen?

Hier ist eine visuelle Beschreibung des Szenarios (danke JJD ):

enter image description here

725
tig

Mit Git 1.7.2 wurde die Möglichkeit eingeführt, eine Reihe von Commits zu cherrypicken. Aus dem Versionshinweise :

git cherry-pick "hat gelernt, eine Reihe von Commits auszuwählen (z. B." cherry-pick A..B "und" cherry-pick --stdin "), und" git revert "hat dies auch nicht unterstützt." rebase [-i] "hat jedoch.


Einschließlich wichtiger Kommentare (Dank an die jeweiligen Autoren)

Anmerkung 1: In der "cherry-pick A..B" -Form sollte A älter als B sein. Wenn sie die falsche Reihenfolge haben, geben Sie den Befehl ein wird im stillen scheitern. - Damian

Anmerkung 2: Auch hier wird nicht A ausgewählt, sondern alles nach A bis einschließlich B. - J. B. Rainsberger

Anmerkung 3: Um A einzuschließen, geben Sie einfach git cherry-pick A ^ .. B - sschaef ein

1066
Eric Darchis

Am einfachsten geht dies mit der Option onto auf rebase. Angenommen, der Zweig, der aktuell bei a endet, heißt mybranch, und dies ist der Zweig, auf den Sie c-f verschieben möchten.

# checkout mybranch
git checkout mybranch

# reset it to f (currently includes a)
git reset --hard f

# rebase every commit after b and transplant it onto a
git rebase --onto a b
91
CB Bailey

Oder den gewünschten Einzeiler:

git rebase --onto a b f
77
wolfc

Sie können eine serielle Kombination von git rebase und git branch verwenden, um eine Gruppe von Commits auf einen anderen Zweig anzuwenden. Wie schon gepostet von wolfc kopiert der erste Befehl tatsächlich die Commits. Die Änderung ist jedoch erst sichtbar, wenn Sie dem obersten Commit der Gruppe einen Zweignamen hinzufügen.

Bitte öffnen Sie das Bild in einem neuen Tab ...

Workflow

So fassen Sie die Befehle in Textform zusammen:

  1. Öffnen Sie gitk als unabhängigen Prozess mit dem Befehl: gitk --all &.
  2. Führen Sie git rebase --onto a b f aus.
  3. Drücken Sie F5 in gitk . Nichts verändert sich. Es ist jedoch kein HEAD markiert.
  4. git branch selection ausführen
  5. Drücken Sie F5 in gitk . Der neue Zweig mit seinen Commits wird angezeigt.

Dies sollte die Dinge klarstellen:

  • Commit a ist das neue Stammziel der Gruppe.
  • Commit b ist das Commit vor dem ersten Commit der Gruppe (exklusiv).
  • Commit f ist das letzte Commit der Gruppe (einschließlich).

Anschließend können Sie mit git checkout feature && git reset --hard b die Commits c bis f aus dem Zweig feature löschen.

Zusätzlich zu dieser Antwort habe ich einen Blog-Beitrag geschrieben, der die Befehle in einem anderen Szenario beschreibt, die bei der allgemeinen Verwendung helfen sollten.

59
JJD

Anwenden der Kommentare von J. B. Rainsberger und sschaef zur gezielten Beantwortung der Frage ... Verwenden eines Cherry-Pick-Bereichs für dieses Beispiel:

git checkout a
git cherry-pick b..f

oder

git checkout a
git cherry-pick c^..f
37
Andy

Wenn Sie selektive Überarbeitungen zum Zusammenführen haben, sagen Sie A, C, F, J von A, B, C, D, E, F, G, H, I, J-Commits, verwenden Sie einfach den folgenden Befehl:

git Cherry-Pick A C F J

19
git rev-list --reverse b..f | xargs -n 1 git cherry-pick
18
Dustin

Der einfachste Weg, dies zu tun, könnte sein:

  1. zeichnen Sie die Zusammenführungsbasis zwischen den beiden Zweigen auf: MERGE_BASE=$(git merge-base branch-a branch-b)
  2. vorspulen oder Zurücksetzen des älteren Zweigs auf den neueren Zweig
  3. setzen Sie den resultierenden Zweig erneut auf sich selbst, beginnend mit der Zusammenführungsbasis ab Schritt 1, und entfernen Sie nicht gewünschte Commits manuell:

    git rebase ${SAVED_MERGE_BASE} -i
    

    Wenn es nur wenige neue Festschreibungen gibt, überspringen Sie alternativ Schritt 1 und verwenden Sie einfach

    git rebase HEAD^^^^^^^ -i
    

    verwenden Sie im ersten Schritt genügend ^, um an der Zusammenführungsbasis vorbei zu gelangen.

Sie werden so etwas in der interaktiven Datenbank sehen:

pick 3139276 commit a
pick c1b421d commit b
pick 7204ee5 commit c
pick 6ae9419 commit d
pick 0152077 commit e
pick 2656623 commit f

Dann entfernen Sie die Zeilen b (und alle anderen, die Sie wollen)

3
ealfonso
git format-patch --full-index --binary --stdout range... | git am -3
3
Roger Wang

Um von einer Festschreibungs-ID bis zur Spitze des Zweigs eine Festschreibungs-ID auszuwählen, können Sie Folgendes verwenden:

git cherry-pick commit_id^..branch_name

2
ut9081

Hier ist ein Skript, mit dem Sie mehrere Commits hintereinander auswählen können, indem Sie dem Skript einfach mitteilen, welche Quell- und Zielzweige für die Cherry-Picks und die Anzahl der Commits verwendet werden:

https://Gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81

So wählen Sie einen Zweig für den Master aus (verwendet den aktuellen Zweig als Quelle):

./gcpl.sh -m

So wählen Sie die letzten 5 Commits aus Ihrem 6.19.x-Zweig zum Master aus:

./gcpl.sh -c 5 -s 6.19.x -t master
0
nickboldt