Commit seulement une partie d'un fichier en Git

quand je modifie un fichier en Git, Comment puis-je ne propager qu'une partie des modifications?

par exemple, comment pourrais-je ne propager que 15 lignes sur 30 qui ont été modifiées dans un fichier?

2312
demandé sur Community 2009-07-06 06:25:02

22 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" morceaux " sensés (parties du fichier). Il vous posera alors cette question:

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

Voici une description de chaque option:

  • y étape de ce morceau pour le prochain commit
  • n ne pas en scène ce beau mec pour le prochain commit
  • q quitter; ne pas en scène ce morceau ou tous les autres mecs
  • un étape de ce beau mec et plus tard les beaux mecs dans le fichier
  • d ne pas en scène ce morceau ou de l'une de la plus tard les beaux mecs dans le fichier
  • g sélectionner un morceau Pour aller à
  • / recherche d'un morceau correspondant au regex donné
  • j quitter ce beau mec indécis, voir le prochain indécis morceau
  • J quitter ce beau mec indécis, voir le prochain morceau
  • k quitter ce beau mec indécis, voir le précédent indécis morceau
  • K quitter ce beau mec indécis, voir le précédent morceau
  • s diviser le courant de beau gosse en plus petits mecs
  • e modifier manuellement le hunk actuel
  • ? imprimer hunk aide

Si le fichier n'est pas 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 scène des changements corrects

git reset -p pour dégrafer par erreur ajouté hunks

git commit -v pour voir votre commit pendant que vous éditez le message de commit.

notez que ceci est très différent de la commande git format-patch , qui a pour but d'analyser les données de propagation dans des fichiers .patch .

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

3022
répondu mac 2017-09-01 06:23:38

vous pouvez utiliser git add --interactive ou git add -p <file> , puis git commit ( pas git commit -a ); voir mode interactif dans git-ajouter page de manuel, ou simplement suivre les instructions.

