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?
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:
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 correctesgit reset -p
pour supprimer la scène ajouté par erreur des mecsgit 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
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é.
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".
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
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 ).
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.
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
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.
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).
Intellij IDEA (et je suppose que tous les autres produits de la série) prend en charge les commits partiels depuis la v2018.1
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.
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.
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.
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.
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:
Comme vous le savez peut-être, les lignes commençant par +
sont des ajouts, les lignes commençant par -
sont des suppressions. Alors:
-
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.
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.
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).
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'utilisation
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:
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.
Pour emacs il y a aussi gitsum
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.
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:
unstagged Changes
Stage Hunk for commit
2. Ligne sage:
unstagged Changes
Stage Lines for commit
. Si vous souhaitez organiser le fichier complet à l’exception de quelques lignes:
unstagged Changes
Ctrl+T (Stage file to commit)
Staged Changes
UnStage Lines for commit
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.