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?

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

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

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.


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.


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.