Question En partie cherchant un commit avec Git


Je travaille sur 2 branches différentes: Libération et développement.

J'ai remarqué que je dois encore intégrer certains changements qui ont été engagés dans le Libération branche dans le développement branche.

Le problème est que je n'ai pas besoin de tout le commit, seulement 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.


432
2017-10-06 14:47


origine


Réponses:


La chose de base que vous allez vouloir ici est git add -p (-p est 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 le 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! , tu pourrais utiliser git reset <path>... pour débloquer seulement 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 avec 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 différencier le commit actuel du commit que vous avez spécifié, et vous permettre d'appliquer des hunks de ce diff individuellement. Cette option peut être plus utile si la validation que vous effectuez a des conflits de fusion dans une partie de la commande qui ne vous intéresse pas (notez cependant que checkout diffère de cherry-pick: checkout essaie d'appliquer <commit>le contenu entièrement, cherry-pick applique le diff de la validation spécifiée de son parent. Cela signifie que checkout peut appliquer plus que juste ce commit, ce qui pourrait être plus que ce que vous voulez.)


675
2017-10-06 14:51



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

git checkout -p bc66559

Crédit à Puis-je sélectionner des mecs d'un autre git commit de manière interactive?


63
2018-06-29 04:46



En supposant que les modifications souhaitées se situent en tête de la branche 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 juste en guirlande:

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

35
2018-02-01 06:06



Bâtir sur Mike Monkiewicz répondez, vous pouvez également spécifier un ou plusieurs fichiers à extraire du sha1 / branche fourni.

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

Cela vous permettra de choisir interactivement les modifications que vous souhaitez appliquer à votre version actuelle du fichier.


12
2017-10-24 12:48



Si "cueillir partiellement les cerises" signifie "au sein des fichiers, choisir des changements mais en supprimer d’autres", cela peut être fait en introduisant git stash:

  1. Faites le choix complet de la cerise.
  2. git reset HEAD^ convertir l'intégralité de la validation sélectionnée en changements de travail non planifiés.
  3. À présent git stash save --patch: sélectionne interactivement le matériel indésirable à stocker.
  4. Git annule les modifications cachées de votre copie de travail.
  5. git commit
  6. Jetez la réserve de changements non désirés: git stash drop.

Astuce: si vous donnez à la réserve de modifications indésirables un nom: git stash save --patch junk alors si vous oubliez de faire (7) maintenant, plus tard vous reconnaîtrez la cachette pour ce qu'elle est.


1
2018-05-14 05:25