Como posso formatar o patch com o que guardo

140

No git, escondo minhas alterações. É possível criar um patch com o que eu escondo? E então aplicar esse patch em algum outro repositório (do meu colega de trabalho)?

Eu sei git format-patch -1, mas acho que é para o que comprometi. Mas estou procurando a mesma coisa por mudanças que eu escondi.

E como posso aplicar um patch em outro repositório?

Silverburgh
fonte

Respostas:

155

Claro, git stash showsuporta isso:

git stash show -p

Então use

git stash list

para descobrir o número do stash que você deseja exportar como um patch e, em seguida,

git stash show -p stash@{<number>} > <name>.patch

exportá-lo.

Por exemplo:

git stash show -p stash@{3} > third_stash.patch
Greg Hewgill
fonte
1
Tenho uma pergunta relacionada sobre a aplicação de um patch. Digamos que meu patch toque em vários arquivos. Existe uma maneira de aplicar o patch 'interativamente'? Escolha em quais arquivos do patch devo aplicar o patch? Posso fazer isso?
Silverburgh
1
@ Silverburgh: dei uma olhada rápida man patche não vi nenhuma opção para aplicação de patches interativa. No entanto, como os arquivos de patch são arquivos de texto sem formatação, normalmente o que se faria é editar o patch em um editor de texto para recortar as partes relevantes a serem aplicadas patch. Como alternativa, se você estiver aplicando o patch em outro repositório Git, poderá aplicar tudo e selecionar seletivamente os git checkoutarquivos que não deseja alterar ( git checkoutcom um nome de arquivo que joga fora as alterações não-estágios).
Greg Hewgill
1
@ silverburgh, você pode restringir o conjunto de arquivos corrigidos usando os parâmetros "--exclude" e "--include" do git.
Kelvin19 /
@ Silverburgh, você pode fazer o seguinte, assumindo que possui um patch. aplique o patch completamente e, em seguida, aplique git add --interactive ${YOUR_FILES}e ele lhe dará a chance de confirmar parcialmente.
8283 Alex
15
Obrigado. Isso funcionou para mim:git stash show -p stash@{1} > patch.txt
Ryan
63

Esta resposta fornece informações sobre como salvar o patch e aplicá-lo onde você deseja usá-lo.

Para ocultar a saída em um arquivo:

 git stash show -p --color=never > my-patch-name.patch

Verifique se o patch está bom:

git apply --stat my-patch-name.patch

Verifique se não há erros:

git apply --check my-patch-name.patch

Aplique o patch

git apply my-patch-name.patch
calvinf
fonte
Este funcionou para mim com arquivos de código de texto sem formatação, mas eu tive que explicar o espaço em branco. Verifique se o patch está bom: git apply --check --ignore-space-change --ignore-whitespace my-patch-name.patch Aplique o patch: git apply --ignore-space-change --ignore-whitespace my-patch-name.patch
Craig Boland
Explicação agradável e concisa. Para que funcionasse, eu tinha que estar na raiz do repositório ao aplicar o patch, caso contrário git apply, não pegava o diff.
Max
16

Usar

$> git stash list
stash@{0}: WIP on master: 84fx31c Merged with change to /public/
stash@{1}: WIP on master: 463yf85 FlupResource: also takes json as a query parameter

para obter uma lista das suas coisas escondidas recentemente. Na verdade, o Git cria objetos de confirmação quando você esconde.

Eles são commits como todo o resto. Você pode vê-los em uma filial:

$> git checkout -b with_stash stash@{0}

Em seguida, você pode publicar esta ramificação e seu colega pode mesclar ou escolher essa confirmação.

perito
fonte
13

As soluções acima não funcionarão para dados binários. A seguir, adicione suporte para ele:

git stash show stash@{0} -p --binary

Editar

Nota: Eu só queria adicionar um comentário às respostas acima, mas minha reputação não é suficiente.

Davide Guerri
fonte
3

Acredito que essa possa ser uma das atualizações do Git recentemente. você não precisa mais corrigir as alterações que guardou. basta aplicar as alterações ocultas em um ramo para outro.

diga na ramificação A, você escondeu algumas alterações, conhecidas como stash @ {1}.

agora você muda para a ramificação B. você pode simplesmente:

$git stash apply stash@{1}

isso aplica seu ramo A muda para o ramo B.

stucash
fonte