J'ai deux branches. Commit a
est la tête d'un, tandis que l'autre a b
, c
, d
, e
et f
sur le dessus a
. Je veux bouger c
, d
, e
et f
à première branche sans commettre b
. En utilisant la cerise choisir , il est facile: la caisse première branche cerise choisir un par un c
à f
et rebasage seconde branche sur la première. Mais existe-t-il un moyen de tout sélectionner c
- f
en une seule commande?
Voici une description visuelle du scénario (merci JJD ):
b
être vous baserf
plus tard, mais cela n'a rien à voir avec la cueillette des cerises.)Réponses:
Git 1.7.2 a introduit la possibilité de choisir une gamme de commits. D'après les notes de version :
Pour sélectionner toutes les validations de commit
A
à commitB
(oùA
est plus ancien queB
), exécutez:Si vous voulez ignorer A lui-même, exécutez:
(Nous remercions Damian, JB Rainsberger et sschaef dans les commentaires)
la source
git cherry-pick A^..B
git cherry-pick f~3
puisgit cherry-pick f~2
etc. jusqu'àgit cherry-pick f
(en appuyant sur la flèche vers le haut , vous obtenez la commande précédente afin que je puisse rapidement changer le nombre et exécuter devrait être similaire dans la plupart des consoles).git cherry-pick master..somebranch
sélectionnera tous les commits sur une branche depuis master (en supposant qu'il est déjà rebasé sur master) et les appliquera à votre branche actuelle.La façon la plus simple de le faire est avec l'
onto
option derebase
. Supposons que la branche qui se termine en cours àa
est appelé mybranch et c'est la branche que vous souhaitez déplacerc
-f
sur.la source
git checkout secondbranch && git rebase mybranch
pour une réponse complèterebase
le mode interactif de. Merci, @Charles!--interactive
pour supprimer certains commits de la séquence ou les réorganiser avant la "sélection de cerise". +1b
dans cet exemple) mais oui, cela a fonctionné pour moi.Ou le monoplace demandé:
la source
Vous pouvez utiliser une combinaison série de
git rebase
etgit branch
pour appliquer un groupe de validations à une autre branche. Comme déjà signalé par wolfc, la première commande copie en fait les commits. Cependant, la modification n'est pas visible tant que vous n'ajoutez pas un nom de branche au plus haut commit du groupe.Veuillez ouvrir l'image dans un nouvel onglet ...
Pour résumer les commandes sous forme de texte:
gitk --all &
.git rebase --onto a b f
.HEAD
est marqué.git branch selection
Cela devrait clarifier les choses:
a
est la nouvelle destination racine du groupe.b
est le commit avant le premier commit du groupe (exclusif).f
est le dernier commit du groupe (inclus).Ensuite, vous pouvez utiliser
git checkout feature && git reset --hard b
pour supprimer les commitsc
tillf
de lafeature
branche.En plus de cette réponse, j'ai écrit un article de blog qui décrit les commandes dans un autre scénario qui devrait aider à l'utiliser généralement.
la source
git rebase --onto a b mybranch
et btw - quel programme ces images git astucieuses?Pour appliquer les commentaires de JB Rainsberger et sschaef pour répondre spécifiquement à la question ... Pour utiliser une plage de sélection sur cet exemple:
ou
la source
git 2.7.0.windows.1
et j'ai remarqué que lorsque j'essaie de choisir une gamme de validations, tout est ok mais git ne vous dit nulle part ce que vous devez fairegit cherry-pick --continue | --abort | --quit
avant d'essayer de valider / cherry-pick à nouveau. Donc, si vous choisissez une gamme de validations, vous devrez exécutergit cherry-pick --continue
chaque fois que vous êtes prêt (résolution de conflits ou autre) avec une validation de la plage donnée.^
après le c signifie en fait "la validation avant c" qui est b dans ce cas. C'est pourquoic^..f
est également synonyme deb..f
. Essayez de fairegit log c^..f
et vous devriez voir les commits c à f, exactement comme si vous l'avez faitgit log b..f
Si vous avez des révisions sélectives à fusionner, dites A, C, F, J à partir des validations A, B, C, D, E, F, G, H, I, J, utilisez simplement la commande ci-dessous:
la source
la source
git cherry-pick {hash of c}; git cherry-pick {hash of d}; ...
Pour sélectionner un ID de validation jusqu'à la pointe de la branche, vous pouvez utiliser:
git cherry-pick commit_id^..branch_name
la source
Une autre variante qui mérite d'être mentionnée est que si vous voulez que les dernières
n
validations proviennent d'une branche, la~
syntaxe peut être utile:Dans ce cas, la commande ci-dessus sélectionnerait les 4 derniers commits d'une branche appelée
some-branch
(bien que vous puissiez également utiliser un hachage de validation à la place d'un nom de branche)la source
En fait, la façon la plus simple de le faire pourrait être de:
MERGE_BASE=$(git merge-base branch-a branch-b)
rebase la branche résultante sur elle-même, en commençant à la base de fusion de l'étape 1, et supprimez manuellement les validations qui ne sont pas souhaitées:
Sinon, s'il n'y a que quelques nouveaux validations, sautez l'étape 1 et utilisez simplement
dans la première étape, en utilisant suffisamment
^
pour dépasser la base de fusion.Vous verrez quelque chose comme ça dans le rebase interactif:
Supprimez ensuite les lignes b (et toutes les autres que vous souhaitez)
la source
la source
Voici un script qui vous permettra de sélectionner plusieurs validations consécutives en indiquant simplement au script les branches source et cible des sélections de cerises et le nombre de validations:
https://gist.github.com/nickboldt/99ac1dc4eb4c9ff003a1effef2eb2d81
Pour sélectionner à partir de votre branche vers master (utilise la branche actuelle comme source):
Pour sélectionner les 5 derniers commits de votre branche 6.19.x à masteriser:
la source