Como eu poderia extrair um único arquivo (ou alterações em um arquivo) de um git stash?

StackOverflow https://stackoverflow.com/questions/1105253

  •  12-09-2019
  •  | 
  •  

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?

Foi útil?

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 que aqui é nome de caminho completo de um arquivo relativo ao diretório superior de um projeto (pense: em relação ao 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

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:

  1. Certifique-se de que você espaço colocar após o "-" e o nome do arquivo de parâmetros

  2. 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

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top