Lorsque j'apporte des modifications à un fichier dans Git, comment puis-je valider uniquement certaines des modifications?
Par exemple, comment pourrais-je valider seulement 15 lignes sur 30 lignes qui ont été modifiées dans un fichier?
git
git-commit
freddiefujiwara
la source
la source
git gui
=git add -e
>git add -i -p
; en termes de commodité:git gui
>git add -i -p
>git add -e
. Donc: choisissezgit gui
quand vous avez accès à X. choisissezgit add -i -p
pour des choses simples et quand vous n'avez pas ou ne voulez pas utiliser X.git add -e
pour une mise en scène complexe sans X.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 des "mecs" sensés (parties du fichier). Il vous posera alors cette question:Voici une description de chaque option:
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 avecgit 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 mettre en scène des mecs ajoutés par erreurgit commit -v
pour afficher votre validation pendant que vous modifiez le message de validation.Notez que cela est très différent de la
git format-patch
commande, dont le but est d'analyser les données de validation dans un.patch
fichier.Référence pour l'avenir: Git Tools - Interactive Staging
la source
-p/--patch
s'agit d'un raccourci vers l'action du correctif à l'intérieur de la-i/--interactive
commande qui lance le mode interactif utile .git diff
.e
, vous pouvez éditer le morceau manuellement en remplaçant+
ou-
en#
git push
il est déjà à jour. et si je le fais,git diff
je vois les mecs que j'ai ditn
. si je le vois,git diff --staged
je vois le commit que je veux pousser. En supposant que je puisse pousser le commit, comment supprimer les mecs auxquels j'ai ditno
?Vous pouvez utiliser
git add --interactive
ou , puis ( non ); voir le mode interactif dans git-addgit add -p <file>
git commit
git commit -a
page de manuel , ou suivez simplement les instructions.Modern Git a également
git commit --interactive
(etgit commit --patch
, qui est un raccourci vers l'option de patch dans la validation interactive).Si vous préférez le faire à partir de l'interface graphique, vous pouvez utiliser git-gui . Vous pouvez simplement marquer les morceaux que vous souhaitez 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, pourraient également avoir cette fonctionnalité.la source
git gui fournit cette fonctionnalité sous la vue diff. Faites simplement un clic droit sur la ou les lignes qui vous intéressent et vous devriez voir un élément de menu "Mettre cette ligne en ligne pour valider".
la source
gitk
, mais il est inclus avec Git Bash pour Windows; vous devriez avoir une entrée de menu de démarrage pour cela ou vous pouvez le démarrer avec la commandegit gui
. Il y a aussistage this hunk
ce qui est probablement plus utile questage this line
. Peut-être nouveau depuis que cette réponse a été créée il y a 10 ans.je crois que
git add -e myfile
c'est la façon la plus simple (ma préférence au moins) car elle 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 souhaitez pas. Concernant les commandes d'édition:contenu ajouté:
contenu supprimé:
contenu modifié:
Tous les détails
git add
sont disponibles surgit --help add
la source
-e
c'est--edit
.git --help add
s
mode patch interactif.git add -e
) * ne * change pas le contenu du fichier sur le disque. Il déplace simplement une partie des modifications de non-étagé à étagé (index).Si vous utilisez vim, vous voudrez peut-être essayer l'excellent plugin 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 de diff vim classiques commedp
. Enregistrez les modifications dans l'index et validez avec:Gcommit
, et vous avez terminé.Très bons screencasts d'introduction ici (voir en particulier la partie 2 ).
la source
:diffget/:diffput
en mode visuel, où je peux choisir des lignes spécifiques, que je veux réinitialiser / valider. Alors, assurez-vous à nouveau: vim est génial.Je recommanderais fortement d'utiliser SourceTree d'Atlassian. (C'est gratuit.) Cela rend cela trivial. Vous pouvez mettre en scène des morceaux de code individuels ou des lignes de code individuelles rapidement et facilement.
la source
Il convient de noter que pour utiliser
git add --patch
un nouveau fichier, vous devez d'abord ajouter le fichier à indexer avecgit add --intent-to-add
:la source
Lorsque j'ai beaucoup de changements et que je vais finir par créer quelques commits à partir des changements, je veux enregistrer temporairement mon point de départ avant de mettre en scène les choses.
Comme ça:
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 peux faire une erreur en mettant en scène les choses, et je veux un état engagé sur lequel je peux me rabattre pour un deuxième passage.
la source
Si vous utilisez emacs, jetez un œil à Magit , qui fournit une interface git pour emacs. Il prend assez bien en charge les segments intermédiaires (parties de fichiers).
la source
Intellij IDEA (et je suppose que tous les autres produits de la série) prennent en charge les validations partielles depuis v2018.1
la source
Pour ceux qui utilisent les extensions Git :
Dans la fenêtre Valider, sélectionnez le fichier que vous souhaitez valider partiellement, puis sélectionnez le texte que vous souhaitez valider dans le volet droit, puis cliquez avec le bouton droit sur la sélection et choisissez 'Mettre en scène les lignes sélectionnées' dans le menu contextuel.
la source
s
- très utile pour organiser rapidement des parties de fichiers pour une validation.Tout comme la réponse de jdsumsion, vous pouvez également cacher votre travail actuel, mais utiliser un outil différent comme meld pour extraire les modifications sélectionnées de la cachette. De cette façon, vous pouvez même modifier les mecs manuellement très facilement, ce qui est un peu pénible lorsque
git add -p
:L'utilisation de la méthode stash vous donne la possibilité de tester, si votre code fonctionne toujours, avant de le valider.
la source
git commit --amend
, il semble que vous ne puissiez pas faire sauter la cachette par la suite, ou existe-t-il un moyen de le faire?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 valider car cette commande ouvrira un éditeur avec les différences, comme ceci:Comme vous le savez peut-être, les lignes commençant par
+
sont des ajouts, les lignes commençant par-
sont des suppressions. Donc:-
par de l'espace.
Voici ce que
git add -h
dit l'ajout de fichiers de cette façon (patcher des fichiers):Attention: ne modifiez pas le contenu du fichier, ce n'est pas un bon endroit pour le faire. Modifiez simplement les opérateurs des lignes supprimées ou ajoutées.
la source
Le plugin vim-gitgutter peut mettre en scène des mecs sans quitter l'éditeur vim en utilisant
En plus 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 doit être mise en scène vim-fugitive
permet ensuite la sélection visuelle de la plage
:'<,'>diffput
ou:'<,'>diffget
pour mettre en scène / annuler les modifications de ligne individuelles.la source
git add -p filename.x
J'ai essayé , mais sur un mac, j'ai trouvé que gitx ( http://gitx.frim.nl/ ou https://github.com/pieter/gitx ) était beaucoup plus facile à valider exactement les lignes que je voulais.la source
Avec TortoiseGit:
la source
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, l' extension de crecord d' Andrew Shadura permet d'apporter une fenêtre ncurses dans laquelle nous pouvons sélectionner les lignes à valider.
Configurez l'extension comme suit:
cd à votre dépôt git et invoquez-le comme suit:
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:
Screencast montrant un exemple d'utilisation
la source
Pour les utilisateurs d' Atom , le package github comprend une mise en scène interactive, dans le style de
git gui
. Pour les raccourcis, voir la documentation du package .L'utilisation d'Atom permet de travailler avec un thème qui a un fond sombre (par défaut,
git gui
a un fond blanc).la source
Pour emacs il y a aussi du gitsum
la source
git-meld-index - extrait du site Web:
git-meld-index exécute meld - ou tout autre outil git difftool (kdiff3, diffus, etc.) - pour vous permettre de mettre en scène de manière interactive les modifications de l'index git (également connu sous le nom de zone de transit git).
Ceci est similaire à la fonctionnalité de git add -p et git add --interactive. Dans certains cas, meld est plus facile / plus rapide à utiliser que git add -p. En effet, meld vous permet, par exemple, de:
Usage
Dans un référentiel git, exécutez:
Vous verrez meld (ou votre gt difftool configuré) apparaître avec:
GAUCHE : répertoire temporaire contenant les fichiers copiés à partir de votre arborescence de travail
DROITE : répertoire temporaire avec le contenu de l'index. Cela inclut également les fichiers qui ne sont 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 de HEAD.
Modifiez l'index (côté droit) jusqu'à ce que vous soyez satisfait. N'oubliez pas d'enregistrer en cas de besoin.
Lorsque vous avez terminé, fermez meld et git-meld-index mettra à jour l'index pour qu'il corresponde au contenu du répertoire temporaire sur le côté droit de meld que vous venez de modifier.
la source
Si c'est sur la
Windows
plate-forme, à mon avis,git gui
c'est un très bon outil pourstage
/commit
quelques lignes deunstaged
fichier1. En ce qui concerne le gros morceau:
unstagged Changes
sectionStage Hunk for commit
2. Ligne sage:
unstagged Changes
sectionStage Lines for commit
3. Si vous souhaitez mettre en scène le fichier complet sauf quelques lignes:
unstagged Changes
sectionCtrl+T (Stage file to commit)
Staged Changes
sectionUnStage Lines for commit
la source
Comme le montre une des réponses ci-dessus, vous pouvez utiliser
git add --patch filename.txt
ou la forme courte
git add -p filename.txt
... mais pour les fichiers déjà dans votre référentiel, il est préférable d'utiliser s --patch flag sur la commande commit directement (si vous utilisez une version assez récente de git):
git commit --patch filename.txt
... ou, encore une fois, la forme courte
git commit -p filename.txt
... puis en utilisant les clés mentionnées, (o / n, etc.) pour choisir les lignes à inclure dans la validation.
la source
git add -p filename.txt
" moins de marge d'erreur? Si vous gâchez la modification du fichier partiel, l'annulation d'un ajout est préférable à l'annulation d'une validation.git-cola est une excellente interface graphique et a également cette fonctionnalité intégrée. Sélectionnez simplement les lignes à mettre en scène et appuyez sur S. Si aucune sélection n'est effectuée, le morceau complet est mis en scène.
la source