Como eu poderia extrair um único arquivo (ou alterações em um arquivo) de um git stash?
Pergunta
Eu gostaria de saber se é possível extrair um único arquivo ou diff de um arquivo de um git stash sem estourar o conjunto de alterações esconderijo off.
Poder ninguém ser capaz de fornecer algumas sugestões / ideias sobre isso?
Solução
Na git de trabalho esconderijo manpage você pode ler (na seção "Discussão", logo após "Opções" inscrição) que:
Um estoque é representado como um commit cuja árvore registra o estado do diretório de trabalho, e seu primeiro pai é a cometer pelo CABEÇA quando o esconderijo foi criado.
Então você pode tratar estoque (por exemplo stash@{0}
é o primeiro / superior esconderijo) como um merge commit, e usar:
$ git diff stash@{0}^1 stash@{0} -- <filename>
Explicação: meios stash@{0}^1
o primeiro pai do esconderijo dado que, como indicado na explicação acima é a cometer em que as mudanças foram escondidos. Nós usamos esta forma de "git diff" (com dois commits), porque stash@{0}
/ refs/stash
é uma mesclagem de cometer, e temos de dizer git que pai queremos diff contra. Mais enigmática:
$ git diff stash@{0}^! -- <filename>
também deve trabalho (ver git rev-parse página de manual para explicação do rev^!
sintaxe, na seção "Especificando varia").
Da mesma forma, você pode usar git checkout para verificar um único arquivo para fora do esconderijo :
$ git checkout stash@{0} -- <filename>
ou para salvá-lo com outro nome de arquivo:
$ git show stash@{0}:<full filename> > <newfile>
ou
$ git show stash@{0}:./<relative filename> > <newfile>
( Nota ??em> que aqui stash@{0}
)).
Você pode precisar stash@{0}
proteger da expansão shell, ou seja, o uso "stash@{0}"
ou 'stash@{0}'
.
Outras dicas
Se você usar git stash apply
em vez de git stash pop
, ele vai aplicar o stash para a sua árvore de trabalho, mas ainda manter o esconderijo.
Com este feito, você pode add
/ commit
o arquivo que você quer e, em seguida, redefinir as alterações restantes.
Resposta curta ??h2>
Para ver todo o arquivo: git show stash@{0}:<filename>
Para ver o diff: git diff stash@{0}^1 stash@{0} -- <filename>
Há uma maneira fácil de obter mudanças de qualquer ramo, incluindo esconderijos:
$ git checkout --patch stash@{0} path/to/file
Você pode omitir a especificação do arquivo se você deseja corrigir em muitas partes. Ou patch omitir (mas não o caminho) para obter todas as alterações em um único arquivo. Substitua 0
com o número de estoque de git stash list
, se você tiver mais de um. Note que este é como diff
e ofertas de aplicar todas diferenças entre os ramos. Para obter mudanças de apenas um único commit / stash, ter um olhar para git cherry-pick --no-commit
.
$ git checkout stash@{0} -- <filename>
Notas:
-
Certifique-se de que você espaço colocar após o "-" e o nome do arquivo de parâmetros
-
Substitua zero (0) com o seu número específico esconderijo. Para obter a lista de estoque, use:
git stash list
Com base da Jakub Narebski resposta - versão mais curta ??p>
Você pode obter o diff para um esconderijo com "git show stash@{0}
" (ou qualquer que seja o número do estoque é, ver "lista git stash"). É fácil de extrair a seção do diff para um único arquivo.
O conceito mais simples de entender, embora talvez não o melhor, é que você tem três arquivos alterados e você quer esconder um arquivo.
Se você fizer git stash
para esconder todos eles, git stash apply
para trazê-los de volta e, em seguida, git checkout f.c
no arquivo em questão para efetivamente redefini-la.
Quando você quiser unstash esse arquivo run fazer um git reset --hard
e depois executar git stash apply
novamente, aproveitando ofthe fato de que git stash apply
não resolver o diff da pilha esconderijo.
Se os arquivos escondidos precisa para se fundir com a versão atual para usar as formas anteriores usando diff. Caso contrário, você pode usar git pop
para unstashing eles, git add fileWantToKeep
para encenar seu arquivo, e fazer um git stash save --keep-index
, para stashing tudo, exceto o que está no palco.
Lembre-se que a diferença desta forma com os anteriores é que ele "aparece" o arquivo de esconderijo. As respostas anteriores mantê-lo git checkout stash@{0} -- <filename>
assim vai de acordo com suas necessidades.