O stash muda enquanto mantém as alterações no diretório ativo no Git

145

Existe um git stashcomando que esconde suas alterações, mas também as mantém no diretório de trabalho? Então, basicamente git stash; git stash apply, um passo?

Michael Dorst
fonte
Mesma pergunta: stackoverflow.com/q/6315459/350384
Mariusz Pawelski 27/03
Isso responde sua pergunta? Comando Git para salvar um esconderijo sem modificar a árvore de trabalho?
Mariusz Pawelski 27/03
1
@MariuszPawelski Não, na verdade não. Essa pergunta é mais específica que a minha. A resposta para minha pergunta foi simplesmente "não". Obrigado pelo link, porém, pode ser útil para algumas pessoas, ou para mim mesmo posteriormente.
Michael Dorst
Para esclarecer, minha pergunta é diferente porque não tenho nenhum requisito de que os arquivos permaneçam intocados. Eu estava apenas procurando alternativas para git stash && git stash apply. Você notará que as respostas para essa pergunta são bem diferentes das minhas.
Michael Dorst
ah, certo, sua pergunta é um pouco menos específica. Mas fiz essa pergunta porque suas respostas também atendem às suas necessidades. E dessa maneira essa pergunta aparece como "Vinculada" na barra lateral; portanto, pode ser útil para alguém.
Mariusz Pawelski 29/03

Respostas:

156

Pelo que vale, outra maneira de fazer isso é preparar as alterações que você deseja manter e, em seguida, esconder tudo usando --keep-index:

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

Os comandos acima esconderão tudo, mas deixarão os arquivos organizados em seu diretório de trabalho.

Na documentação oficial do Linux Kernel Git paragit stash ou do git-scm :

Se a --keep-indexopção for usada, todas as alterações já adicionadas ao índice serão deixadas intactas.

Cirelli94
fonte
3
esta é de longe a explicação mais direta de --keep-index que eu já vi. Eu não entendi muito bem o significado que estava escrito nos documentos.
40detectives 17/03
52

git stashe então git stash apply( git stash && git stash apply) armazenará arquivos ocultos e os aplicará imediatamente após o mesmo. Afinal, você terá suas alterações no esconderijo e no diretório de trabalho.

Você pode criar um alias se desejar em uma única peça. Basta colocar algo assim para ~/.gitconfig:

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

A desvantagem dessa abordagem é que todos os arquivos são ocultados e recriados. Isso significa que os carimbos de data e hora nos arquivos em questão serão alterados. (Fazer com que o Emacs se queixe quando tento salvar o arquivo, se o abri-lo antes de o fazer git sta, e pode causar reconstruções desnecessárias se você estiver usando makeou amigos.)

louco
fonte
1
Além disso, qual é a diferença entre git stash; git stash applye git stash && git stash apply?
Michael Dorst
2
@anthropomorphic git config --global alias.sta "!git stash && git stash apply"deve fazê-lo.
Como posso modificar esse alias para usar git stash savecom um argumento e depois fazer git stash apply?
Spinningarrow
1
@ JaySidri, bang significa que na verdade é um comando externo, não um argumento git. Conforme a documentação : "Como você pode ver, o Git simplesmente substitui o novo comando pelo nome que você quer usar. No entanto, talvez você queira executar um comando externo, em vez de um subcomando Git. Nesse caso, você inicia o comando com um ! personagem."
madhead
10

Um pequeno aprimoramento na resposta que, na prática, pode provavelmente usar.

$ git add modified-file.txt  
(OR $ git add .    ---- for all modified file)
$ git stash save --keep-index "Your Comment"
Premchandra Singh
fonte
OBSERVAÇÃO: não funciona sem o "git add" (por exemplo, para arquivos modificados, mas não adicionados aos arquivos de confirmação)
alex_1948511 29/11
4

Há um truque que pode ajudá-lo, não esconder coisas, mas 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 agora que você tem um stash com etiqueta de confirmação à sua disposição, não é possível fazer isso de git stash popqualquer maneira, mas você pode fazer coisas como criar patches ou redefinir arquivos etc. a partir daí, seus arquivos dir de trabalho também ficam intactos.

KenIchi
fonte
2

Você pode usar git stash createpara criar uma confirmação de stash e salvá-la no stash usando git stash store:

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

Isso pode ser salvo em um alias do git para torná-lo mais conveniente:

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

git stash-keep -m "Stash commit message"

Observe que isso não faz tudo o que git stash pushfaz. Por exemplo, ele não anexa o nome da ramificação ao commit, por exemplo " stash@{0}: On myBranch: Stash commit message".

M. Justin
fonte
1
Amo este!! Porém, uma correção: man git-stashdiz que o -m <message>item deve vir antes do hash de confirmação. Exceto que alguma mudança no git mais recente.
tanius