web-dev-qa-db-fra.com

N'engager qu'une partie d'un fichier dans Git

Lorsque je modifie un fichier dans Git, comment puis-je ne valider que certaines de ces modifications?

Par exemple, comment ne valider que 15 lignes sur 30 modifiées dans un fichier?

2554
freddiefujiwara

Vous pouvez utiliser git add --patch <filename> (ou -p, pour faire court), et git commencera à décomposer votre fichier en ce qu’il considère être des "mecs" raisonnables (des parties du fichier). Il vous invitera 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 mecs restants
  • a mettre en scène ce morceau et tous les derniers mecs dans le fichier
  • d ne pas mettre en scène ce morceau ou l'un des derniers morceaux dans le fichier
  • g sélectionner un morceau pour aller à
  • / rechercher un morceau correspondant à la regex donnée
  • j laissez ce morceau indécis, voir le prochain morceau indécis
  • J laissez ce morceau indécis, voir le morceau suivant
  • k laisser ce morceau indécis, voir précédent morceau indécis
  • K laissez ce morceau indécis, voir morceau précédent
  • s diviser le morceau actuel en plus petits morceaux
  • e éditer manuellement le morceau actuel
  • ? imprimer aide morceau

Si le fichier ne se trouve pas encore dans le référentiel, vous pouvez d'abord 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 mis en place les modifications correctes
  • git reset -p pour supprimer la scène ajouté par erreur des mecs
  • git commit -v pour afficher votre commit pendant que vous éditez le message de commit.

Notez que cette commande est très différente de la commande git format-patch, dont l’objet est d’analyser les données de validation dans un fichier .patch.

Référence pour l'avenir: Git Tools - Interactive Staging

3398
cloudhead

Vous pouvez utiliser git add --interactive ou git add -p <file>, puis git commit ( not not git commit -a); voir le mode interactif dans git-add , ou suivez simplement les instructions.

