web-dev-qa-db-fra.com

Choisir partiellement un commit avec Git

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.

476
oliver

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.)

747
Cascabel

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?

69
Mike Monkiewicz

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
36
Jay Swain

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.

15
Christian.D

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.

1
jimbo1qaz

Si "cueillette partielle" signifie "dans les fichiers, choisir certaines modifications tout en en rejetant d'autres", vous pouvez le faire en introduisant git stash:

  1. Faites le plein choix de cerises.
  2. git reset HEAD^ pour convertir l'intégralité de la validation sélectionnée en modifications non mises en oeuvre.
  3. Now git stash save --patch: sélectionne de manière interactive les matériaux non désirés à stocker.
  4. Git annule les modifications cachées de votre copie de travail.
  5. git commit
  6. Jetez la réserve de modifications indésirables: 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.

0
Kaz