Correction seulement d'une partie du fichier dans Git

Lorsque je modifie un fichier dans Git, comment puis-je ne faire que quelques-unes de ces modifications?

Par exemple, comment puis-je exécuter seulement 15 lignes de 30 lignes qui ont été modifiées dans un fichier?

2394
06 июля '09 в 5:25 2009-07-06 05:25 freddiefujiwara est fixée au 06 juillet 09 à 09h25 2009-07-06 05:25
@ 22 réponses

Vous pouvez utiliser git add --patch <filename> (ou -p en abrégé), et git commencera à diviser votre fichier en ce qu’il considère comme des "morceaux" raisonnables (parties du fichier). Ensuite, il vous dira cette question:

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

Voici une description de chaque option:

  • y préparer cette pièce pour le prochain commit
  • n ne met pas cette pièce pour le prochain commit
  • q sortie; ne mettez pas cette pièce ni aucune des pièces restantes
  • un met cette pièce et tous les fragments ultérieurs dans le fichier
  • d ne pas mettre ce bloc ou tout fragment ultérieur dans le fichier
  • g sélectionner un morceau pour aller à
  • / recherche un bloc qui correspond à l'expression régulière spécifiée
  • j laisse cette partie non résolue, voir la prochaine pièce non résolue
  • J laisse cette partie non résolue, voir la suivante
  • k laissez cette pièce non résolue, voir la pièce précédente non résolue
  • K laisser cette question en suspens, voir la pièce précédente
  • s divise la pièce actuelle en fragments plus petits
  • e éditer manuellement le bloc actuel
  • ? aide d'impression

Si le fichier ne se trouve pas déjà dans le référentiel, vous pouvez d'abord faire en git add -N <filename> . Après cela, vous pouvez continuer avec git add -p <filename> .

Après cela, vous pouvez utiliser:

  • git diff --staged pour vous assurer de mettre les changements corrects
  • git reset -p pour annuler les fragments ajoutés par erreur
  • git commit -v pour afficher votre commit tout en modifiant un message de commit.

Notez que cette commande est très différente de la commande git format-patch , qui vise à analyser les données .patch fichiers .patch .

Lien vers le futur: Git Tools - Production interactive

3149
06 июля '09 в 5:36 2009-07-06 05:36 la réponse est donnée par cloudhead le 06 juillet 09 à 09:36 2009-07-06 05:36

Vous pouvez utiliser git add --interactive ou git add -p <file> , puis git commit ( pas git commit -a ); voyez le mode interactif dans la page de manuel git-add ou suivez simplement les instructions.

Modern Git a également git commit --interactive (et git commit --patch , qui est un raccourci vers le paramètre patch dans la validation interactive).

border=0

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

223
06 июля '09 в 14:49 2009-07-06 14:49 la réponse est donnée par Jakub Narębski le 06 juillet 09 à 14:49 2009-07-06 14:49

git gui fournit cette fonctionnalité sous forme de diff. Faites un clic droit sur la ligne qui vous intéresse et vous verrez l’option de menu "Cette ligne à corriger".

118
06 июля '09 в 5:41 2009-07-06 05:41 La réponse a été donnée par Ionuț G. Stan le 06 juillet 09 à 09h41. 2009-07-06 05:41

Je pense que git add -e myfile est le moyen le plus simple (du moins ma préférence), car il ouvre simplement l’éditeur de texte et vous permet de choisir la ligne que vous voulez exécuter et celle que vous n’aurez 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 création de lignes d’addition en les supprimant.

contenu distant:

Le contenu supprimé est représenté par des chaînes commençant par "-". Vous pouvez empêcher leur suppression en convertissant "-" en "" (espace).

contenu modifié:

