git cherry-pick ou de fusion répertoire spécifique d'une autre branche
J'ai vu des différents posts sur StackOverflow qui expliquent le "cherry picking" un peu, mais les commentaires dans leur code ne sont pas très précis quant à ce qui est une branche et qu'est ce qu'un annuaire. Exemple git checkout A -- X Y
ne m'en dit pas beaucoup.
Fondamentalement, je veux ceci:
- Créer une nouvelle branche
featureA
hors demaster
- De fusion répertoire
/tools/my-tool
à partir de la branchedev
enfeatureA
- Règle générale, quand il y a un
--
dans une commande git comme ça, sur la gauche est un nom de branche ou de commettre prescripteur, sur la droite sont des chemins d'accès. - Pourquoi avez-vous besoin cherrypicking pour qui? Vous pouvez simplement créer fusionner manuellement le répertoire.
- merci @torek. ce que j'ai fait était un
git checkout dev -- tools/my-tool
Vous devez vous connecter pour publier un commentaire.
Pour répondre à la question initiale sur la façon de cherry-pick certains répertoires (comme il s'engage à la place d'une force brute de départ), c'est possible. Imaginez que
featureA
a divergé demaster
et que vous souhaitez mettre sur letools/my-tool
s'engage.Ainsi, vous obtenez la liste des s'engage à
master
danstools/my-tool
(qui ne sont pas déjà dansfeatureA
), dans l'ordre chronologique inverse l'ordre:Pour le dire d'une autre façon:
Pour obtenir les changements que vous avez besoin dans l'ordre chronologique, vous devez d'abord annuler l'ordre des lignes d'entrée (comme avec
tail -r
outac
), puis isoler la colonne pour la validation de hachage (comme aveccut
):Et de faire l'ensemble de l'opération à la fois, ce faire:
git log --pretty=tformat:"%h" --no-merges featureA...master tools/my-too | tail -r
git filter-branch
etgit for-each-ref
.tac
outail -r
etcut
, on peut aussi utilisergit rev-list --no-merges --reverse
pour simplement faire une liste de révision des Id/hachages dans l'ordre inverse directement.Remarque:
git cherry-pick
est à propos de l'application d'une pleine commit (ou s'engage) à une autre branche. Il n'y a pas de notion de "chemin".git checkout
est à propos de la mise à jour de l'arbre de travail (etHEAD
si aucun chemin n'est spécifié, effectivement commutation branches)Votre
git checkout dev -- tools/my-tool
mises à jour d'un chemin d'accès spécifique, mais ce n'est pas une "fusion" ou un "git cherry-pick".