web-dev-qa-db-fra.com

Cacher uniquement les modifications non mises en scène dans Git

Je voudrais faire le flux de travail suivant:

  1. Ajouter des modifications à la scène. 
  2. Cachez tous les autres changements non mis en scène. 
  3. Faire des choses avec les choses en phase (c'est-à-dire construire, exécuter des tests, etc.)
  4. Appliquez la cachette. 

Y a-t-il un moyen de faire l'étape 2?

Exemple

 echo "123" > foo
 git add foo # Assumes this is a git directory
 echo "456" >> foo
 git stash
 cat foo # Should yield 123
155
Unapiedra

git stash save a une option --keep-index qui répond exactement à vos besoins.

Donc, lancez git stash save --keep-index.

226
vhallac
git stash save --keep-index

Aussi, Re: 

Pourquoi ne pas valider vos modifications après les avoir mises en scène? - Shin 

R: Parce que vous devriez toujours archiver le code testé :) Cela signifie que vous devez exécuter les tests avec uniquement les modifications que vous êtes sur le point de valider

Tout cela, mis à part le fait que, bien entendu, en tant que programmeur expérimenté, vous avez l’envie innée de tester et d’examiner uniquement ces modifications - seulement en partie je rigole

27
sehe

Cela peut être fait en 3 étapes: sauvegarder les modifications planifiées, tout stocker le reste, restaurer l'index avec les modifications planifiées. Ce qui est fondamentalement:

git commit -m 'Save index'
git stash Push -u -m 'Unstaged changes and untracked files'
git reset --soft HEAD^

Cela fera exactement ce que vous voulez.

21
alesguzik

Avec git version 2.7.4 vous pouvez faire:

git stash save --patch

La git vous demandera d’ajouter ou non vos modifications dans stash.
Et vous répondez alors simplement y ou n

Vous pouvez restaurer le répertoire de travail comme vous le faites toujours:

git stash pop

ou, si vous souhaitez conserver les modifications enregistrées dans la réserve:

git stash apply
10
Eugen Konkov

En prolongeant les réponses précédentes, j'ai parfois un ensemble complexe de changements mis en scène, mais je souhaite d'abord valider un changement séparé. Par exemple, j'ai peut-être repéré un bogue ou un code incorrect que je voudrais corriger avant les changements mis en scène. Voici un itinéraire possible à suivre:

d'abord, rangez tout, mais laissez les modifications mises en scène intactes

$ git stash save --keep-index [--include-untracked]

maintenant cacher les changements mis en scène séparément aussi

$ git stash save

faire des changements pour corriger; et test; engage-les:

$ git add [--interactive] [--patch]

$ git commit -m "correction ..."

restaurez maintenant les modifications précédemment mises en scène:

$ git stash pop

résolvez tous les conflits, et notez que s'il y avait des conflits, git aurait appliqué mais pas aurait supprimé cette entrée de stash.

(... puis validez les modifications planifiées, restaurez la réserve de toutes les autres modifications et continuez ...)

5
Rhubbarb

Un autre conseil, lié à la question:

Lorsque vous stockez efficacement vos modifications non mises en scène à l'aide de

$ git stash save --keep-index

vous voudrez peut-être envoyer un message à la réserve, de sorte que, lorsque vous ferez un git stash list, ce que vous avez déjà stocké soit plus évident, en particulier si vous suivez cette opération de sauvegarde dans le cadre d'autres sauvegardes. Par exemple

$ git stash save --keep-index "modifications pas encore mises en scène"

(bien qu’en réalité, il contienne tous les changements indiqués dans d’autres réponses).

Par exemple, ce qui précède peut être suivi immédiatement par:

$ git stash save "modifications par étapes pour la fonctionnalité X"

Attention, cependant, que vous ne pouvez pas alors utilisez

$ git stash apply "stash @ {1}" ### ✘ ne fait pas tout à fait ce que vous voudriez

pour restaurer uniquement les modifications non mises en scène.

2
Rhubbarb

Git n'a pas de commande qui ne cache que vos modifications non mises en scène.

Cependant, Git vous permet de spécifier les fichiers que vous souhaitez stocker.

git stash Push --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

Si vous souhaitez uniquement stocker des modifications spécifiques dans ces fichiers, ajoutez l'option --patch.

git stash Push --patch --message 'Unstaged changes' -- app/controllers/products_controller.rb test/controllers/products_controller_test.rb

L'option --include-untracked vous permet de stocker des fichiers non suivis.

git stash Push --include-untracked --message 'Untracked files' -- app/controllers/widgets_controller.rb test/controllers/widgets_controller_test.rb

Exécutez git help stash (ou man git-stash) pour plus d'informations.

Remarque: Si vos modifications non mises en scène sont désorganisées, la réponse de @ alesguzik est probablement plus facile.

0
ma11hew28

Pour ajouter les fichiers non étiquetés (non ajoutés à la validation) à stocker, exécutez la commande suivante:

git stash -k

Ensuite, vous pouvez valider les fichiers mis en scène. Après cela, vous pouvez récupérer les derniers fichiers stockés à l'aide de la commande:

git stash pop
0
srth12

La forme moderne de cette commande est git stash Push [--] [<pathspec>...], puisque Git 2.16+ ( git stash save est obsolète )

Vous pouvez combiner cela avec un formulaire générique, par exemple:

git stash Push --all --keep-index ':(glob)**/*.testextension' 

Mais cela ne fonctionne pas bien avec Git pour Windows, jusqu’à Git 2.22 (T2 2019), voir numéro 2037 , considérant que git stash a été ré-implémenté en C (au lieu d’un script Shell )

Voir commit 7db9302 (11 mars 2019) de Thomas Gummerer (tgummerer) .
Voir commit 1366c78 , commit 7b556aa (07 mars 2019) de Johannes Schindelin (dscho) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 0ba1ba4 , 22 avril 2019)

stash: gérer :(glob) pathspecs à nouveau

Lorsque vous transmettez une liste de pathspecs à, par exemple, git add, nous devons faire attention à utiliser le formulaire original, pas le formulaire analysé des pathspecs.

Cela fait une différence, par exemple. en appelant

git stash -- ':(glob)**/*.txt'

où la forme d'origine inclut le préfixe :(glob) alors que la forme analysée ne l'inclut pas.

Cependant, dans le git stash intégré, nous avons passé le formulaire analysé (c'est-à-dire incorrect), et git add échouait avec le message d'erreur suivant:

fatal: pathspec '**/*.txt' did not match any files

au stade où git stash supprime les modifications de l'arborescence, même si refs/stash a été mis à jour avec succès.

0
VonC