Git moderne a aussi git commit --interactive (et git commit --patch , qui est un raccourci vers l'option patch dans la propagation interactive).

si vous préférez le faire à partir de GUI, vous pouvez utiliser git-gui . Vous pouvez simplement marquer les morceaux que vous voulez inclure dans commit. Personnellement, je trouve cela plus facile que d'utiliser git add -i . D'autres interfaces graphiques de git, comme QGit ou GitX, pourraient également posséder cette fonctionnalité.

219
répondu Jakub Narębski 2015-02-24 11:37:48

git gui fournit cette fonctionnalité sous la vue diff. Droite cliquez simplement sur la ligne(s) qui vous intéresse et vous devriez voir un "stade de cette ligne à s'engager" dans le menu.

116
répondu Ionuț G. Stan 2009-07-06 11:56:00

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

ajouté le contenu:

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

contenu supprimé:

supprimé le contenu est représenté par les lignes commençant par "-". Vous pouvez empêcher la mise en scène de leur enlèvement en convertissant le "-" en "" (espace).

contenu modifié:

Le contenu modifié

est représenté par des lignes " - "(suppression de 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 " - " lignes en "", et en supprimant "+" ligne. Attention, modifier seulement la moitié de la paire est susceptible d'introduire des changements déroutants dans l'index.

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

61
répondu theFreedomBanana 2016-09-29 13:41:03

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

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 en utilisant les commandes classiques vim diff comme dp . Enregistrez les modifications dans l'index et commit avec :Gcommit , et c'est terminé.

très bon screencasts d'introduction ici (voir l'esp. partie 2 ).

41
répondu François 2012-02-23 10:37:39

je recommande fortement d'utiliser SourceTree D'Atlassian. (Il est gratuit. Ça rend ça insignifiant. Vous pouvez mettre en scène des morceaux individuels de code ou des lignes individuelles de code rapidement et facilement.

enter image description here

26
répondu Bob Stein 2015-06-01 15:49:07

intéressant de noter que pour utiliser git add --patch pour un nouveau fichier vous devez d'abord ajouter le fichier d'index avec git add --intent-to-add :

git add -N file
git add -p file
20
répondu user1338062 2014-12-05 17:29:10

quand j'ai beaucoup de changements, et que je vais finir par créer quelques propagations à partir des changements, alors je veux sauver mon point de départ temporairement avant de mettre en scène des choses.

comme ceci:

$ 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 mettant en scène des choses, et je veux un État engagé je peux tomber sur pour un second passage.

17
répondu jdsumsion 2013-06-06 22:14:36

si vous utilisez emacs, jetez un oeil à Magit , qui fournit une interface git pour emacs. Il soutient mise en scène hunks (parties de fichiers) assez bien.

12
répondu Mark van Lent 2016-03-29 08:01:54

tout comme la réponse de jdsumsion, vous pouvez également cacher votre travail actuel, mais ensuite utiliser un difftool comme la soudure pour tirer les changements sélectionnés de la cachette. De cette façon, vous pouvez même éditer les hunks manuellement très facile, qui est un peu d'une douleur quand 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 donne la possibilité de tester, si votre code fonctionne toujours, avant de le commettre.

8
répondu derhoch 2013-08-07 13:25:35

pour ceux qui utilisent Extensions Git :

Dans la fenêtre, sélectionnez le fichier que vous souhaitez partiellement de valider, puis sélectionnez le texte que vous souhaitez engager dans le volet droit, puis cliquez-droit sur la sélection et choisissez le Stade de lignes sélectionnées " dans le menu contextuel.

7
répondu srgstm 2015-07-27 09:52:10

Intellij IDEA (et je suppose tous les autres produits de la série) a construit en support pour les commits partiels depuis v2018.1

enter image description here

7
répondu Holger Brandl 2018-03-28 07:06:05

vim-gitgutter plugin peut en scène les beaux mecs sans quitter vim de l'éditeur à l'aide de

:GitGutterStageHunk

à côté de cela, il fournit d'autres caractéristiques fraîches comme une colonne de signe diff comme dans certaines IDEs modernes

Si seulement une partie de morceau devrait être mis en scène vim-fugitif

:Gdiff

permet la sélection visuelle de la portée, puis :'<,'>diffput ou :'<,'>diffget pour mettre en scène/inverser les changements de ligne individuels.

6
répondu c0ffeeartc 2015-01-09 23:46:34

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

4
répondu jasongregori 2011-08-15 23:43:36

Avec TortoiseGit:

faites un clic droit sur le fichier et utilisez Context Menu → Restore after commit . Cela va créer une copie du fichier tel qu'il est. Ensuite, vous pouvez éditer le fichier, par exemple dans TortoiseGitMerge et annuler toutes les modifications que vous ne voulez pas propager. Après avoir enregistré ces modifications, vous pouvez propager le fichier.

4
répondu Fr0sT 2015-04-06 16:16:02

pour emacs il y a aussi gitsum

2
répondu zut 2009-07-12 21:52:10

git-meld-index -- citation du site:

git-fondre-indice va fondre -- ou tout autre git difftool (kdiff3, diffusion, etc.) -- pour vous permettre d'effectuer des changements interactifs à l'indice git (également connu sous le nom de zone de transit git).

c'est similaire à la fonctionnalité de git add-p, et git add --interactive. Dans certains cas, la soudure est plus facile / plus rapide à utiliser que git add-p. C'est parce que la fusion vous permet, pour exemple:

  • voir plus de contexte
  • voir systèmes de diffusion intra-ligne
  • éditer à la main Et Voir mises à jour' live 'diff (mises à jour après chaque pression)
  • naviguer vers un changement sans dire 'n' à chaque changement que vous voulez sauter

Utilisation

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

git meld-index

voir meld (ou votre git difftool configuré) pop up avec:

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

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

éditer le index (à droite) jusqu'à heureux. N'oubliez pas de sauvegarder au besoin.

lorsque vous avez terminé, fermez meld, et git-meld-index mettra à jour l'index pour correspondre au contenu du répertoire temporaire sur le côté droit de meld que vous venez d'éditer.

2
répondu Croad Langshan 2015-07-04 20:26:43

comme une réponse ci-dessus montre, 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 dépôt, il est préférable d'utiliser --patch dans la commande commit (si vous utilisez une version assez récente de git).): git commit --patch filename.txt

... ou, encore, la forme courte git commit -p filename.txt

... et puis, à l'aide de les clés mentionnées, (y / n etc), pour choisir les lignes à inclure dans la propagation.

1
répondu Samuel Lampa 2017-05-23 12:18:25

pour Atom utilisateurs, le paquet github comprend la mise en scène interactive, dans le style git gui . Pour les raccourcis voir le paquet documentation .

L'utilisation D'Atom permet de travailler avec un thème qui a le fond sombre (par défaut, git gui a un fond blanc).

1
répondu Ioannis Filippidis 2018-04-10 02:31:42

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

enter image description here

comme vous pouvez le savoir les lignes qui commencent par + sont des additions, les lignes qui commencent par - sont des suppressions. So:

  • supprimer cette ligne.
  • pour ne pas mettre en place une suppression il suffit de remplacer - par "espace 151940920" dit à propos de l'ajout de fichiers de cette façon (correction de fichiers):

    ajout de contenu Le contenu ajouté est représenté par des lignes commençant par "+". Vous pouvez évitez de mettre en scène des lignes d'addition en les supprimant.

    supprimé contenu: Contenu supprimé est représenté par les lignes commençant par "-". Vous pouvez éviter d'échelonner leur enlèvement en convertissant le " - " en " " (espace.)

    contenu modifié: Le contenu modifié est représenté par des lignes "-" contenu) suivi des lignes " + " (ajout du contenu de remplacement). Vous pouvez empêcher la mise en scène modification en convertissant les lignes " - " en ""et en supprimant le "+" lignes. Attention, modifier seulement la moitié de la pair est susceptible d'introduire des changements déroutants à l'index.

    Attention: ne pas modifier le contenu du fichier, ce n'est pas un bon endroit pour le faire. Il suffit de changer les opérateurs des lignes supprimées ou ajoutées.

1
répondu Beto Aveiga 2018-08-24 15:24:08

si c'est sur Windows plate-forme, à mon avis git gui est le meilleur outil pour stage / commit quelques lignes de unstaged fichier

1. Hunk sage:

  • sélectionner le fichier dans unstagged Changes section
  • clic droit morceau de code qui doit être mis en scène
  • sélectionner Stage Hunk for commit

2. Ligne Sage:

  • sélectionner le fichier dans unstagged Changes section
  • sélectionnez la ligne/les lignes être mis en scène
  • sélectionner Stage Lines for commit

3. Si vous voulez mettre en scène le fichier complet sauf quelques lignes:

  • sélectionner le fichier dans unstagged Changes section
  • de la Presse Ctrl+T (Stage file to commit)
  • le fichier sélectionné passe maintenant à Staged Changes Section
  • sélectionnez la ligne/les lignes être mis en scène
  • sélectionner UnStage Lines for commit
0
répondu Anvesh Yalamarthy 2015-05-28 12:52:34

git-cola est une excellente interface graphique et possède également cette fonctionnalité intégrée. Il suffit de sélectionner les lignes pour mettre en scène et d'appuyer sur S . Si aucune sélection n'est faite, l'intégralité du morceau est mis en scène.

0
répondu AndiDog 2015-08-27 11:28:04