Como aplicar um patch gerado com o git format-patch?

221

Eu tenho 2 repositórios locais git, ambos apontando para o mesmo repositório remoto.

Em um repositório git, se eu fizer git format-patch 1, como posso aplicar esse patch ao outro repositório?

Silverburgh
fonte

Respostas:

330

Nota: Você pode visualizar primeiro o que seu patch fará:

Primeiro as estatísticas:

git apply --stat a_file.patch

Em seguida, faça uma corrida a seco para detectar erros:

git apply --check a_file.patch

Por fim, você pode git amaplicar o seu patch como uma confirmação: permite assinar um patch aplicado.
Isso pode ser útil para referência posterior.

git am --signoff < a_file.patch 

Veja um exemplo neste artigo :

No seu log git, você encontrará que as mensagens de confirmação contêm uma tag "Assinada por". Essa tag será lida pelo Github e outros para fornecer informações úteis sobre como o commit terminou no código.

Exemplo

VonC
fonte
9
Nota para si mesmo: 200 ° Grande resposta Gold badge.
VonC 15/05/19
4
git am < somepatch.patchproduz "fatal: nome de identificação vazio (para <>) não permitido". Alguém pode me explicar por quê?
Gromit190 03/09/19
@ gromit190 que significa Authorcabeçalhos ruins no patch e / ou você não fez git config user.{name,email}.
ulidtko 18/06
ESTÁ BEM; git apply --checkdiz patch does not applye git apply -3diz repository lacks the necessary blob to fall back on 3-way merge.No git, rebasing commits é uma brisa; mas como as pessoas refazem seus patches sobre o código atualizado?
ulidtko 18/06
1
@ulidtko Talvez com stackoverflow.com/a/15375869/6309 ?
VonC 18/06
162
git apply name-of-file.patch
Jeff Dallien
fonte
25
Isso pode não ter respondido à pergunta detalhada original, mas a pergunta no título, e é por isso que estou nesta página. obrigado!
Rock Lee
12
Entendo que essa é uma pergunta e resposta antiga ... mas achei que poderia ser útil para algumas pessoas entender a diferença entre git apply e git am .
mgarey
1
git apply "[... caminho completo para o arquivo ...] / nome-do-arquivo.patch"
Anton Lyhin 11/07/18
41

Ou, se você está chutando a velha escola:

cd /path/to/other/repository
patch -p1 < 0001-whatever.patch
Dominic Cooney
fonte
3
Só para você saber: isso não criará uma confirmação, pois perderá as informações da mensagem e do autor da confirmação.
César
22

Primeiro, você deve tomar nota da diferença entre git amegit apply

Quando você está usando, git amgeralmente deseja aplicar muitos patches. Assim deve usar:

git am *.patch

ou apenas:

git am

O Git encontrará patches automaticamente e os aplicará em ordem ;-)

UPD
Aqui você encontra como gerar esses patches

Eugen Konkov
fonte
1
Esta explicação da diferença me ajudou a usar git apply.. e em --reverse:-) 👍
Jordan Gee
22

Se você deseja aplicá-lo como um commit , use git am .

Jakub Narębski
fonte
1
Como você costuma obter os arquivos mbox em primeiro lugar?
Ciro Santilli # 6/18
14

Se você estiver usando um JetBrains IDE (como IntelliJ IDEA, Android Studio, PyCharm), poderá arrastar o arquivo do patch e soltá-lo dentro do IDE, e uma caixa de diálogo será exibida, mostrando o conteúdo do patch. Tudo o que você precisa fazer agora é clicar em "Aplicar patch", e uma confirmação será criada.

ice1000
fonte
1
Obrigado por isso. Isso é realmente útil para todos. Há uma resposta aceita. mas isso também é útil.
Lasitha Benaragama
1
@ambarox Mas esta resposta foi downvoted uma vez, eu não sei por quê
ice1000
1
pode ser que alguém pense que a única maneira de aplicar patches é através da linha de comando. : D eu te dei um voto positivo. Felicidades companheiro.
Lasitha Benaragama
1
@LasithaBenaragama - tipo de. O SO visa não apenas ajudar o OP, mas também todos que o seguem. Esta resposta (embora útil) não fornece uma solução geral. Isso daria uma excelente publicação no blog, mas não uma resposta "TÃO boa". Explicaria o voto negativo!
OldTinfoil 15/02
-2

Você pode usar o cmd mencionado abaixo

git apply fileName.patch
Amit Sharma
fonte