530 votes

Sélection partielle d'un commit avec Git

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

J'ai remarqué que je devais encore intégrer certaines modifications qui ont été apportées à la base de données de l'UE. libérer dans la branche développement branche.

Le problème est que je n'ai pas besoin de tout le commit, seulement de quelques morceaux 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 la différence mais je ne connais pas vraiment une bonne façon de l'appliquer partiellement à mon arbre de travail actuel.

1voto

adrock20 Points 105

Utilisez git format-patch pour découper la partie de l'engagement qui vous intéresse et git am pour l'appliquer à une autre branche

git format-patch <sha> -- path/to/file
git checkout other-branch
git am *.patch

0voto

Kaz Points 18072

Si l'expression "sélection partielle" signifie "à l'intérieur des fichiers, choisir certaines modifications et en écarter d'autres", il est possible d'y parvenir en faisant appel à git stash :

  1. Faites le plein de cerises.
  2. git reset HEAD^ pour convertir l'intégralité du commit cueilli à la main en modifications de travail non organisées.
  3. Maintenant git stash save --patch : sélectionnez de manière interactive le matériel indésirable à mettre en réserve.
  4. Git retire les changements cachés de votre copie de travail.
  5. git commit
  6. Jetez la réserve de changements non désirés : git stash drop .

Conseil : si vous donnez un nom à la cachette des changements non désirés : git stash save --patch junk si vous oubliez de faire (6) maintenant, vous reconnaîtrez plus tard la cachette pour ce qu'elle est.

0 votes

Si tu fais juste un cherry-pick, puis un reset... tu n'auras rien à cacher. Comme dit plus haut, vous devez soit faire un cherry-pick avec --no-commit, soit un reset --hard HEAD~. Notez que vous procédez de manière négative (en sélectionnant ce que vous ne voulez pas). Les solutions acceptées ci-dessus permettent une approche positive ou négative.

0voto

无名小路 Points 55

En fait, la meilleure solution pour cette question est d'utiliser checkout féliciter

git checkout <branch> <path1>,<path2> ..

Par exemple, supposons que vous êtes dans maître si vous voulez que les changements de dev1 sur project1/Controller/WebController1.java et project1/Service/WebService1.java vous pouvez utiliser ceci :

git checkout dev1 project1/Controller/WebController1.java project1/Service/WebService1.java

Cela signifie que le maître branche uniquement les mises à jour de dev1 sur ces deux chemins.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X