Je travaille sur 2 branches différentes: release et development.
J'ai remarqué que je devais encore intégrer certaines modifications qui avaient été engagées dans la branche version dans la branche développement.
Le problème, c’est que je n’ai pas besoin de tous les commit, il n’ya que quelques mecs dans certains fichiers, donc un simple
git cherry-pick bc66559
ne fait pas l'affaire.
Quand je fais un
git show bc66559
Je peux voir le diff mais je ne connais pas vraiment un bon moyen de l'appliquer partiellement à mon arbre de travail actuel.
La chose principale que vous souhaiterez ici est git add -p
(-p
est un synonyme de --patch
). Cela fournit un moyen interactif d’archiver le contenu, vous permettant de décider si chaque morceau doit être intégré, et même de vous permettre d’éditer manuellement le patch si nécessaire.
Pour l'utiliser en combinaison avec le choix de la cerise:
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 à Félix Rabe pour avoir signalé que vous devez réinitialiser! Si vous voulez seulement laisser quelques points en dehors du commit , vous pouvez utiliser git reset <path>...
pour décompresser uniquement ces fichiers.)
Vous pouvez bien sûr fournir des chemins spécifiques à 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 va comparer le commit actuel au commit que vous spécifiez, et vous permettra d’appliquer des morceaux de ce diff individuellement. Cette option peut être plus utile si la validation que vous extrayez présente des conflits de fusion dans une partie de la validation qui ne vous intéresse pas. (Notez cependant que checkout
diffère de cherry-pick
: checkout
tente d'appliquer entièrement le contenu de <commit>
, cherry-pick
applique le diff du commit spécifié à partir de son parent. Cela signifie que checkout
peut appliquer davantage que ce commit, qui peut être plus long. que vous voulez.)
Je sais que je réponds à une vieille question, mais il semble qu'il existe une nouvelle façon de procéder avec la vérification interactive:
git checkout -p bc66559
Crédit à Puis-je choisir de manière interactive des morceaux dans un autre commit git?
En supposant que les modifications souhaitées se trouvent en tête de la branche dans laquelle vous souhaitez les modifier, utilisez git checkout.
pour un seul fichier:
git checkout branch_that_has_the_changes_you_want path/to/file.rb
pour plusieurs fichiers, connectez simplement en guirlande:
git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb
En vous appuyant sur Mike Monkiewicz answer, vous pouvez également spécifier un ou plusieurs fichiers à extraire de la branche sha1/branche fournie.
git checkout -p bc66559 -- path/to/file.Java
Cela vous permettra de choisir de manière interactive les modifications que vous souhaitez appliquer à votre version actuelle du fichier.
Si vous souhaitez spécifier une liste de fichiers sur la ligne de commande et effectuer le tout dans une seule commande atomique, essayez:
git apply --3way <(git show -- list-of-files)
--3way
: Si un patch ne s'applique pas correctement, Git créera un conflit de fusion afin que vous puissiez exécuter git mergetool
. Si vous omettez --3way
, Git abandonnera les correctifs qui ne s’appliquent pas proprement.
Si "cueillette partielle" signifie "dans les fichiers, choisir certaines modifications tout en en rejetant d'autres", vous pouvez le faire en introduisant git stash
:
git reset HEAD^
pour convertir l'intégralité de la validation sélectionnée en modifications non mises en oeuvre.git stash save --patch
: sélectionne de manière interactive les matériaux non désirés à stocker.git commit
git stash drop
.Conseil: si vous attribuez un nom à la réserve de modifications non désirées: git stash save --patch junk
, puis si vous oubliez de le faire (6) maintenant, vous reconnaîtrez plus tard la réserve.