Le contenu modifié est représenté par les lignes "-" (suppression de l'ancien contenu), suivies des lignes "+" (ajout de contenu de remplacement). Vous pouvez empêcher l'installation d'une modification en convertissant les chaînes "-" en "" et en supprimant les lignes "+". N'oubliez pas que le fait de ne changer que la moitié d'une paire peut entraîner des changements d'index source de confusion.

Chaque git add est disponible sur git --help add

64
25 сент. la réponse est donnée par theFreedomBanana 25 septembre 2015-09-25 23:45 '15 à 23h45 2015-09-25 23:45

Si vous utilisez vim, vous pouvez essayer un excellent plugin appelé fugitive .

Vous pouvez voir un fichier diff entre une copie de travail et un index avec :Gdiff , puis ajouter des lignes ou des colonnes à l'index à l'aide des commandes vim diff classiques, telles que dp . Enregistrez les modifications apportées à l'index et copiez-le avec :Gcommit , et vous avez terminé.

Très bonnes vidéos d'introduction ici (voir partie 2 ).

42
23 февр. La réponse est donnée par François le 23 février. 2012-02-23 13:37 '12 à 13h37 2012-02-23 13:37

Je recommande fortement d'utiliser SourceTree d'Atlassian. (C'est gratuit.) Cela le rend trivial. Vous pouvez créer rapidement et facilement des morceaux de code individuels ou des lignes de code individuelles.

2019

29
12 авг. la réponse est donnée par l' utilisateur486646 le 12 août. 2014-08-12 16:32 '14 à 16:32 2014-08-12 16:32

Il est à noter que pour utiliser git add --patch dans un nouveau fichier, vous devez d'abord ajouter le fichier à l'index à l'aide de git add --intent-to-add :

 git add -N file git add -p file 
22
05 дек. La réponse est donnée par l' utilisateur1338062 05 déc. 2014-12-05 20:29 14 à 20:29 2014-12-05 20:29

Lorsque j'ai beaucoup de modifications et que je crée éventuellement quelques commits, je souhaite enregistrer temporairement mon point de départ avant de créer des éléments.

La voici:

 $ 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 Whymarh est ce que je fais habituellement, à l'exception du fait que parfois de nombreux changements se produisent, et je peux dire que je peux faire une erreur en réglant les choses, et je veux qu'un État se retire au deuxième passage. .

19
07 июня '13 в 1:14 2013-06-07 01:14 la réponse est donnée jdsumsion Juin 07 '13 à 1:14 2013-06-07 01:14

Si vous utilisez emacs, consultez Magit , qui fournit l'interface git pour emacs. Il supporte bien les fragments intermédiaires (parties de fichiers).

12
08 июля '09 в 10:00 2009-07-08 10:00 Réponse donnée par Mark van Lent le 08 juillet 09 à 09:00 2009-07-08 10:00

Comme avec jdsumsion, vous pouvez également masquer votre travail actuel, mais utilisez ensuite un outil difffool, tel que meld, pour extraire les modifications sélectionnées du cache. Vous pouvez donc même éditer manuellement les morceaux, ce qui est un peu pénible lorsque vous 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 stash vous permet de tester si votre code est toujours en cours d'exécution avant de l'exécuter.

8
07 авг. réponse donnée derhoch 07 août. 2013-08-07 16:25 '13 à 16:25 2013-08-07 16:25

Intellij IDEA (et je pense que tous les autres produits de la série) a créé un support pour les commits partiels, depuis la v2018.1

2019

Pour ceux qui utilisent Git Extensions :

Dans la fenêtre "Copier", sélectionnez le fichier que vous souhaitez valider partiellement, puis sélectionnez le texte que vous souhaitez corriger dans le volet de droite, puis cliquez avec le bouton droit de la souris sur la sélection et sélectionnez "Générer les lignes sélectionnées" dans le menu contextuel.

7
27 июля '15 в 12:52 2015-07-27 12:52 la réponse est donnée 27 juillet '15 à 12:52 srgstm 2015-07-27 12:52

Le plugin vim-gitgutter peut créer des morceaux sans quitter l'éditeur vim, en utilisant

 :GitGutterStageHunk 

En outre, il fournit d'autres fonctionnalités intéressantes, telles qu'une colonne avec un signe différent, comme dans certains IDE modernes.

Si seulement une partie du morceau doit être fournie vim -fugitive

 :Gdiff 

vous permet de sélectionner la plage de la plage visible, puis :'<,'>diffput ou :'<,'>diffget pour changer / changer les lignes individuelles.

6
09 янв. la réponse est donnée le 09 janvier . 2015-01-09 20:11 '15 à 20:11 2015-01-09 20:11

J'ai essayé git add -p filename.x , mais sur un Mac, j’ai trouvé que gitx ( http://gitx.frim.nl/ ou https://github.com/pieter/gitx ) est beaucoup plus facile à créer exactement les lignes que je voulais. .

5
16 авг. réponse donnée jasongregori le 16 août 2011-08-16 02:43 '11 à 2:43 2011-08-16 02:43

Avec TortoiseGit:

Cliquez avec le bouton droit sur le fichier et utilisez Context Menu → Restore after commit . Cela créera une copie du fichier tel quel. Ensuite, vous pouvez éditer le fichier, par exemple. TortoiseGitMerge et ignorez les modifications que vous ne souhaitez pas apporter. Après avoir enregistré ces modifications, vous pouvez valider le fichier.

4
06 апр. la réponse est donnée par Fr0sT le 06 avril 2015-04-06 19:16 '15 à 19:16 2015-04-06 19:16

git-meld-index - citation du site:

git -meld-index exécute meld - ou tout autre git diffftool (kdiff3, diffuse, etc.) - afin que vous puissiez modifier de manière interactive les modifications apportées à l'index git (également appelé git).

Ceci est similaire aux fonctionnalités de git add -p et de git add --interactive. Dans certains cas, la fusion est plus facile / rapide à utiliser que git add -p. En effet, meld vous permet, par exemple:

  • voir plus de contexte
  • voir les différences intralines
  • éditez-le manuellement et consultez les mises à jour «en direct» des diff (mises à jour après chaque pression de touche)
  • aller au changement, sans n pour chaque changement que vous voulez sauter.

Utilisation de

Dans le référentiel git, exécutez:

 git meld-index 

Vous verrez que la fusion (ou le git diffftool configuré) apparaît par

LEFT : fichiers de répertoire temporaires copiés à partir de l'arbre de travail

DROITE : répertoire temporaire avec le contenu de l'index. Cela inclut également les fichiers qui ne figurent pas encore dans l'index, mais qui sont modifiés ou non cochés dans la copie de travail. Dans ce cas, vous verrez le contenu du fichier à partir de HEAD.

Editez l'index (à droite) jusqu'à ce qu'il soit content. N'oubliez pas de sauvegarder si nécessaire.

Lorsque vous avez terminé, fermez la fusion et git-meld-index mettra à jour l'index afin qu'il corresponde au contenu du répertoire temporaire situé à droite de la commande de fusion que vous venez de modifier.

2
04 июля '15 в 23:26 2015-07-04 23:26 la réponse est donnée par Croad > le 04 juillet '15 à 23:26 2015-07-04 23:26

Emacs a aussi du gitsum

2
13 июля '09 в 0:52 2009-07-13 00:52 la réponse est donnée le 13 juillet 09 à 09:52 2009-07-13 00:52

En ajoutant la réponse précédente, si vous préférez utiliser la ligne de commande, tapez git add -e myfile vous permet de sélectionner ligne par ligne que vous voulez valider, car cette commande ouvrira un éditeur avec des différences, par exemple:

2019

24 авг. La réponse est donnée à Beto Aveiga 24 août. 2018-08-24 18:24 '18 à 18h24 2018-08-24 18:24

Pour les utilisateurs Atom , le paquet github inclut un paramètre interactif de style git gui . Pour les étiquettes, voir la documentation sur l'emballage.

Utiliser Atom vous permet de travailler avec un thème avec un arrière-plan sombre (par défaut, git gui a un arrière-plan blanc).

1
10 апр. Réponse donnée par Ioannis Filippidis le 10 avril 2018-04-10 05:31 '18 à 17h31 2018-04-10 05:31

Comme le montre l' une des réponses ci-dessus, vous pouvez utiliser git add --patch filename.txt

ou forme abrégée git add -p filename.txt

... mais pour les fichiers déjà présents dans votre référentiel, il est préférable d'utiliser l'indicateur -patch pour la commande commit (si vous utilisez une version assez récente de git): git commit --patch filename.txt

... ou encore la forme abrégée git commit -p filename.txt

... puis en utilisant les touches spécifiées (y / n, etc.), pour sélectionner les lignes à inclure dans la validation.

1
30 июня '14 в 11:34 2014-06-30 11:34 la réponse est donnée par Samuel Lampa le 30 juin 2014 à 11:34 2014-06-30 11:34

git-cola est une excellente interface graphique, ainsi qu'une fonction intégrée. Il suffit de sélectionner les lignes pour la scène et appuyez sur S. Si aucune sélection n'est faite, un bloc complet est exécuté.

0
27 авг. la réponse est donnée AndiDog 27 août. 2015-08-27 14:28 '15 à 14:28 2015-08-27 14:28

Si sur une plate-forme Windows , à mon avis, git gui est le meilleur outil pour effectuer une mise en stage / commit plusieurs lignes à partir d'un fichier non- unstaged

1. Hank sage:

  • Sélectionnez un fichier dans la section unstagged Changes
  • Cliquez avec le bouton droit sur le code que vous souhaitez exécuter.
  • Choisissez Stage Hunk for commit

2. Ligne:

  • Sélectionnez un fichier dans la section unstagged Changes
  • Sélectionnez les rangées / lignes à organiser.
  • Sélectionnez les Stage Lines for commit

3. Si vous souhaitez créer un fichier complet, à l’exception de quelques lignes:

  • Sélectionnez un fichier dans la section unstagged Changes
  • Appuyez sur Ctrl+T (Stage file to commit)
  • Le fichier sélectionné est maintenant déplacé vers la section Staged Changes échelonnées.
  • Sélectionnez les rangées / lignes à organiser.
  • Sélectionnez les UnStage Lines for commit
0
28 мая '15 в 15:52 2015-05-28 15:52 La réponse est donnée par Anvesh Yalamarthy le 28 mai '15 à 15:52. 2015-05-28 15:52

Autres questions sur tags ou Poser une question