Question Valider seulement une partie d'un fichier dans Git


Lorsque je modifie un fichier dans Git, comment puis-je valider uniquement certains de ces changements?

Par exemple, comment pourrais-je commettre seulement 15 lignes sur 30 lignes qui ont été changées dans un fichier?


2237
2017-07-06 02:25


origine


Réponses:


Vous pouvez utiliser git add --patch <filename> (ou -p pour faire court), et git commencera à décomposer votre fichier en ce qu'il pense être "hunks" sensible (parties du fichier). Il vous demandera alors avec cette question:

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

Voici une description de chaque option:

  • y mettre en scène ce morceau pour le prochain commit
  • n ne pas mettre en scène ce morceau pour le prochain commit
  • q quitter; ne pas mettre en scène ce morceau ou l'un des autres mecs
  • une étape ce morceau et tous les mecs plus tard dans le fichier
  •  ne pas mettre en scène ce morceau ou l'un des mecs plus tard dans le fichier
  • g sélectionnez un morceau pour aller à
  • / rechercher un morceau correspondant à la regex donnée
  • j laisser ce morceau indécis, voir le prochain morceau indécis
  • J laisser ce morceau indécis, voir prochain morceau
  • k laisser ce morceau indécis, voir précédent morceau indécis
  • K laisser ce morceau indécis, voir le morceau précédent
  • s diviser le morceau actuel en plus petits mecs
  • e modifier manuellement le morceau actuel
  • ? aide à l'impression

Si le fichier n'est pas encore dans le référentiel, vous pouvez d'abord le faire git add -N <filename>. Ensuite, vous pouvez continuer avec git add -p <filename>.

Ensuite, vous pouvez utiliser:
git diff --staged pour vérifier que vous avez effectué les modifications correctes
git reset -p pour désynchroniser les mecs ajoutés par erreur
git commit -v pour afficher votre validation pendant que vous modifiez le message de validation.

Notez que c'est très différent du git format-patch commande, qui est d'analyser les données de validation dans un .patch des dossiers.

Référence pour l'avenir: https://git-scm.com/book/fr/v2/Git-Tools-Interactive-Staging


2931
2017-07-06 11:49



Vous pouvez utiliser git add --interactive ou git add -p <fichier>, et alors git commit (ne pas  git commit -a) voir Mode interactif dans git-add manpage, ou suivez simplement les instructions.

Modern Git a aussi git commit --interactive (et git commit --patch, qui est raccourci à l'option de correctif dans la validation interactive).

Si vous préférez le faire depuis l'interface graphique, vous pouvez utiliser git-gui. Vous pouvez simplement marquer les morceaux que vous voulez inclure dans la validation. Personnellement, je trouve cela plus facile que d'utiliser git add -i. D'autres interfaces graphiques git, comme QGit ou GitX, peuvent également avoir cette fonctionnalité.


215
2017-07-06 02:41



git gui fournit cette fonctionnalité sous la vue diff. Faites un clic droit sur la ou les lignes qui vous intéressent et vous devriez voir un élément de menu «mettre en ligne cette ligne à commettre».


115
2017-09-25 20:45



je crois que git add -e myfile est le moyen le plus simple (au moins pour ma préférence) puisqu'il ouvre simplement un éditeur de texte et vous permet de choisir quelle ligne vous voulez mettre en scène et quelle ligne vous n'avez pas. En ce qui concerne les commandes d'édition:

contenu ajouté:

Le contenu ajouté est représenté par des lignes commençant par "+". Vous pouvez empêcher la mise en scène des lignes d'addition en les supprimant.

contenu supprimé:

Le contenu supprimé est représenté par des lignes commençant par "-". Vous pouvez empêcher leur retrait en convertissant le "-" en "" (espace).

contenu modifié:

Le contenu modifié est représenté par des lignes "-" (supprimant l'ancien contenu) suivies de lignes "+" (ajout du contenu de remplacement). Vous pouvez empêcher la mise en scène de la modification en convertissant les lignes "-" en "" et en supprimant "+"              lignes. Méfiez-vous que modifier seulement la moitié de la paire est susceptible d'introduire des changements confus à l'index.

Tous les détails sur git add sont disponibles sur git --help add 


55
2018-02-23 10:37



Si vous utilisez vim, vous pouvez essayer l'excellent plugin appelé fugitif.

Vous pouvez voir le diff d'un fichier entre la copie de travail et l'index avec :Gdiff, puis ajoutez des lignes ou des hunks à l'index en utilisant les commandes vim diff classiques comme dp. Enregistrer les modifications dans l'index et valider avec :Gcommit, et tu as fini.

Très bons screencasts d'introduction ici (voir esp. partie 2).


41
2017-08-12 13:32



Je recommande fortement d'utiliser SourceTree d'Atlassian. (C'est gratuit.) Cela rend cela trivial. Vous pouvez mettre en scène des centaines de codes ou des lignes de code individuelles rapidement et facilement.

enter image description here


26
2017-12-05 17:29



Il vaut la peine d'utiliser git add --patch pour un nouveau fichier vous devez d'abord ajouter le fichier à indexer avec git add --intent-to-add:

git add -N file
git add -p file

20
2018-06-06 22:14



Quand j'ai beaucoup de changements, et que je vais créer quelques commits à partir des changements, alors je veux enregistrer mon point de départ temporairement avant de mettre les choses en scène.

Comme ça:

$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop

La réponse de Whymarr est ce que je fais habituellement, sauf parfois il y a beaucoup de changements et je peux dire que je pourrais me tromper en mettant en scène des choses, et je veux un état engagé sur lequel je peux revenir pour un second passage.


17
2017-07-08 07:00



Si vous utilisez emacs, jetez un oeil à Magit, qui fournit une interface git pour emacs. Elle supporte mettre en scène des mecs (parties de fichiers) plutôt bien.


12
2017-08-07 13:25



Tout comme la réponse de jdsumsion, vous pouvez également stocker votre travail actuel, puis utiliser un outil de type difftool pour extraire les modifications sélectionnées de la cachette. De cette façon, vous pouvez même éditer les mecs manuellement très facilement, ce qui est un peu pénible git add -p:

$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop

L'utilisation de la méthode de stockage vous permet de tester si votre code fonctionne encore avant de le valider.


7
2017-07-27 09:52



Pour ceux qui utilisent Git Extensions:

Dans la fenêtre Valider, sélectionnez le fichier que vous souhaitez valider partiellement, puis sélectionnez le texte que vous voulez valider dans le volet de droite, puis cliquez avec le bouton droit de la souris sur la sélection et choisissez 'Sélectionner les lignes sélectionnées' dans le menu contextuel.


7
2018-01-09 17:11