Git
Français ▾ Topics ▾ Latest version ▾ git-stash last updated in 2.33.1

NOM

git-stash - Remiser les modifications d’un répertoire de travail sale

SYNOPSIS

git stash list [<options>]
git stash show [<options>] [<remisage>]
git stash drop [-q|--quiet] [<remisage>]
git stash ( pop | apply ) [--index] [-q|--quiet] [<remisage>]
git stash branch <nom-de-branche> [<remisage>]
git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
	     [-u|--include-untracked] [-a|--all] [-m|--message <message>]
	     [--pathspec-from-file=<fichier> [--pathspec-file-nul]]
	     [--] [<spéc-de-chemin>…​]]
git stash clear
git stash create [<message>]
git stash store [-m|--message <message>] [-q|--quiet] <commit>

DESCRIPTION

Utilisez git stash lorsque vous voulez enregistrer l’état actuel du répertoire de travail et de l’index, mais que vous voulez revenir à un répertoire de travail propre. La commande enregistre vos modifications locales et rétablit le répertoire de travail pour qu’il corresponde au commit HEAD.

Les modifications remisées par cette commande peuvent être listées avec git stash list, inspectées avec git stash show, et restaurées (potentiellement au dessus d’un commit différent) avec git stash apply. Appeler git stash sans aucun argument est équivalent à git stash push. Un remisage est par défaut listé comme "WIP sur nom-de-branche …​", mais vous pouvez donner un message plus descriptif sur la ligne de commande lorsque vous en créez un.

Le dernier remisage que vous avez créé est stocké dans refs/stash ; les anciens remisages se trouvent dans le reflog de cette référence et peuvent être nommés en utilisant la syntaxe habituelle du reflog (par exemple stash@{0} est le dernier remisage créé, stash@{1} est celui qui le précède, stash@{2.hours.ago} est également possible). On peut également référencer les remisages en spécifiant uniquement l’index du remisage (par exemple, l’entier n est équivalent à stash@{n}).

COMMANDES

push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--pathspec-from-file=<fichier> [--pathspec-file-nul]] [--] [<spéc-de-chemin>…​]

Enregistre vos modifications locales dans une nouvelle "entrée de remisage" et les ramène dans HEAD (dans l’arbre de travail et dans l’index). La partie <message> est facultative et donne la description ainsi que l’état du remisage.

Pour faire rapidement un instantané, vous pouvez omettre "push". Dans ce mode, les arguments de non-optionnels ne sont pas autorisés pour empêcher une sous-commande mal orthographiée de faire une entrée indésirable dans le remisage. Les deux exceptions sont stash -p qui agit comme alias pour push -p et les éléments spéc-de-chemin, qui sont autorisés après un double trait d’union -- pour la désambiguïsation.

save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]

Cette option est déconseillée au profit de l’option 'git stash push". Elle diffère de "stash push" en ce qu’elle ne peut pas prendre de spéc-de-chemin. Au lieu de cela, tous les arguments non liés à une option sont concaténés pour former le message de remisage.

list [<options>]

Dresser la liste des entrées de remisage que vous avez actuellement. Chaque entrée de remisage est listée avec son nom (par exemple, stash@{0} est la dernière entrée, stash@{1} est l’entrée précédente, etc.), le nom de la branche en cours au moment où l’entrée a été faite, et une courte description du commit sur lequel l’entrée est basée.

stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
stash@{1}: On master: 9cc0589... Add git-stash

La commande prend les options applicables à la commande git log pour contrôler ce qui est affiché et comment. Voir git-log[1].

show [<options>] [<remisage>]

Afficher les modifications enregistrées dans l’entrée de remisage comme une différence entre le contenu du remisage et le commit tel qu’il était quand l’entrée de remisag a été créée pour la première fois. Par défaut, la commande affiche le diffstat, mais elle accepte tout format connu de git diff (par exemple, git stash show -p stash@{1} pour afficher la deuxième entrée la plus récente sous forme de rustine). Vous pouvez utiliser les variables de configuration stash.showStat et/ou stash.showPatch pour modifier le comportement par défaut.

pop [--index] [-q|--quiet] [<remise>]

Supprimer un seul remisage de la liste des remisages et l’appliquer par dessus l’état de l’arbre de travail actuel, c’est-à-dire faire l’opération inverse de git stash push. Le répertoire de travail doit correspondre à l’index.

L’application de l’état peut échouer en cas de conflit ; dans ce cas, il n’est pas retiré de la liste de remisages. Vous devez résoudre les conflits à la main et appeler ensuite git stash drop manuellement.

