git format-patchtambém inclui diferenças binárias e algumas informações meta. Na verdade, essa seria a melhor aposta para a criação de um patch, mas depois disso isso funciona apenas para fontes / alterações verificadas, certo?
Eric
20
Às vezes, pode ser útil criar um patch em relação ao diretório atual. Para conseguir isso, use git diff --relative
ejboy
30
git diff> a.patch para escrevê-lo para um arquivo
qasimzee
139
Contornando a fronteira sarcástica, a resposta abaixo é mais útil.
Air
1865
Se você ainda não confirmou as alterações, então:
git diff > mypatch.patch
Mas às vezes acontece que parte das coisas que você está fazendo são novos arquivos que não são rastreados e não estarão na sua git diffsaída. Portanto, uma maneira de fazer um patch é preparar tudo para um novo commit ( git addcada arquivo ou apenas git add .), mas não faça o commit e, em seguida:
git diff --cached > mypatch.patch
Adicione a opção 'binário' se desejar adicionar arquivos binários ao patch (por exemplo, arquivos mp3):
git diff --cached --binary > mypatch.patch
Posteriormente, você pode aplicar o patch:
git apply mypatch.patch
Nota: Você também pode usar --stagedcomo sinônimo de --cached.
Muito obrigado pelo exemplo. Ao contrário da resposta aceita, você mostra os comandos como fazê-lo e não apenas fala. Muito útil e trabalhou impecável para mim :)
Nuala
4
Fiz exatamente isso e obtive "fatal: entrada não reconhecida" ao executar o git apply. Alguma idéia do que pode causar isso e como corrigi-lo?
Vitaly
6
@ Vitaly: o seu patch pode ser lido se você o abrir com um editor de texto? deve estar limpo sem caracteres estranhos, por exemplo, se a configuração color.diff estiver definida, seu patch terá alguns 'caracteres coloridos' que podem fazer com que 'git apply' falhe, nesse caso, tente git diff --no-color. Caso contrário, parece um problema de codificação.
jcarballo
3
Relacionado a "novos arquivos que não são rastreados": "git diff" e "git diff --cached" funcionam apenas se "git add <file>" tiver sido chamado primeiro. (Eu sou novo para git e se perguntou por que eu tenho uma toda área vazia)
Anônimo
5
Isso me fez fora de uma estranha inferno merge / rebase muito facilmente, graças :)
John Hunt
86
git diffe git applyfuncionará para arquivos de texto, mas não funcionará para arquivos binários.
Você pode criar facilmente um patch binário completo, mas precisará criar uma confirmação temporária. Depois de fazer seu commit temporário, você pode criar o patch com:
git format-patch <options...>
Depois de fazer o patch, execute este comando:
git reset --mixed <SHA of commit *before* your working-changes commit(s)>
Isso reverterá suas confirmações temporárias. O resultado final deixa sua cópia de trabalho (intencionalmente) suja com as mesmas alterações que você teve originalmente.
No lado do recebimento, você pode usar o mesmo truque para aplicar as alterações na cópia de trabalho, sem ter o histórico de confirmação. Simplesmente aplique o (s) remendo (s) e git reset --mixed <SHA of commit *before* the patches>.
Observe que talvez você precise estar bem sincronizado para que toda essa opção funcione. Eu vi alguns erros ao aplicar patches quando a pessoa que os fazia não havia retirado tantas alterações quanto eu. Provavelmente existem maneiras de fazê-lo funcionar, mas eu não olhei muito para isso.
Veja como criar os mesmos patches no Tortoise Git (não que eu recomendo usar essa ferramenta):
Confirme suas alterações de trabalho
Clique com o botão direito do mouse no diretório raiz da ramificação e clique em Tortoise Git->Create Patch Serial
Escolha o intervalo que fizer sentido ( Since: FETCH_HEADfuncionará se você estiver bem sincronizado)
Crie os patches
Clique com o botão direito do mouse no diretório raiz da ramificação e clique em Tortise Git->Show Log
Clique com o botão direito do mouse no commit antes do seu commit temporário e clique emreset "<branch>" to this...
Selecione a Mixedopção
E como aplicá-los:
Clique com o botão direito do mouse no diretório raiz da ramificação e clique em Tortoise Git->Apply Patch Serial
Selecione os patches corretos e aplique-os
Clique com o botão direito do mouse no diretório raiz da ramificação e clique em Tortise Git->Show Log
Clique com o botão direito do mouse na confirmação antes da confirmação do patch e clique emreset "<branch>" to this...
Em qualquer diretório do repositório do projeto, execute:
git make-patch
Este comando será criado 0001-uncommited.patchno seu diretório atual. O patch conterá todas as alterações e arquivos não rastreados visíveis para o próximo comando:
Também podemos especificar os arquivos, para incluir apenas os arquivos com alterações relativas, principalmente quando eles abrangem vários diretórios ex
Achei que isso não estava especificado nas respostas ou nos comentários, que são relevantes e corretos, então decidi adicioná-lo. Explícito é melhor que implícito!
Respostas:
git diff
para alterações sem etapas.git diff --cached
para mudanças em etapas.fonte
git format-patch
também inclui diferenças binárias e algumas informações meta. Na verdade, essa seria a melhor aposta para a criação de um patch, mas depois disso isso funciona apenas para fontes / alterações verificadas, certo?git diff --relative
Se você ainda não confirmou as alterações, então:
Mas às vezes acontece que parte das coisas que você está fazendo são novos arquivos que não são rastreados e não estarão na sua
git diff
saída. Portanto, uma maneira de fazer um patch é preparar tudo para um novo commit (git add
cada arquivo ou apenasgit add .
), mas não faça o commit e, em seguida:Adicione a opção 'binário' se desejar adicionar arquivos binários ao patch (por exemplo, arquivos mp3):
Posteriormente, você pode aplicar o patch:
Nota: Você também pode usar
--staged
como sinônimo de--cached
.fonte
git diff --no-color
. Caso contrário, parece um problema de codificação.git diff
egit apply
funcionará para arquivos de texto, mas não funcionará para arquivos binários.Você pode criar facilmente um patch binário completo, mas precisará criar uma confirmação temporária. Depois de fazer seu commit temporário, você pode criar o patch com:
Depois de fazer o patch, execute este comando:
Isso reverterá suas confirmações temporárias. O resultado final deixa sua cópia de trabalho (intencionalmente) suja com as mesmas alterações que você teve originalmente.
No lado do recebimento, você pode usar o mesmo truque para aplicar as alterações na cópia de trabalho, sem ter o histórico de confirmação. Simplesmente aplique o (s) remendo (s) e
git reset --mixed <SHA of commit *before* the patches>
.Observe que talvez você precise estar bem sincronizado para que toda essa opção funcione. Eu vi alguns erros ao aplicar patches quando a pessoa que os fazia não havia retirado tantas alterações quanto eu. Provavelmente existem maneiras de fazê-lo funcionar, mas eu não olhei muito para isso.
Veja como criar os mesmos patches no Tortoise Git (não que eu recomendo usar essa ferramenta):
Tortoise Git
->Create Patch Serial
Since
:FETCH_HEAD
funcionará se você estiver bem sincronizado)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
opçãoE como aplicá-los:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
opçãofonte
Para criar um patch com os arquivos novos e modificados (em etapas), você pode executar:
fonte
git diff --cached > mypatch.patch
não está funcionando.file_name.patch
ser usado pelopatch
comando? Eles são compatíveis um com o outro?Eu gosto:
onde
<N>
é o número do último commit para salvar como patches.Os detalhes de como usar o comando estão no DOC
UPD
Aqui você pode encontrar como aplicá-los.
UPD Para quem não teve a ideia de
format-patch
Adicionar alias:
Em qualquer diretório do repositório do projeto, execute:
Este comando será criado
0001-uncommited.patch
no seu diretório atual. O patch conterá todas as alterações e arquivos não rastreados visíveis para o próximo comando:fonte
Se você deseja fazer binário, dê uma
--binary
opção ao executargit diff
.fonte
Também podemos especificar os arquivos, para incluir apenas os arquivos com alterações relativas, principalmente quando eles abrangem vários diretórios ex
Achei que isso não estava especificado nas respostas ou nos comentários, que são relevantes e corretos, então decidi adicioná-lo. Explícito é melhor que implícito!
fonte