Frage Wie man ein bestimmtes Commit in Git zusammenführt


Ich habe einen Zweig von einem Repository in GitHub abgezweigt und etwas Bestimmtes für mich festgelegt. Jetzt fand ich das Original-Repository hatte ein gutes Feature, das war HEAD.

Ich möchte es nur ohne vorherige Commits zusammenführen. Was sollte ich tun? Ich habe gewusst, 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

795
2018-05-19 05:27


Ursprung


Antworten:


"git cherry-pick"sollte deine Antwort hier sein.

Wenden Sie die Änderung an, die durch ein bestehendes Commit eingeführt wurde.

Vergiss nicht zu lesen bdonlan's Antwort über die Konsequenz des Rosinenpickens in diesem Post:
"Ziehen Sie alle Commits von einem Zweig, drücken Sie angegebene Commits zu einem anderen", woher:

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

wird:

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

Das Problem bei diesem Commit besteht darin, dass git Commits als den gesamten Verlauf vor ihnen betrachtet

Wo C 'anders ist SHA-1 ICH WÜRDE.
  Ebenso beinhaltet das Cherry-Picking eines Commits von einem Zweig zu einem anderen grundsätzlich das Generieren eines Patches und das anschließende Anwenden, wodurch die Historie ebenfalls verloren geht.

Diese Änderung der Commit-IDs unterbricht unter anderem die Verschmelzungsfunktion von git (obwohl es bei sparsamer Verwendung Heuristiken gibt, die darüber berichten).
  Wichtiger jedoch, Es ignoriert funktionale Abhängigkeiten - wenn C tatsächlich eine in B definierte Funktion verwendet, werden Sie nie wissen.


958
2018-05-19 05:35



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

Beispiel: git cherry-pick d42c389f


528
2018-05-19 05:35



Lassen Sie uns versuchen, ein Beispiel zu nehmen und zu verstehen:

Ich habe eine Filiale, sag Meister, zeigt auf X <commit-id>, und ich habe einen neuen Zweig, der auf Y <sha1> zeigt.

Woher Y <commit-id> = <master> branch legt fest - wenige commits

Nun sagen wir für Y-Zweig, ich muss die Commits zwischen dem Master-Zweig und dem neuen Zweig schließen. Unten ist das Verfahren, dem wir folgen können:

Schritt 1:

git checkout -b local origin/new

wo local ist der Name der Niederlassung. Jeder Name kann angegeben werden.

Schritt 2:

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

Führen Sie die Commits vom Master-Zweig zum neuen Zweig zusammen und erstellen Sie auch ein Zusammenführungs-Commit der Protokollnachricht mit einzeiligen Beschreibungen aus höchstens <n> tatsächlichen Commits, die zusammengeführt werden.

Weitere Informationen und Parameter zu Git merge finden Sie unter:

git merge --help

Wenn Sie ein bestimmtes Commit zusammenführen müssen, können Sie Folgendes verwenden:

git cherry-pick <commit-id>

13
2018-05-27 05:29