it-swarm.com.de

So führen Sie ein bestimmtes Commit in Git zusammen

Ich habe einen Zweig aus einem Repository in GitHub gespalten und etwas spezielles für mich festgeschrieben. Jetzt fand ich heraus, dass das ursprüngliche Repository eine gute Funktion hatte, die sich auf HEAD befand.

Ich möchte es nur ohne vorherige Commits zusammenführen. Was soll ich machen? Ich weiß, wie alle Commits zusammengeführt werden:

git branch -b a-good-feature
git pull repository master
git checkout master
git merge a-good-feature
git commit -a
git Push
929
netawater

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

Übernehmen Sie die durch ein vorhandenes Commit eingeführte Änderung.

Vergessen Sie nicht, die Antwort von bdonlan über die Folgen des Pflückens von Kirschen in diesem Beitrag zu lesen:
"Alle Commits aus einem Zweig ziehen, angegebene Commits in einen anderen verschieben" , wobei:

_A-----B------C
 \
  \
   D
_

wird:

_A-----B------C
 \
  \
   D-----C'
_

Das Problem bei diesem Commit ist, dass git Commits so betrachtet, dass sie die gesamte Historie vor sich beinhalten

Wobei C 'eine andere _SHA-1_ ID hat.
Um ein Commit von einem Zweig in einen anderen zu übertragen, muss im Grunde genommen ein Patch generiert und dann angewendet werden, wodurch auch die Historie verloren geht.

Diese Änderung der Festschreibungs-IDs unterbricht unter anderem die Zusammenführungsfunktionalität von Git (wenn sie jedoch sparsam verwendet wird, gibt es Heuristiken, die dies dokumentieren).
Wichtiger ist jedoch, dass funktionale Abhängigkeiten ignoriert - wenn C tatsächlich eine in B definierte Funktion verwendet, werden Sie nie erfahren .

1095
VonC

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

Beispiel: git cherry-pick d42c389f

657
bdonlan

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

Ich habe einen Zweig, etwa master, der auf X <commit-id> zeigt, und ich habe einen neuen Zweig, der auf Y <sha1> zeigt.

Wobei Y <Festschreibungs-ID> = <Hauptzweig> festschreibt - wenige Festschreibungen

Sagen Sie nun für Y-Zweig, dass ich die Commits zwischen dem Master-Zweig und dem neuen Zweig lückenlos schließen muss. Nachfolgend finden Sie die Vorgehensweise, die wir befolgen können:

Schritt 1:

git checkout -b local Origin/new

dabei ist local der Filialname. Es kann ein beliebiger Name vergeben werden.

Schritt 2:

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

Führen Sie die Commits von Hauptzweig zu neuem Zweig zusammen und erstellen Sie ein Merge-Commit der Protokollnachricht mit einzeiligen Beschreibungen von höchstens <n> tatsächlichen Commits, die zusammengeführt werden.

Weitere Informationen und Parameter zu Git Merge finden Sie unter:

git merge --help

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

git cherry-pick <commit-id>
26
Upen