1222 Stimmen

Wie kopiert man Commits von einem Branch in einen anderen?

Ich habe zwei Verzweigungen von meinem Master:

  • v2.1 (Version 2), an dem ich seit mehreren Monaten arbeite
  • wss : die ich gestern erstellt habe, um eine bestimmte Funktion zu meinem Master (in Produktion) hinzuzufügen

Gibt es eine Möglichkeit, die gestrigen Übertragungen von wss nach v2.1 zu kopieren?

1488voto

Benjamin Bannier Punkte 50065

Verwenden Sie

git cherry-pick <commit>

zu beantragen <commit> zu Ihrem aktuelle Branche .

Ich selbst würde wahrscheinlich die von mir ausgewählten Übertragungen in gitk und wählen Sie sie stattdessen mit einem Rechtsklick auf den Commit-Eintrag dort aus.


Wenn Sie es noch automatischer machen wollen (mit all seinen Gefahren) und davon ausgehen, dass alle Commits seit gestern auf wss passiert sind, können Sie die Liste der Commits mit git log (mit --pretty vorgeschlagen von Jefromi)

git log --reverse --since=yesterday --pretty=%H

also alles zusammen, vorausgesetzt, Sie verwenden bash

for commit in $(git log --reverse --since=yesterday --pretty=%H);
do
    git cherry-pick $commit
done

Wenn hier etwas schief geht (es gibt viele Möglichkeiten), sind Sie in Schwierigkeiten, da dies auf dem Live-Checkout funktioniert, also machen Sie entweder manuelle Cherry-Picks oder verwenden Sie Rebase wie von Jefromi vorgeschlagen.

731voto

Cascabel Punkte 449595

Sie sollten wirklich einen Arbeitsablauf haben, mit dem Sie das alles durch Zusammenführen erledigen können:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (wss)

Alles, was Sie also tun müssen, ist git checkout v2.1 et git merge wss . Wenn Sie dies aus irgendeinem Grund nicht tun können, und Sie können nicht mit Git-Rebase um Ihren wss-Zweig an die richtige Stelle zu verschieben, lautet der Befehl, um einen einzelnen Commit von irgendwoher zu nehmen und ihn anderswo anzuwenden Git-Pick . Checken Sie einfach den Zweig aus, auf den Sie es anwenden wollen, und führen Sie git cherry-pick <SHA of commit to cherry-pick> .

Einige der Möglichkeiten, wie Sie mit rebase sparen können:

Wenn Ihre Geschichte wie folgt aussieht:

- x - x - x (v2) - x - x - x (v2.1)
           \
            x - x - x (v2-only) - x - x - x (wss)

Sie könnten verwenden git rebase --onto v2 v2-only wss um wss direkt auf v2 zu übertragen:

- x - x - x (v2) - x - x - x (v2.1)
          |\
          |  x - x - x (v2-only)
           \
             x - x - x (wss)

Dann können Sie fusionieren! Wenn Sie wirklich, wirklich, realmente nicht bis zu dem Punkt kommen, an dem Sie zusammenführen können, können Sie immer noch Rebase verwenden, um effektiv mehrere Cherry-Picks auf einmal durchzuführen:

# wss-starting-point is the SHA1/branch immediately before the first commit to rebase
git branch wss-to-rebase wss
git rebase --onto v2.1 wss-starting-point wss-to-rebase
git checkout v2.1
git merge wss-to-rebase

Hinweis: Der Grund dafür, dass dies zusätzliche Arbeit erfordert, ist, dass es doppelte Commits in Ihrem Repository erzeugt. Das ist nicht wirklich eine gute Sache - der Sinn des einfachen Verzweigens und Zusammenführens ist es, alles zu tun, indem man Commits an einem Ort macht und sie dort zusammenführt, wo sie gebraucht werden. Doppelte Commits bedeuten, dass Sie nie die Absicht haben, diese beiden Zweige zusammenzuführen (falls Sie sich später dazu entscheiden, werden Sie Konflikte bekommen).

135voto

git cherry-pick : Übernehmen Sie die Änderungen, die durch einige bestehende Commits eingeführt wurden

Angenommen, wir haben einen Zweig A mit (X, Y, Z) Übertragungen. Wir müssen diese Commits zum Branch hinzufügen B . Wir werden die cherry-pick Operationen.

Wenn wir die cherry-pick sollten wir Commits zum Zweig hinzufügen B in der gleichen chronologischen Reihenfolge, in der die Commits im Branch erscheinen A .

cherry-pick unterstützt einen Bereich von Commits, aber wenn Sie Merge-Commits in diesem Bereich haben, wird es wirklich kompliziert

git checkout B
git cherry-pick SHA-COMMIT-X
git cherry-pick SHA-COMMIT-Y
git cherry-pick SHA-COMMIT-Z

Beispiel für einen Arbeitsablauf:

enter image description here

Wir können verwenden cherry-pick con Optionen

-e oder --edit : Mit dieser Option können Sie mit git cherry-pick die Commit-Nachricht vor dem Commit bearbeiten.

-n oder --no-commit : Normalerweise erstellt der Befehl automatisch eine Reihe von Übertragungen. Diese Option wendet die Änderungen an, die notwendig sind, um jeden benannten Commit in Ihren Arbeitsbaum und den Index zu übernehmen, ohne einen Commit zu machen. Außerdem muss Ihr Index nicht mit dem HEAD-Commit übereinstimmen, wenn diese Option verwendet wird. Der Cherry-Pick wird gegen den Anfangszustand des Indexes durchgeführt.

Hier eine interessante Artikel betreffend cherry-pick .

87voto

Angenommen, ich habe Änderungen am Master-Zweig vorgenommen. Ich erhalte die Commit-ID ( xyz ) der Übergabe jetzt. Dann muss ich zu dem Zweig gehen, für den ich meine Commits pushen muss.

Einzelne Commit-ID xyz

git checkout branch-name
git cherry-pick xyz
git push origin branch-name

Mehrere Commit-Id's xyz abc qwe

git checkout branch-name
git cherry-pick xyz abc qwe
git push origin branch-name

41voto

paradocslover Punkte 2528

Die bereits erwähnten Antworten decken das meiste ab, aber eine Sache, die zu fehlen scheint, ist die --no-commit Eigenschaft von cherry-pick ing.

Angenommen, Sie haben mehr als einen Commit auf dem Feature-Branch und wollen alle in einen einzigen Commit zusammenführen und auf den Hauptzweig legen. In diesem Fall müssen Sie Folgendes tun:

git checkout <branch-on-which-to-add-features>
git cherry-pick --no-commit <commit-hash>
git cherry-pick --no-commit <commit-hash>
.
.
.

Und schließlich, sobald Sie cherry-pick Wenn Sie alle erforderlichen Funktionen eingerichtet haben, können Sie eine endgültige Übergabe vornehmen:

git commit -m "Some message for the merge commit"

Im Idealfall, als @Cascabel erwähnt, sollten Sie die merge ou rebase . Wenn Sie jedoch das Gefühl haben, dass Sie keine andere Wahl haben, können Sie sich damit begnügen, die cherry-pick ing.

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