1350 Stimmen

Wie man einen bestimmten Commit in Git zusammenführt

Ich habe einen Zweig aus einem Repository in GitHub geforkt und etwas für mich Spezifisches committed. Jetzt habe ich festgestellt, dass das ursprüngliche Repository eine gute Funktion hatte, die bei HEAD .

Ich möchte sie nur ohne vorherige Übertragungen zusammenführen. Was soll ich tun? Ich weiß, wie man alle Commits zusammenführt:

git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git push

1447voto

VonC Punkte 1117238

' git cherry-pick ' sollte hier Ihre Antwort sein.

Übernehmen Sie die Änderung, die durch eine bestehende Übertragung eingeführt wurde.

Vergessen Sie nicht zu lesen bdonlan Antwort über die Folgen der Rosinenpickerei in diesem Beitrag:
"Alle Übertragungen aus einem Zweig ziehen, bestimmte Übertragungen in einen anderen Zweig schieben" , wobei:

A-----B------C
 \
  \
   D

wird:

A-----B------C
 \
  \
   D-----C'

Das Problem bei diesem Commit ist, dass Git alle vorherigen Commits als mit eingeschlossen betrachtet

Wobei C' eine andere SHA-1 ID.
Ebenso bedeutet die Auswahl eines Commits von einem Zweig zu einem anderen, dass man einen Patch erstellt und ihn dann anwendet, wodurch auch die Geschichte verloren geht.

Dieses Ändern der Commit-IDs macht unter anderem die Zusammenführungsfunktion von Git kaputt (obwohl es bei sparsamer Verwendung Heuristiken gibt, die dies überspielen).
Aber noch wichtiger ist, es ignoriert funktionale Abhängigkeiten - wenn C tatsächlich eine in B definierte Funktion verwendet, werden Sie es nie erfahren .

960voto

bdonlan Punkte 213545

Sie können git cherry-pick verwenden, um einen einzelnen Commit auf Ihren aktuellen Zweig anzuwenden.

Ejemplo: git cherry-pick d42c389f

58voto

Shital Shah Punkte 54846

Nehmen wir an, Sie wollen eine Übertragung zusammenführen e27af03 von Zweig X nach Master.

git checkout master
git cherry-pick e27af03
git push

48voto

Brain2000 Punkte 4207

Früher habe ich immer die Kirschen gepflückt, aber von Zeit zu Zeit hatte ich einige mysteriöse Probleme. Ich bin auf einen Blog von Raymond Chen gestoßen, der seit 25 Jahren bei Microsoft arbeitet und einige Szenarien beschreibt, in denen Cherry Picking in bestimmten Fällen Probleme verursachen kann.

Eine Faustregel besagt, dass es früher oder später zu Problemen kommen wird, wenn man von einem Zweig in einen anderen wechselt und dann zwischen diesen Zweigen zusammenführt.

Hier ein Verweis auf die Blogs von Raymond Chen zu diesem Thema: https://devblogs.microsoft.com/oldnewthing/20180312-00/?p=98215

Das einzige Problem, das ich mit Raymonds Blog hatte, ist, dass er kein vollständiges Arbeitsbeispiel zur Verfügung gestellt hat. Also werde ich versuchen, eine hier zu bieten.

In der obigen Frage wird gefragt, wie man nur den Commit zusammenführt, auf den der HEAD in der a-good-feature verzweigen zu Meister .

Dies würde folgendermaßen ablaufen:

  1. Finden Sie den gemeinsamen Vorfahren zwischen den Meister y a-good-feature Zweige.
  2. Erstellen Sie einen neuen Zweig von diesem Vorgänger, nennen wir ihn neuer Zweig Patch .
  3. Wählen Sie eine oder mehrere Übertragungen in diese neue Patch Zweigstelle.
  4. Führen Sie den Patch-Zweig in beide die Meister und a-good-feature Zweige.
  5. Le site Meister Zweig enthält nun die Übertragungen, und beide Meister y a-good-feature Zweige haben auch einen neuen gemeinsamen Vorfahren, der alle zukünftigen Probleme lösen wird, wenn später weitere Zusammenführungen vorgenommen werden.

Hier ist ein Beispiel für diese Befehle:

git checkout master...a-good-feature  [checkout the common ancestor]
git checkout -b patch
git cherry-pick a-good-feature  [this is not only the branch name, but also the commit we want]
git checkout master
git merge patch
git checkout a-good-feature
git merge -s ours patch

Es ist vielleicht erwähnenswert, dass die letzte Zeile, die in die a-good-feature Zweig verwendet die " -s unser Zusammenführungsstrategie". Der Grund dafür ist, dass wir einfach eine Übergabe in der a-good-feature Zweig, der auf einen neuen gemeinsamen Vorfahren verweist, und da sich der Code bereits in diesem Zweig befindet, wollen wir sicherstellen, dass es nicht zu einem Merge-Konflikt kommt. Dies wird noch wichtiger, wenn die Übergabe(n), die Sie zusammenführen, nicht die neuesten sind.

Die Szenarien und Details rund um partielle Zusammenführungen können ziemlich tiefgründig sein, daher empfehle ich, alle 10 Teile des Blogs von Raymond Chen zu lesen, um ein umfassendes Verständnis dafür zu erlangen, was schiefgehen kann, wie man es vermeiden kann und warum es funktioniert.

36voto

Spyder Punkte 804

Versuchen wir, ein Beispiel zu nehmen und zu verstehen:

Ich habe einen Zweig, sagen wir Meister , die auf X <commit-id> zeigt, und ich habe einen neuen Zweig, der auf Y <sha1> zeigt.

Wo Y <commit-id> = <master> branch commits - wenige Übertragungen

Angenommen, ich muss für den Zweig Y die Lücken zwischen den Commits des Master-Zweigs und des neuen Zweigs schließen. Nachfolgend die Vorgehensweise, die wir befolgen können:

Schritt 1:

git checkout -b local origin/new

wobei local der Name der Verzweigung ist. Es kann ein beliebiger Name angegeben werden.

Schritt 2:

  git merge origin/master --no-ff --stat -v --log=300

Führt die Commits aus dem Master-Zweig in den neuen Zweig zusammen und erstellt außerdem eine Merge-Commit-Log-Nachricht mit einzeiligen Beschreibungen von maximal <n> tatsächlichen Commits, die zusammengeführt werden.

Weitere Informationen und Parameter zu Git Merge finden Sie unter:

git merge --help

Auch wenn Sie einen bestimmten Commit zusammenführen müssen, können Sie dies tun:

git cherry-pick <commit-id>

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