La chose principale que vous voudrez ici est git add -p
( -p
est un synonyme de --patch
). Cela fournit un moyen interactif pour archiver le contenu, vous permettant de décider si chaque morceau doit entrer, et même de vous permettre de modifier manuellement le correctif si nécessaire.
Pour l'utiliser en combinaison avec du cerisier:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset # unstage the changes from the cherry-picked commit
git add -p # make all your choices (add the changes you do want)
git commit # make the commit!
(Merci à Tim Henigan de m'avoir rappelé que git-cherry-pick a une option --no-commit, et merci à Felix Rabe d'avoir souligné que vous devez réinitialiser! Si vous ne voulez laisser que quelques éléments en dehors du commit , vous pouvez utiliser git reset <path>...
pour supprimer uniquement ces fichiers.)
Vous pouvez bien sûr fournir des chemins spécifiques vers add -p
si nécessaire. Si vous commencez avec un patch, vous pouvez remplacer le cherry-pick
par apply
.
Si vous voulez vraiment un git cherry-pick -p <commit>
(cette option n'existe pas), vous pouvez utiliser
git checkout -p <commit>
Cela diffère la validation actuelle par rapport à la validation que vous spécifiez et vous permet d'appliquer des morceaux à partir de cette différence individuellement. Cette option peut être plus utile si la validation que vous tirez contient des conflits de fusion dans une partie de la validation qui ne vous intéresse pas. (Notez cependant que cela checkout
diffère de cherry-pick
: checkout
essaie d'appliquer <commit>
entièrement le contenu cherry-pick
de la validation spécifiée de son parent. Cela signifie que vous checkout
pouvez appliquer plus que cette validation, qui peut être supérieure à celle que vous souhaitez.)
cherry-pick -n
apparemment , les modifications n'aient pas été mises en scène - la convention est définitivement que les--no-commit
options s'arrêtent juste avant la validation, c'est-à-dire avec toutes les modifications mises en scène. Je vais ajouter la réinitialisation dans la réponse.git checkout -p <F>
ne pas seulement vous obtenir les changements de F, il vous permet de vous ABCDEF tous ensemble et réduites en purée vous permet de trier quelle partie de ce que vous voulez . Réduire cela à quelques-uns des changements de F est une douleur. D'un autre côté,git cherry-pick -n <F>
vous obtenez uniquement les modifications de F - et si certaines de ces modifications entrent en conflit, il vous indique utilement afin que vous puissiez comprendre comment fusionner correctement.git reset
supprimerait les fichiers intermédiaires et leadd -p
dirait simplement «rien à ajouter».Je sais que je réponds à une vieille question, mais il semble qu'il y ait une nouvelle façon de le faire avec la vérification interactive:
Crédit à Puis-je choisir interactivement des morceaux d'un autre git commit?
la source
En supposant que les modifications que vous souhaitez sont à la tête de la branche dont vous souhaitez les modifications, utilisez git checkout
pour un seul fichier:
pour plusieurs fichiers, connectez simplement en guirlande:
la source
En vous appuyant sur la réponse de Mike Monkiewicz, vous pouvez également spécifier un ou plusieurs fichiers à extraire de la branche sha1 / branchée fournie.
Cela vous permettra de sélectionner de manière interactive les modifications que vous souhaitez appliquer à votre version actuelle du fichier.
la source
Si vous souhaitez spécifier une liste de fichiers sur la ligne de commande et obtenir le tout en une seule commande atomique, essayez:
git apply --3way <(git show -- list-of-files)
--3way
: Si un correctif ne s'applique pas correctement, Git créera un conflit de fusion afin que vous puissiez l'exécutergit mergetool
. L'omission obligera--3way
Git à abandonner les correctifs qui ne s'appliquent pas proprement.la source
Si "cueillette en partie" signifie "dans les fichiers, en choisissant certaines modifications mais en en supprimant d'autres", cela peut être fait en introduisant
git stash
:git reset HEAD^
pour convertir l'intégralité du commit choisi par la cerise en changements de travail non organisés.git stash save --patch
: sélectionnez interactivement le matériel indésirable à ranger.git commit
git stash drop
.Astuce: si vous donnez un nom à la cachette des modifications indésirables:
git stash save --patch junk
alors si vous oubliez de faire (6) maintenant, plus tard, vous reconnaîtrez la cachette pour ce qu'elle est.la source
Utilisez
git format-patch
pour découper la partie du commit qui vous intéresse etgit am
pour l'appliquer à une autre branchela source