En partie choisir un engagement avec Git

Je travaille sur 2 twigs différentes: release et développement .

J’ai remarqué que je devais encore intégrer des modifications apscopes à la twig de publication dans la twig de développement .

Le problème est que je n’ai pas besoin de tous les commit, seulement de quelques pièces dans certains fichiers, donc une simple

git cherry-pick bc66559 

ne fait pas le tour.

Quand je fais un

 git show bc66559 

Je peux voir la différence mais je ne sais pas vraiment comment l’appliquer partiellement à mon arbre de travail actuel.

La principale chose que vous voulez ici est git add -p ( -p est un synonyme de --patch ). Cela fournit un moyen interactif de vérifier le contenu, vous permettant de décider si chaque morceau doit entrer et même de vous permettre de modifier manuellement le patch si nécessaire.

Pour l’utiliser en combinaison avec cerise-pick:

 git cherry-pick -n  # 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! , vous pouvez utiliser git reset ... pour ne décompresser que ces fichiers.)

Vous pouvez bien sûr fournir des chemins spécifiques pour 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 (cette option n’existe pas), vous pouvez utiliser

 git checkout -p  

Cela diffère la validation actuelle par rapport à la validation que vous spécifiez, et vous permet d’appliquer individuellement des points de ce diff. Cette option peut être plus utile si la validation que vous tirez contient des conflits de fusion dans une partie de la commande qui ne vous intéresse pas. (Notez toutefois que cette checkout diffère de cherry-pick : checkout tente d’appliquer ‘ s contenu entièrement, cherry-pick applique le diff du commit spécifié à partir de son parent, ce qui signifie que le checkout peut s’appliquer plus que ce commit, ce qui peut être plus que ce que vous voulez.

Je sais que je réponds à une vieille question, mais il semble qu’il y ait une nouvelle façon de procéder en vérifiant de manière interactive:

 git checkout -p bc66559 

Crédit pour Puis-je choisir de manière interactive des pièces d’un autre git commit?

En supposant que les modifications souhaitées se situent en tête de la twig dont vous voulez les modifications, utilisez la commande git checkout.

pour un seul fichier:

 git checkout branch_that_has_the_changes_you_want path/to/file.rb 

pour plusieurs fichiers simplement en guirlande:

 git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb 

En vous basant sur la réponse de Mike Monkiewicz, vous pouvez également spécifier un ou plusieurs fichiers à extraire de la twig sha1 / fournie.

 git checkout -p bc66559 -- path/to/file.java 

Cela vous permettra de sélectionner de manière interactive les modifications que vous souhaitez appliquer à votre version actuelle du fichier.

Si “cueillette partielle des cerises” signifie “au sein des fichiers, en choisissant des modifications mais en en supprimant d’autres”, cela peut se faire en git stash :

  1. Faites le plein choix de cerises.
  2. git reset HEAD^ pour convertir tout l’engagement engagé en cerises en changements de travail non
  3. Now git stash save --patch : sélectionne de manière interactive le matériel indésirable à ranger.
  4. Git annule les modifications apscopes à votre copie de travail.
  5. git commit
  6. Jetez la réserve de changements indésirables: git stash drop .

Astuce: si vous donnez un nom aux modifications non désirées: git stash save --patch junk puis si vous oubliez de le faire (7) maintenant, vous reconnaîtrez plus tard ce que c’est.