Modern Git a également git commit --interactive (et git commit --patch, qui est un raccourci pour l'option de correction 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 souhaitez inclure dans commit. Personnellement, je trouve cela plus facile que d'utiliser git add -i. D'autres interfaces graphiques de Git, telles que QGit ou GitX, pourraient également avoir cette fonctionnalité.

239
Jakub Narębski

git gui fournit cette fonctionnalité dans la vue diff. Il suffit de cliquer avec le bouton droit de la souris sur la ou les lignes qui vous intéressent et vous devriez voir un élément de menu "configurer cette ligne pour valider".

131
Ionuț G. Stan

Je crois que git add -e myfile est le moyen le plus simple (du moins ma préférence), car il ouvre simplement un éditeur de texte et vous permet de choisir la ligne que vous souhaitez mettre en scène et celle que vous ne voulez 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’ajout en les supprimant.

contenu supprimé:

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

contenu modifié:

Le contenu modifié est représenté par des lignes "-" (supprimant l'ancien contenu) suivies par des lignes "+" (ajoutant le contenu de remplacement). Vous pouvez empêcher la modification de la mise en scène en convertissant les "-" lignes en "" et en supprimant les lignes "+". Attention, ne modifier que la moitié de la paire est susceptible d’apporter des modifications confuses à l’indice.

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

70
theFreedomBanana

Si vous utilisez vim, vous voudrez peut-être essayer l'excellent plug-in appelé fugitive .

Vous pouvez voir la différence d'un fichier entre la copie de travail et l'index avec :Gdiff, puis ajouter des lignes ou des morceaux à l'index à l'aide des commandes vim diff classiques telles que dp. Enregistrez les modifications dans l'index et validez avec :Gcommit, et vous avez terminé.

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

42
François

Je recommande fortement d'utiliser SourceTree de Atlassian. (C'est gratuit.) Cela rend cela trivial. Vous pouvez mettre en place des morceaux de code individuels ou des lignes de code individuelles rapidement et facilement.

enter image description here

28
user486646

Il est à noter que pour 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
24
user1338062

Lorsque j'ai beaucoup de modifications et que je crée quelques commits à partir de ces modifications, je souhaite enregistrer mon point de départ temporairement avant de mettre en scène les éléments.

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 Whymarrh est ce que je fais habituellement, sauf que parfois, il y a beaucoup de changements et je peux dire que je pourrais faire une erreur en organisant des choses, et je veux un état engagé sur lequel je peux avoir recours pour un deuxième passage.

22
jdsumsion

Si vous utilisez emacs, jetez un oeil à Magit , qui fournit une interface git pour emacs. Il supporte très bien staging munks (parties de fichiers).

12
Mark van Lent

Intellij IDEA (et je suppose que tous les autres produits de la série) prend en charge les commits partiels depuis la v2018.1

enter image description here

10
Holger Brandl

Tout comme la réponse de jdsumsion, vous pouvez également stocker votre travail actuel, mais utilisez ensuite un outil difftool tel que meld pour extraire les modifications sélectionnées de la réserve. De cette façon, vous pouvez même éditer les morceaux manuellement très facilement, ce qui est un peu pénible quand vous êtes dans 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, avant de le valider, si votre code fonctionne toujours.

8
derhoch

Pour ceux qui utilisent Git Extensions:

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

8
srgstm

vim-gitgutter le plugin peut mettre en scène des mecs sans quitter l'éditeur vim avec

:GitGutterStageHunk

A côté de cela, il fournit d'autres fonctionnalités intéressantes comme une colonne de signe diff comme dans certains IDE modernes

Si seulement une partie du morceau devait être mise en scène vim-fugitive

:Gdiff

permet la sélection visuelle de la plage, puis :'<,'>diffput ou :'<,'>diffget pour effectuer/annuler les modifications de ligne individuelles.

6
c0ffeeartc

Essayé git add -p filename.x, mais sur un mac, j'ai trouvé gitx ( http://gitx.frim.nl/ ou https://github.com/pieter/gitx ) être beaucoup plus facile à commettre exactement les lignes que je voulais.

5
jasongregori

En ajoutant une réponse précédente, si vous préférez utiliser la ligne de commande, entrer git add -e myfile vous donne le choix de choisir ligne par ligne ce que vous voulez commettre car cette commande ouvrira un éditeur avec les différences, comme suit:

enter image description here

Comme vous le savez peut-être, les lignes commençant par + sont des ajouts, les lignes commençant par - sont des suppressions. Alors:

  • Pour ne pas mettre en scène un ajout, supprimez cette ligne.
  • Pour ne pas supprimer une suppression, il suffit de remplacer - par un espace.

Voici ce que git add -h dit à propos de l'ajout de fichiers de cette manière (correctif des fichiers):

contenu ajouté Le contenu ajouté est représenté par des lignes commençant par "+". Vous pouvez empêcher la création de lignes d’ajout en les supprimant.

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

contenu modifié: Le contenu modifié est représenté par des lignes "-" (supprimant l'ancien contenu) suivies par des lignes "+" (ajoutant le contenu de remplacement). Vous pouvez empêcher la modification de la mise en scène en convertissant les "-" lignes en "" et en supprimant les lignes "+". Attention, ne modifier que la moitié de la paire est susceptible d’apporter des modifications confuses à l’indice.

Attention: ne modifiez pas le contenu du fichier, c'est-à-dire pas un bon endroit pour le faire. Il suffit de changer les opérateurs des lignes supprimées ou ajoutées.

4
Beto Aveiga

Avec TortoiseGit:

faites un clic 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 dans TortoiseGitMerge et annulez toutes les modifications que vous ne voulez pas valider. Après avoir enregistré ces modifications, vous pouvez valider le fichier.

4
Fr0sT

Pour les utilisateurs de Atom , le package github inclut la mise en scène interactive, dans le style de _git gui_. Pour les raccourcis, voir le package documentation .

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

3

Cela fait 10 ans que cette question a été posée. Et j'espère que cette réponse sera utile à quelqu'un. Comme mentionné dans la réponse ici , où l'interface graphique n'est pas une option, Andrew Shadura extension crecord permet de créer une fenêtre ncurses dans laquelle nous pouvons sélectionner les lignes à valider.

Configurez l'extension comme suit:

git clone https://github.com/andrewshadura/git-crecord
cd git-crecord
./setup.py install
ln -s $PWD/git-crecord ~/.local/bin/git-crecord

cd à votre repo git et invoquez-le comme suit:

git crecord

Cela ferait apparaître l'interface ncurses qui peut être utilisée comme indiqué ci-dessous. Appuyez sur les touches suivantes dans la fenêtre ncurses pour effectuer certaines actions:

f       hunk toggle fold (arrow keys can also be used)
space   toggle hunk selection
a       toggle commit or amend
c       confirm and open commit window

Screencast montrant un exemple d'utilisationExample

3
Arun

git-meld-index - citation du site:

git-meld-index exécute meld - ou tout autre difftool git (kdiff3, diffuse, etc.) - pour vous permettre de mettre en scène de manière interactive les modifications apportées à l'index git (également appelé zone de transfert 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. C'est parce que meld vous permet, par exemple, de:

  • voir plus de contexte
  • voir les diffs intra-ligne
  • éditez à la main et voyez les mises à jour 'live' des diff (mises à jour après chaque pression sur une touche)
  • naviguez vers un changement sans dire 'n' à chaque changement que vous voulez ignorer

Utilisation

Dans un dépôt git, exécutez:

git meld-index

Vous verrez apparaître meld (ou votre git difftool configuré) avec:

LEFT: répertoire temporaire contenant les fichiers copiés à partir de votre arbre de travail

RIGHT: 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 suivis dans la copie de travail. Dans ce cas, vous verrez le contenu du fichier à partir de HEAD.

Éditez l'index (côté droit) jusqu'à ce que vous soyez heureux. N'oubliez pas de sauvegarder en cas de besoin.

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

2
Croad Langshan

Pour emacs il y a aussi gitsum

2
zut

Comme ne réponse ci-dessus, vous pouvez utiliser git add --patch filename.txt

ou la 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 directement l'option --patch avec la commande commit (si vous utilisez une version assez récente de git): git commit --patch filename.txt

... ou encore le raccourci git commit -p filename.txt

... puis en utilisant les clés mentionnées, (y/n etc.), pour choisir les lignes à inclure dans la validation.

1
Samuel Lampa

Si c'est sur Windows plate-forme, à mon avis, git gui est un très bon outil pour stage/commit quelques lignes du fichier unstaged

1. Hunk wise:

  • Sélectionnez le fichier dans la section unstagged Changes
  • Clic droit morceau de code qui doit être mis en scène
  • Sélectionnez Stage Hunk for commit

2. Ligne sage:

  • Sélectionnez le fichier dans la section unstagged Changes
  • Sélectionnez la ou les lignes à mettre en scène
  • Faites un clic droit et sélectionnez Stage Lines for commit

. Si vous souhaitez organiser le fichier complet à l’exception de quelques lignes:

  • Sélectionnez le fichier dans la section unstagged Changes
  • Appuyez sur Ctrl+T (Stage file to commit)
  • Le fichier sélectionné passe maintenant à la section Staged Changes
  • Sélectionnez la ou les lignes à mettre en scène
  • Faites un clic droit et sélectionnez UnStage Lines for commit
1

git-cola est une excellente interface graphique et intègre également cette fonctionnalité. Il suffit de sélectionner les lignes à mettre en scène et appuyez sur S. Si aucune sélection n'est faite, le morceau complet est mis en scène.

0
AndiDog