apply [--index] [-q|--quiet] [<remise>]

Comme pop, mais ne pas supprimer l’état de la liste de remisages. Contrairement à pop, <stash> peut être n’importe quel commit qui ressemble à un commit créé par stash push ou stash create.

branch <nom-de-branche> [<remisage>]

Créer et extraire une nouvelle branche nommée <nom-de-branche> à partir du commit où le <remisage> a été créé à l’origine, appliquer les modifications enregistrées dans le <remisage> au nouvel arbre de travail et à l’index. Si cela réussit, et que le <remisage> est une référence de la forme stash@{<révision>}, abandonner alors le <remisage>.

Ceci est utile si la branche sur laquelle vous avez lancé git stash push a suffisamment changé pour que git stash apply échoue à cause de conflits. Puisque l’entrée de remisage est appliquée sur le commit qui était HEAD au moment où git stash a été lancé, elle restaure l’état d’origine remisé sans conflit.

clear

Supprimer toutes les entrées de remisage. Notez que ces entrées seront alors soumises à un élagage et pourraient être impossibles à récupérer (voir "Exemples" ci-dessous pour une stratégie possible).

drop [-q|--quiet] [<remisage>]

Supprimer une seule entrée de la liste des entrées de remisage.

create

Créer une entrée de remisage (qui est un objet commit régulier) et renvoyer son nom d’objet, sans le stocker nulle part dans l’espace de noms de références. Ceci est destiné à être utilisé par les scripts. Ce n’est probablement pas la commande que vous voulez utiliser ; voir "push" ci-dessus.

store

Stocker un remisage donné créé via git stash create (qui est un commit de fusion en cours) dans la référence de remisage, en mettant à jour le reflog de remisage. Ceci est destiné à être utilisé par des scripts. Ce n’est probablement pas la commande que vous souhaitez utiliser ; voir "push" ci-dessus.

OPTIONS

-a
--all

Cette option n’est valable que pour les commandes push et save.

Tous les fichiers ignorés et non tracés sont également remisés puis nettoyés avec git clean.

-u
--include-untracked

Cette option n’est valable que pour les commandes push et save.

Tous les fichiers non suivis sont également remisé puis nettoyés avec git clean.

--index

Cette option n’est valable que pour les commandes pop et apply.

Tenter de rétablir non seulement les modifications de l’arbre de travail, mais aussi celles de l’index. Cependant, cela peut échouer, lorsque vous avez des conflits (qui sont stockés dans l’index, où vous ne pouvez donc plus appliquer les modifications telles qu’elles étaient à l’origine).

-k
--keep-index
--no-keep-index

Cette option n’est valable que pour les commandes push et save.

Tous les changements déjà ajoutés à l’index sont laissés intacts.

-p
--patch

Cette option n’est valable que pour les commandes push et save.

Sélectionner interactivement les section à remiser à partir de la différence entre HEAD et l’arbre de travail. L’entrée de remisage est construite de manière à ce que son état d’index soit le même que celui de votre dépôt, et son arbre de travail ne contient que les modifications que vous avez sélectionnées de manière interactive. Les modifications sélectionnées sont ensuite inversées à partir de votre arbre de travail. Voir la section "Mode interactif" de git-add[1] pour savoir comment utiliser le mode --patch.

L’option --patch implique --keep-index. Vous pouvez utiliser l’option --no keep-index pour passer outre.

--pathspec-from-file=<fichier>

Cette option n’est valide que pour la commande push.

Le spécificateur de chemin est passé dans <fichier> au lieu des arguments de la ligne de commande. Si <fichier> vaut - alors l’entrée standard est utilisée. Les éléments du spécificateur de chemin sont séparés par LF ou CR/LF. Les éléments du spécificateur de chemin peuvent être cités comme expliqué pour la variable de configuration core.quotePath (voir git-config[1]). Voir aussi l’option --pathspec-file-nul et l’option globale --literal-pathspecs.

--pathspec-file-nul

Cette option n’est valide que pour la commande push.

Uniquement significatif avec --pathspec-from-file. Les éléments du spécificateur de chemin sont séparés par le caractère NUL et tous les autres caractères sont utilisés littéralement (y compris les retours à la ligne et les guillemets).

-q
--quiet

Cette option n’est valable que pour les commandes apply, drop, pop, push, save, store.

Silencieux, supprimer les messages d’état.

--

Cette option n’est valide que pour la commande push.

Sépare le spécificateur de chemin et les options à des fins de désambiguïsation.

<spécificateur de chemin>…​

