Question

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

Je remarqué que je dois encore intégrer quelques changements qui ont été engagés à version branche dans le développement branche.

Le problème est que je ne ai pas besoin tous les commettre, seuls quelques gros morceaux dans certains fichiers, si simple

git cherry-pick bc66559

ne fait pas l'affaire.

Quand je fais

git show bc66559

Je peux voir la diff mais ne sais pas vraiment une bonne façon d'appliquer cette partie à mon arbre de travail actuel.

Était-ce utile?

La solution

La chose principale que vous allez vouloir ici est git add -p (-p est synonyme de --patch). Ceci fournit une manière interactive pour vérifier le contenu, vous permettant de décider si chaque morceau devrait aller, et même vous permettant de modifier manuellement le patch si nécessaire.

Pour l'utiliser en combinaison avec écrémer:

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 me rappeler que git-écrémer a une option --no-commit, et grâce à Felix Rabe de remarquer que vous devez réinitialiser! Si vous voulez seulement laisser quelques choses du commettras, vous pouvez utiliser git reset <path>... à désindexer 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), peut utiliser votre

git checkout -p <commit>

Cela diff le commit courant contre la vous vous engagez spécifiez, et vous permettent d'appliquer Hunks de cette diff individuellement. Cette option peut être plus utile si le vous vous engagez tiriez en a des conflits de fusion dans une partie du vous commettez n'êtes pas intéressé par (Notez toutefois que checkout diffère de cherry-pick. checkout essaie d'appliquer le contenu de <commit> entièrement, cherry-pick applique la diff de commettre spécifié de son parent. Cela signifie que checkout peut demander plus que cela commettras, ce qui pourrait être plus que vous voulez.)

Autres conseils

Je sais que je réponds à une question ancienne, mais il semble que il y a une nouvelle façon de le faire avec le contrôle de manière interactive sur:

git checkout -p bc66559

Puis-je choisir de manière interactive Hunks d'un autre git commit

En supposant que les changements que vous voulez sont à la tête de la branche que vous voulez que les changements de, utilisez git checkout

pour un seul fichier:

git checkout branch_that_has_the_changes_you_want path/to/file.rb

pour plusieurs fichiers chaîne juste daisy:

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

Miser sur Mike Monkiewicz réponse que vous pouvez également spécifier un seul fichier ou plus à la caisse de la SHA1 / branche fourni.

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

Cela vous permettra de choisir de manière interactive les changements que vous voulez avoir appliqué à votre version actuelle du fichier.

Si vous souhaitez spécifier une liste de fichiers sur la ligne de commande, et d'obtenir le tout fait en une seule commande atomique, essayez:

git apply --3way <(git show -- list-of-files)

--3way: Si un patch ne concerne pas proprement, Git crée un conflit de fusion afin que vous puissiez exécuter git mergetool. Omettre --3way fera Git abandonner sur les patchs qui ne sont pas applicables proprement.

Si « en partie picorage » signifie « dans les fichiers, en choisissant quelques changements, mais d'autres le rejet », il peut être fait en apportant git stash:

  1. Faites le plein de choix cerise.
  2. git reset HEAD^ pour convertir l'ensemble de la cerise pris en engager des changements de travail Unstaged.
  3. Maintenant git stash save --patch: interactive sélectionner matériel non désiré stash
  4. .
  5. Git annule les modifications planqué de votre copie de travail.
  6. git commit
  7. Jeter la réserve de modifications non souhaitées: git stash drop.

Astuce: si vous donnez la réserve de modifications non souhaitées d'un nom:. git stash save --patch junk alors si vous oubliez de le faire (6) maintenant, plus tard, vous reconnaîtrez la planque pour ce qu'il est

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top