Qual é a diferença entre git am e git apply?

134

Ambos git ame git applypodem ser usados ​​para aplicar patches. Não vejo a diferença. Agora vejo uma diferença: git amconfirma automaticamente, enquanto git applyapenas toca nos arquivos, mas não cria uma confirmação. Essa é a única diferença?

Christoph
fonte
11
ampoderia ser pensado como uma abreviação de Apply Mail...
Philip Oakley

Respostas:

144

Tanto a entrada quanto a saída são diferentes:

  • git applypega um patch (por exemplo, a saída de git diff) e aplica-o ao diretório de trabalho (ou índice, se --indexou --cachedé usado).
  • git ampega uma caixa de correio de confirmações formatadas como mensagens de email (por exemplo, a saída de git format-patch) e as aplica à filial atual.

git amusa git applynos bastidores , mas faz mais trabalho antes (lendo um Maildirou mboxe analisando mensagens de email) e depois (criando confirmações).

georgebrock
fonte
6
Nota: git applyparece também aceitar git format-patchsaída.
Ciro Santilli publicou
7
git applyfuncionaria para a saída git format-patchtambém, mas as alterações seriam sem etapas e precisariam ser confirmadas (criando assim um ponto de confirmação diferente no índice ao qual são aplicadas). Com git amvocê, você estaria carregando as informações de confirmação (junto com o autor etc.) no índice ao qual é aplicada. git applyé para corrigir seu repo (ruim), git ampode fazer alterações legítimas nos recursos e incluí-lo no seu repo (abordagem preferida).
Prasoon Joshi
18

git applyé para aplicar diffs diretos (por exemplo, from git diff), ao passo que git amé para aplicar patches e sequências de patches de e-mails, no formato mbox ou Maildir e é o "oposto" de git format-patch. git amtenta extrair mensagens de confirmação e detalhes do autor de mensagens de email, e é por isso que ele pode fazer confirmações.

CB Bailey
fonte
9

Com git ama aplicação do patch, se você o usar git status, não verá nenhuma alteração local.

git applypermite que você faça as alterações nos arquivos de origem como se você estivesse escrevendo o código por si mesmo, consequentemente git statuse git diffsaída vontade as alterações feitas no patch de ter aplicado, em seguida, você pode corrigir / adicionar mais mudanças e submetê-los juntos como um novo patch .

0x90
fonte