Comment désinstaller de manière interactive un morceau particulier dans git?

106

Dans git, si j'ai quelques morceaux du même fichier mis en scène dans mon index, comment puis-je désinstaller l'un d'entre eux de manière interactive?

Existe-t-il une alternative à la suppression du fichier entier, puis à la remise en place des morceaux que je souhaite conserver, ou à l'annulation manuelle des modifications de la copie de travail, puis à l'ajout interactif de ces modifications annulées?

Andrew Grimm
la source

Réponses:

136

Essayez git reset --patch filename; cela devrait faire le contraire de git add --patch, selon la documentation . La forme courte -pfonctionne également pour les deux commandes.

Aasmund Eldhuset
la source
Je ne pense pas que ma version l'ait (c'est 1.6.3.3), mais cela semble être la bonne réponse.
Andrew Grimm
2
Dans ce cas (et en supposant que vous ne pouvez pas mettre à niveau pour une raison quelconque), je vous suggère d'utiliser git stash save --keep-indexpour enregistrer et réinitialiser vos modifications de copie de travail actuelles. Ensuite, vous pouvez réinitialiser votre fichier et annuler les modifications que vous ne souhaitez pas. Si vous copiez d'abord le fichier dans un emplacement temporaire, vous pouvez l'utiliser diffpour enregistrer les modifications que vous annulez. Ensuite, vous pouvez ajouter à nouveau le fichier (pas besoin d'ajout interactif puisque vous avez caché les autres modifications qui ne vous intéressaient pas). Utilisez git stash poppour récupérer les anciennes modifications et diffpour appliquer les modifications que vous avez annulées. Assez encombrant ... :-(
Aasmund Eldhuset
The short form -p also works for both commands... Vous voulez dire git reset -p filename?
Nawaz le
1
@Nawaz: C'est exact - git add -p filenamemet en scène de manière sélective les modifications à partir de ce fichier et git reset -p filenameannule de manière sélective les modifications. Il y a aussi git checkout -p -- filename, qui vous permet d'annuler de manière sélective les modifications d'un fichier. Attention: chacun des addet resetpeut être utilisé pour annuler l'autre des deux, mais si vous utilisez ce formulaire pour annuler checkoutun changement, vous ne pouvez pas le récupérer.
Aasmund Eldhuset le
2

git guia une interface graphique décente pour mettre en scène ou désinstaller de manière interactive des morceaux ou des lignes. Il existe des clients GUI plus jolis / meilleurs, mais ils git guisont légers, intégrés et multiplateformes (lin, win, mac).

https://git-scm.com/docs/git-gui

Faites simplement un clic droit sur un morceau pour mettre en scène / désinstaller. Pour les lignes, mettez d'abord les lignes en surbrillance, puis cliquez avec le bouton droit de la souris.

wisbucky
la source
-1

GitX a une belle interface utilisateur pour désinstaller des morceaux d'un fichier: entrez la description de l'image ici

Le client officiel n'a pas été maintenu depuis un certain temps, mais un fork sur GitHub avec plus de fonctionnalités est populaire dans certains cercles. ( article de blog à ce sujet )

John Douthat
la source
1
Pour les utilisateurs de Windows, les extensions Git ont une interface utilisateur tout aussi agréable.
Aasmund Eldhuset
4
Il en va de même pour le intégré git gui, sauf que je ne suis pas sûr que j'utiliserais le mot «gentil»;)
MatrixFrog
1
SourceTree (Windows + Mac) a également une belle interface utilisateur pour cela.
chrnola
Je devrais mentionner les clients graphiques les plus récents de Git maintenant - GitKraken est magnifique et prend en charge cela (bien qu'il soit maintenant livré avec des frais élevés pour une utilisation commerciale). Le bureau GitHub de GitHub est gratuit, beau et prend en charge facilement la mise en scène et la suppression des morceaux. GitKraken et GitHub Desktop sont tous deux multiplateformes, mais ne sont pas non plus open source.
jdgregson