Vor kurzem wurde ich zu cherry-pick
einem Commit aufgefordert .
Was bedeutet es also, ein Commit in Git zu pflücken? Wie machst du das?
Vor kurzem wurde ich zu cherry-pick
einem Commit aufgefordert .
Was bedeutet es also, ein Commit in Git zu pflücken? Wie machst du das?
Antworten:
Cherry Picking in Git bedeutet, ein Commit aus einem Zweig auszuwählen und auf einen anderen anzuwenden.
Dies steht im Gegensatz zu anderen Methoden wie merge
und, rebase
die normalerweise viele Commits auf einen anderen Zweig anwenden.
Stellen Sie sicher, dass Sie sich in dem Zweig befinden, auf den Sie das Commit anwenden möchten.
git checkout master
Führen Sie Folgendes aus:
git cherry-pick <commit-hash>
NB:
Wenn Sie aus einer öffentlichen Filiale auswählen, sollten Sie die Verwendung in Betracht ziehen
git cherry-pick -x <commit-hash>
Dadurch wird eine standardisierte Festschreibungsnachricht generiert. Auf diese Weise können Sie (und Ihre Mitarbeiter) weiterhin den Ursprung des Commits verfolgen und künftige Zusammenführungskonflikte vermeiden.
Wenn Sie dem Commit Notizen beigefügt haben, folgen diese nicht dem Cherry-Pick. Um sie auch zu bringen, müssen Sie verwenden:
git notes copy <from> <to>
Zusätzliche Links:
git cherry-pick -x <commit-hash>
. Dadurch wird eine standardisierte Festschreibungsnachricht generiert. Auf diese Weise können Sie (und Ihre Mitarbeiter) weiterhin den Ursprung des Commits verfolgen und künftige Zusammenführungskonflikte vermeiden.
git notes copy <from> <to>
, um sie auch zu bringen.
"cherry-pick commit applies the changes introduced by the named commit on the current branch"
Most vorgenommen hat ppl neigen dazu, Commit als Änderungen zu betrachten (wie svn was iirc war), aber es ist nicht so, dass sich jedes Commit auf den vollständigen Arbeitsbaum bezieht. Obwohl dies in diesem Fall keinen Unterschied macht, kann es helfen zu verstehen, warum Git so funktioniert.
Dieses Zitat stammt aus; Versionskontrolle mit Git (Wirklich tolles Buch, ich empfehle Ihnen, es zu kaufen, wenn Sie an Git interessiert sind)
Bearbeiten: Da diese Antwort immer noch Eindruck macht, möchte ich ein sehr schönes Video-Tutorial dazu hinzufügen:
Youtube: Einführung in Git Cherry-Pick
Verwenden von git cherry-pick Der Befehl git cherry-pick commit wendet die Änderungen an, die durch das benannte Commit auf den aktuellen Zweig eingeführt wurden. Es wird ein neues, eindeutiges Commit eingeführt. Genau genommen ändert die Verwendung von Git Cherry-Pick nichts an der vorhandenen Historie in einem Repository. Stattdessen wird der Verlauf erweitert. Wie bei anderen Git-Vorgängen, die Änderungen über das Anwenden eines Diff einführen, müssen Sie möglicherweise Konflikte lösen, um die Änderungen aus dem angegebenen Commit vollständig anzuwenden . Der Befehl git cherry-pick wird normalerweise verwendet, um bestimmte Commits von einem Zweig innerhalb eines Repositorys in einen anderen Zweig einzuführen. Eine häufige Verwendung ist das Vorwärts- oder Rückwärtsportieren von Commits von einem Wartungszweig zu einem Entwicklungszweig.
$ git checkout rel_2.3
$ git cherry-pick dev~2 # commit F, above
Vor:
nach:
Cherry Picking in Git wurde entwickelt, um ein Commit von einem Zweig auf einen anderen Zweig anzuwenden. Es kann getan werden, wenn Sie z. einen Fehler gemacht und eine Änderung in einen falschen Zweig begangen haben, aber nicht den gesamten Zweig zusammenführen möchten. Sie können nur zB. Setzen Sie das Commit zurück und wählen Sie es in einem anderen Zweig aus.
Um es zu verwenden, brauchen Sie nur git cherry-pick hash
, wo hash
sich ein Commit-Hash von einem anderen Zweig befindet.
Das vollständige Verfahren finden Sie unter: http://technosophos.com/2009/12/04/git-cherry-picking-move-small-code-patches-across-branches.html
Kurzes Beispiel für eine Situation, in der Sie Kirschbaum brauchen
Betrachten Sie das folgende Szenario. Sie haben zwei Zweige.
a) release1 - Dieser Zweig geht an Ihren Kunden, es müssen jedoch noch einige Fehler behoben werden.
b) master - Klassischer Master-Zweig, in dem Sie beispielsweise Funktionen für Release2 hinzufügen können.
JETZT : Sie reparieren etwas in Release1 . Natürlich brauchen Sie diesen Fix auch im Master . Und das ist ein typischer Anwendungsfall für die Kirschernte. Cherry Pick in diesem Szenario bedeutet also, dass Sie ein Commit aus dem Release1- Zweig übernehmen und in den Master- Zweig aufnehmen.
Cherry-Pick ist eine Git-Funktion. Wenn jemand bestimmte Commits in einem Zweig für einen Zielzweig festschreiben möchte, wird Cherry-Pick verwendet.
Git Cherry-Pick-Schritte sind wie folgt.
git cherry-pick <commit id>
Hier ist die Festschreibungs-ID die Aktivitäts-ID eines anderen Zweigs.
git cherry-pick 9772dd546a3609b06f84b680340fb84c5463264f
Besuchen Sie https://git-scm.com/docs/git-cherry-pick
Ich habe Schritt für Schritt Illustrationen vorbereitet, was Cherry-Pick macht - und eine Animation dieser Illustrationen (gegen Ende).
git cherry-pick feature~2
feature~2
ist das 2. Festschreiben vor feature
, dh das Festschreiben L
):
Hinweis:
Das Commit L'
ist aus Sicht des Benutzers (Commit = Snapshot) die genaue Kopie des Commits L
.
Technisch (intern) handelt es sich um ein neues, anderes Commit (da z. B. L
ein Zeiger auf K
(als übergeordnetes Element) und ein Zeiger auf ( L'
enthält E
).
Sie können sich vorstellen, ob ein Kirschpickel einem Rebase ähnelt oder eher wie ein Rebase verwaltet wird. Damit meine ich, dass ein vorhandenes Commit verwendet und neu generiert wird, wobei als Ausgangspunkt der Leiter des Zweigs verwendet wird, in dem Sie sich gerade befinden.
A rebase
nimmt ein Commit mit einem übergeordneten X und generiert das Commit neu, als hätte es tatsächlich ein übergeordnetes Y, und genau das cherry-pick
tut a.
Bei Cherry Pick geht es mehr darum, wie Sie die Commits auswählen. Mit pull
(rebase) regeneriert git implizit Ihre lokalen Commits zusätzlich zu dem, was in Ihren Zweig gezogen wird. cherry-pick
Wählen Sie jedoch explizit einige Commits aus und generieren Sie sie implizit über Ihrem aktuellen Zweig neu.
Die Art und Weise, wie Sie es tun, ist also unterschiedlich, aber unter der Haube sind sie sehr ähnliche Vorgänge - die Regeneration von Commits.
cherry-pick
sich das Verhalten so verhält, wenn der Zielzweig später wieder mit dem Quellzweig zusammengeführt wird. Danke mein Herr.
Es ist wie Kopieren (von irgendwoher) und Einfügen (von irgendwoher), aber für bestimmte Commits.
Wenn Sie beispielsweise einen Hotfix durchführen möchten, können Sie die cherry-pick
Funktion verwenden.
Tun Sie dies cherry-pick
in einem Entwicklungszweig, und merge
dieser verpflichtet sich zu einem Release-Zweig. Führen Sie ebenfalls einen cherry-pick
von einem Release-Zweig zum Master aus. Voila
Wenn Sie mit einem Entwicklerteam an einem Projekt arbeiten, kann das Verwalten der Änderungen zwischen mehreren Git-Zweigen zu einer komplexen Aufgabe werden. Manchmal möchten Sie nicht einen ganzen Zweig in einen anderen zusammenführen und müssen nur ein oder zwei bestimmte Commits auswählen. Dieser Vorgang wird als "Kirschernte" bezeichnet.
Sie haben einen großartigen Artikel zum Thema Kirschernte gefunden. Weitere Informationen finden Sie unter: https://www.previousnext.com.au/blog/intro-cherry-picking-git
Wenn Sie ohne Festschreibungs-IDs zusammenführen möchten, können Sie diesen Befehl verwenden
git cherry-pick master~2 master~0
Mit dem obigen Befehl werden die letzten drei Commits des Masters von 1 bis 3 zusammengeführt
Wenn Sie dies für ein einzelnes Commit tun möchten, entfernen Sie einfach die letzte Option
git cherry-pick master~2
Auf diese Weise führen Sie das dritte Commit ab dem Ende des Masters zusammen.
Es wird ein bestimmtes Commit auf Ihre aktuelle Niederlassung angewendet.
Das heisst :
Beispiel: Betrachten Sie Commit A.
added newFileA
modified main:
+ import './newFileA'
begehen B.
added newFileB
modified main:
+ import './newFileB'
Wenn Sie Commit B für einen anderen Zweig auswählen , erhalten Sie Folgendes:
/newFileB
/main :
import './newFileA'
import './newFileB'
Da Commit B newFileB und main enthält , aber kein newFileA , was zu einem Fehler führt, sollten Sie es mit Vorsicht verwenden.
Auszug aus den offiziellen Dokumenten:
Wenden Sie bei einem oder mehreren vorhandenen Commits die jeweils vorgenommene Änderung an und zeichnen Sie für jedes ein neues Commit auf. Dies setzt voraus, dass Ihr Arbeitsbaum sauber ist (keine Änderungen durch das HEAD-Commit).
Wenn nicht klar ist, wie eine Änderung angewendet werden soll, geschieht Folgendes:
Der aktuelle Zweig und der HEAD-Zeiger bleiben beim letzten erfolgreich durchgeführten Commit.
Die CHERRY_PICK_HEAD-Referenz zeigt auf das Commit, das die Änderung eingeführt hat, die schwer anzuwenden ist.
Pfade, in denen die Änderung sauber angewendet wurde, werden sowohl in der Indexdatei als auch in Ihrem Arbeitsbaum aktualisiert.
Bei widersprüchlichen Pfaden zeichnet die Indexdatei bis zu drei Versionen auf, wie im Abschnitt "TRUE MERGE" von git-merge beschrieben. Die Arbeitsbaumdateien enthalten eine Beschreibung des Konflikts in Klammern mit den üblichen Konfliktmarkierungen <<<<<<< und >>>>>>>.
Es werden keine weiteren Änderungen vorgenommen.