Cette option n’est valide que pour la commande push.

La nouvelle entrée de remisage enregistre les états modifiés uniquement pour les fichiers qui correspondent au spécificateur de chemin. Les entrées d’index et les fichiers de l’arbre de travail sont ensuite ramenées à l’état de HEAD uniquement pour ces fichiers, également, laissant intacts les fichiers qui ne correspondent pas à la spécification du chemin.

Pour plus de détail, voir l’entrée spécificateur de chemin dans gitglossary[7].

<remisage>

Cette option n’est valable que pour les commandes apply, branch, drop, pop, show.

Une référence de la forme stash@{<révision>}. Lorsqu’aucun <remisage> n’est donné, le dernier remisage est supposé (c’est-à-dire, stash@{0}).

DISCUSSION

Une entrée de remisage est représentée par un commit dont l’arbre enregistre l’état du répertoire de travail, et son premier parent est le commit à HEAD lorsque l’entrée a été créée. L’arborescence du second parent enregistre l’état de l’index lorsque l’entrée est créée, et il est considéré comme un enfant du commit HEAD. Le graphique d’ascendance ressemble à ceci :

       .----W
      /    /
-----H----I

H est le commit HEAD, I est un commit qui enregistre l’état de l’index, et W est un commit qui enregistre l’état de l’arbre de travail.

EXEMPLES

Tirer dans un arbre sale

Lorsque vous êtes au milieu de quelque chose, vous apprenez qu’il y a des changements en amont qui peuvent avoir un rapport avec ce que vous faites. Lorsque vos changements locaux n’entrent pas en conflit avec les changements en amont, un simple git pull vous permettra d’aller de l’avant.

Cependant, il y a des cas où vos modifications locales entrent en conflit avec les changements en amont, et git pull refuse d’écraser vos modifications. Dans ce cas, vous pouvez remiser vos modifications, effectuer un tirage, puis les déstocker, comme ceci :

$ git pull
 ...
fichier foobar pas à jour, fusion impossible.
$ git stash
$ git pull
$ git stash pop
Interruption du flux de travail

Lorsque vous êtes au milieu de quelque chose, votre patron arrive et vous demande de réparer quelque chose immédiatement. Traditionnellement, vous faîtes un commit dans une branche temporaire pour stocker vos modifications et vous retournez dans votre branche d’origine pour effectuer la réparation d’urgence, comme ceci :

# ... travail, travail, travail ...
$ git switch -c my_wip
$ git commit -a -m "WIP"
$ git switch master
$ edit emergency fix
$ git commit -a -m "Correction rapide"
$ git switch my_wip
$ git reset --soft HEAD^
# ... continue le travail ...

Vous pouvez utiliser git stash pour simplifier ce qui précède, comme ceci :

# ... travail, travail, travail ...
$ git stash
$ édition de la correction rapide
$ git commit -a -m "Correction en catastrophe"
$ git stash pop
# ... continue le travail ...
Test des commits partiels

Vous pouvez utiliser git stash push --keep-index lorsque vous voulez faire deux ou plusieurs commits à partir des modifications dans l’arbre de travail, et que vous voulez tester chaque modification avant de faire un commit :

# ... travail, travail, travail ...
$ git add --patch foo            # ajouter seulement la première partie de l'index
$ git stash push --keep-index    # remiser toutes les autres modifications
$ éditer/construire/tester la première partie
$ git commit -m 'Première partie'     # valider une modification complètement testée
$ git stash pop                  # préparer à travailler sur les autres modifications
# ... répéter les cinq tâches ci-dessus jusqu'à ce qu'il ne reste qu'un commit ...
$ éditer/construire/tester le restant
$ git commit foo -m 'Partie restante'
Récupération des entrées de remisage qui ont été effacées/abandonnées par erreur

Si vous laissez tomber ou videz par erreur les entrées de remisage, elles ne peuvent pas être récupérées par les mécanismes de sécurité habituels. Cependant, vous pouvez essayer l’incantation suivante pour obtenir une liste des entrées de remisage qui sont toujours dans votre dépôt, mais qui ne sont plus accessibles :

git fsck --unreachable |
grep commit | cut -d\ -f3 |
xargs git log --merges --no-walk --grep=WIP

GIT

Fait partie de la suite git[1]

TRADUCTION

Cette page de manuel a été traduite par Jean-Noël Avila <jn.avila AT free DOT fr> et les membres du projet git-manpages-l10n. Veuillez signaler toute erreur de traduction par un rapport de bogue sur le site https://github.com/jnavila/git-manpages-l10n .