Qual é a diferença entre 'git format-patch e' git diff '?

92

Não vejo diferença entre a saída de 'git format-patch' e 'git diff', existe alguma? E não poderei usar 'git diff' para produzir um patch e aplicá-lo usando git apply?

Meu problema é que adicionei alterações ao índice, mas aparentemente git format-patch só aceita commits, portanto, se eu puder usar a saída de diff, posso usar este comando para produzir um patch para as alterações no índice:

git diff --cached > index.patch
Rafid
fonte

Respostas:

129

Um patch criado com git format-patchtambém incluirá algumas meta-informações sobre o commit (committer, data, mensagem de commit, ...) e conterá diff de dados binários. Tudo será formatado como um e-mail, para que possa ser enviado facilmente. A pessoa que recebe pode então recriar o commit correspondente git ame todos os meta-dados estarão intactos. Também pode ser aplicado com git applyum superconjunto de um diff simples.

Um patch criado com git diffserá um diff simples com contexto (pense diff -u). Também pode ser aplicado com, git applymas os metadados não serão recriados (porque não estão presentes).

Em resumo, git format-patché útil para transmitir um commit, enquanto git diffé útil para obter uma diferença entre duas árvores.

Sylvain Defresne
fonte
12

Dos manuais, git-format-patch prepara patches adequados para envio de e-mail, enquanto git-diff mostra as alterações.

Eles são duas coisas diferentes e têm propósitos diferentes, eles apenas geram um formato de patch. Mas git-format-patchadiciona dados sobre um commit (data, autor, mensagem de commit) e os agrupa em um formato que é adequado para enviar como uma mensagem de correio Unix (embora sejam apenas arquivos, então eles podem ser enviados para outros métodos e ainda aplicados por git-am).

Também git-format-patchgera um arquivo de patch para cada confirmação no intervalo que você especificar. Essas mudanças serão adicionadas como commits em seu repositório com git-am.

git-diffapenas mostra a diferença entre os dois estados solicitados e pode ser usado para criar um arquivo de patch. Mas este é apenas um arquivo de patch normal e a aplicação do patch apenas mudará o estado do diretório de trabalho.

E sim, você pode criar um patch para o seu índice dessa forma.

Abizern
fonte
Obrigado. O que há de especial no e-mail do UNIX para que eles tenham projetado o patch com base nele?
Rafid
7
Não há nada realmente especial. O git foi projetado por Linus Torvalds cujo fluxo de trabalho envolvia o envio e recebimento de patches por e-mail para validação antes da integração com o kernel Linux.
Sylvain Defresne
Git foi projetado por Linus Torvalds para manter o kernel do Linux dentro. Unix mail era um formato comum.
Abizern
1

O arquivo de patch pode ser gerado com o git diffcomando, mas comparando com o patch gerado pelo git format-patchcomando, as principais diferenças são:

  1. Sem metadados sobre um commit (como data, autor, mensagem de commit, etc.);
  2. Sem estatísticas sobre o diff (diffstat, como x arquivos alterados, y inserções (+), z exclusões (-));
  3. Sem diferenças binárias, apenas diferenças textuais.

insira a descrição da imagem aqui

Para gerar o arquivo de patch para todos os arquivos alterados (no índice ou no diretório de trabalho):

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

Para aplicar o arquivo de patch gerado:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
K. Symbol
fonte