Je voudrais faire le flux de travail suivant:
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
git stash save
a une option --keep-index
qui répond exactement à vos besoins.
Donc, lancez git stash save --keep-index
.
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
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.
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
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 ...)
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.
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.
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
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 à nouveauLorsque 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), etgit 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 sirefs/stash
a été mis à jour avec succès.