2010-09-21 1 views
26

Zum Beispiel habe ich einen dev Zweig und einen stable Zweig.Merge-Tracking für Git-Kirschen pflücken?

Falls ich einige Commits von dev bis stable ausgewählt habe.

Gibt es eine Möglichkeit, Git die kirschgepinschten Commits bewusst zu machen und zu vermeiden, dass es doppelt verschmelzt, wenn ich später einen überlappenden Bereich von dev zurück zu stable zusammenfasse? (Für die ist eine grundlegende Druckfunktion in SVN-Tracking)

+0

Während Sie wahrscheinlich einen guten Grund haben, dies zu tun, ist es normalerweise eine schlechte Idee, zu viele Commits in einen Zweig zu wählen. –

Antwort

5

Es ist eigentlich ein Befehl namens git cherry, dass jeder druckt verpflichten, dass nicht zwischen zwei Zweigen verschmolzen.

Für jedes gedruckte Commit bedeutet das "+" - Zeichen, dass Sie es zusammenführen können, das "-" - Zeichen bedeutet, dass Sie dieses Commit bereits auswählen.

Die Ausgabe ist alles andere als schön.

Für diejenigen, die aus dem SVN kam und an svnmerge.py verwendet, machte ich eine „svnmerge Erfolg -l“ Äquivalent für git Bash-Skript, das ich gitavail genannt:

#!/bin/bash 

# get current branch 
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) 

# get tracked branch (1st argument), if no arg or arguments are only options, assume master 
if test -z $1 || grep -q '^-' <<< $1; 
then TRACKED_BRANCH=master 
else TRACKED_BRANCH=$1; shift 
fi 

# Log commits available for merge from tracked branch 
LOG_OPTIONS=$* 
for i in $(git cherry $CURRENT_BRANCH $TRACKED_BRANCH | egrep '^\+' | awk '{print $2}'); do git --no-pager log -n1 $i ${LOG_OPTIONS}; echo; done 

Vorausgesetzt, dass Sie auf einem Zweig sind, und Sie möchten, Liste, was berechtigt ist, von der Master-Zweig zu verschmelzen, so laufen:

gitavail --name-status 

und Sie werden eine Ausgabe sehr ähnlich „svnmerge Erfolg -l“ haben.

Ich denke, die Cherry-Pick-Commits müssen nicht manuell geändert werden (was ist mit Konflikten?), Wenn die patch id ändert, Git Kirsche wird nicht erkennen, die Commit wurde bereits ausgewählt Kirsche.

+0

Obwohl ich keine Chance hatte, dies auszuprobieren, scheint es aber genau das zu sein, was ich will. :) +1 und akzeptierte Antwort geht an dich :) –

9

git cherry-pick ist ein lustiger Fall von git rebase statt git merge, so dass es umschreibt eigentlich die commit Sie handverlesene, so dass es die gleichen Änderungen an die Spitze der Branche gelten Du bist in die Kirschen gepflückt. Da gits Commit-IDs auf dem Inhalt des Commits basieren, hat das neue Commit eine andere ID und wird daher als ein ganz anderes Commit von git betrachtet.

git merge, auf der anderen Seite, erstellt ein Merge-Commit; Auf diese Weise implementiert git Merge-Tracking. Ein Merge-Commit markiert einen Punkt, an dem zwei (oder mehr) divergierende Historien konvergieren. Es ist akzeptabel, git merge [commit-id] anstelle von git cherry-pick [commit-id] zu nennen, um explizit ein Zusammenführungs-Commit zu erstellen, aber dies bringt nicht nur die Effekte des einzelnen ausgewählten Commits, sondern auch die gesamte Reihe von Änderungen in der abweichenden Historie dieses Zweiges mit sich.

Mit allem, was gesagt wird, "Double-Merging" ist in der Regel kein Problem in Git. Wenn Sie versuchen, mit einem Verlauf zu verschmelzen, der ein bereits vorhandenes Änderungsset enthält, wird es zu einem Nicht-Op-Objekt, wenn die Historien zusammengeklebt werden. git interessiert sich wirklich nur für den Zustand des Baumes in jedem Commit, nicht für die Änderungen, die ihn in diesen Zustand gebracht haben.

+1

Nur zum Schluss: Es gibt keine Möglichkeit, kirschpicken Commits zu verfolgen. Double-Merging ist normalerweise kein Problem in GIT, ist das richtig? Ich bin über die letztgenannte Aussage etwas unsicher. Ich sehe nichts besonderes in GITs Design, das Doppelverschmelzen weniger problematisch macht als andere Versionskontrollsysteme (wie SVN) –

+0

@Adrian: Stimmen Sie für Doppel-Mergin überein. Es gibt ein potenzielles Problem, wenn sich zwischen den beiden (identischen) Zusammenführungen etwas im Zusammenführungsziel geändert hat. – schoetbi

12

Ebenfalls bemerkenswert ist, dass -x Flag für cherry-pick fügt die SHA des ursprünglichen Commit an das Ende der Commit-Nachricht.

Ich möchte auch die abgekürzte SHA am Ende der Commit-Zusammenfassung hinzufügen, um es einfacher zu machen, die Cherry-Picked Commit mit dem Original zu verknüpfen, wenn Sie das Protokoll betrachten. Anzugeben, wer die Kirsche ausgewählt hat, kann auch hilfreich sein, mit der -s Abmeldungsflagge.

Beispiel:

> git cherry-pick -sex 27d4985

#333: fixes all the things (27d4985) 

- how it fixes all the things 

(cherry picked from commit 27d49855238364d0184ad344884a366b5b16e) 

Signed-off-by: Chuck Norris <[email protected]> 
+1

+1 Ausgezeichnete Punkte. –