Blocca le modifiche mantenendo le modifiche nella directory di lavoro in Git


146

Esiste un git stashcomando che blocca le modifiche, ma le mantiene anche nella directory di lavoro? Quindi praticamente git stash; git stash applyin un passo?




1
@MariuszPawelski No, non proprio. Questa domanda è più specifica della mia. La risposta alla mia domanda era semplicemente "no". Grazie per il link, tuttavia, potrebbe essere utile per alcune persone, o anche per me stesso in un secondo momento.
Michael Dorst,

Per essere chiari, la mia domanda è diversa perché non ho l'obbligo che i file rimangano intatti. Stavo semplicemente cercando alternative a git stash && git stash apply. Noterai che le risposte a quella domanda sono abbastanza diverse dalle mie.
Michael Dorst,

ah, giusto, la tua domanda è un po 'meno specifica. Ma ho posto questa domanda perché anche le sue risposte soddisfano le tue esigenze. E in questo modo questa domanda appare come "Collegata" nella barra laterale, quindi potrebbe essere utile a qualcuno.
Mariusz Pawelski

Risposte:


157

Per quello che vale, un altro modo per farlo è mettere in scena i cambiamenti che vuoi mantenere, e quindi riporre tutto usando --keep-index:

$ git add modified-file.txt
$ git stash push --keep-index

I comandi precedenti nasconderanno tutto, ma lasceranno i file messi in scena nella directory di lavoro.

Dalla documentazione ufficiale di Linux Kernel Git pergit stash o da git-scm :

Se --keep-indexsi utilizza l' opzione, tutte le modifiche già aggiunte all'indice vengono lasciate intatte.


3
questa è di gran lunga la spiegazione più semplice di --keep-index che ho visto. Non ho capito bene il significato dal modo in cui era scritto sui documenti.
40 detective

52

git stashe poi git stash apply( git stash && git stash apply) stash i file e applica stash immediatamente dopo di esso. Quindi, dopo tutto, avrai i tuoi cambiamenti nella scorta e nella directory di lavoro.

Puoi creare un alias se lo desideri in un unico pezzo. Metti qualcosa di simile a ~/.gitconfig:

[alias]
    sta = "!git stash && git stash apply"

Lo svantaggio di questo approccio è che tutti i file vengono archiviati e ricreati. Ciò significa che i timestamp sui file in questione verranno modificati. (Provocare Emacs a lamentarsi quando provo a salvare il file se aperto prima di averlo fatto git sta, e può causare ricostruzioni inutili se stai usando makeo amici.)


1
inoltre, qual è la differenza tra git stash; git stash applye git stash && git stash apply?
Michael Dorst,


2
@anthropomorphic git config --global alias.sta "!git stash && git stash apply"dovrebbe farlo.

Come posso modificare questo alias da usare git stash savecon un argomento e poi fare git stash apply?
Spinningarrow,

1
@JaySidri, bang significa che in realtà è un comando esterno, non un argomento git stesso. Come da documenti : "Come puoi dire, Git sostituisce semplicemente il nuovo comando con qualunque cosa tu abbia per alias. Tuttavia, potresti voler eseguire un comando esterno, piuttosto che un sottocomando Git. In tal caso, avvii il comando con un ! carattere."
madhead,

10

Un piccolo miglioramento nella risposta che in pratica potrebbe essere utile.

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"

NOTA: non funziona senza "git add" (ad es. Per i file modificati ma non aggiunti ai file di commit)
alex_1948511

4

C'è un trucco che può esserti di aiuto, non di nascosto, ma FWIW:

git add -A
git commit -m "this is what's called stashing"       (create new stash commit)
git tag stash                               (mark the commit with 'stash' tag)
git reset HEAD~        (Now go back to where you've left with your working dir intact)

E così ora hai una scorta di tag con commit a tua disposizione, non è possibile farlo git stash popcomunque, ma puoi fare cose come la creazione di patch o il ripristino di file ecc. Da lì, i tuoi file di directory di lavoro vengono lasciati intatti BTW.


3

È possibile utilizzare git stash createper creare un commit stash e quindi salvarlo nello stash utilizzando git stash store:

git stash store $(git stash create) -m "Stash commit message"

Questo può essere salvato in un alias git per renderlo più conveniente:

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

Nota che questo non fa tutto ciò che git stash pushfa. Ad esempio, non aggiunge il nome del ramo al commit, ad esempio " stash@{0}: On myBranch: Stash commit message".


1
Ama questo!! Una correzione però: man git-stashdice che -m <message>deve venire prima dell'hash di commit. Tranne qualcosa che cambia nell'ultima git.
tanius,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.