Criar um patch git a partir das alterações por persistir na pasta de trabalho actual

Digamos que não autorizei alterações no meu directório de trabalho. Como posso fazer um patch desses sem ter que criar um commit?

 966
Author: Antony, 2011-03-01

7 answers

git diff para alterações não marcadas.

git diff --cached para mudanças encenadas.

git diff HEAD para as alterações encenadas e não organizadas.

 447
Author: sigjuice, 2020-09-05 19:30:07

Se ainda não comunicaste as mudanças, então:

git diff > mypatch.patch

Mas às vezes acontece que parte do que você está fazendo são Arquivos novos que não são rastreados e não estarão em sua saída {[[4]}. Então, uma maneira de fazer um patch é encenar tudo para um novo commit (git add cada arquivo, ou apenas git add .) mas não faça o commit, e então:

git diff --cached > mypatch.patch

Adicione a opção 'binário' se quiser adicionar ficheiros binários ao 'patch' (por exemplo, ficheiros mp3):

git diff --cached --binary > mypatch.patch

Mais tarde poderá aplicar o sistema transdérmico:

git apply mypatch.patch
 2026
Author: jcarballo, 2020-11-06 05:52:03

git diff e git apply vai funcionar para arquivos de texto, mas não vai funcionar para arquivos binários.

Pode facilmente criar um patch binário completo, mas terá de criar um commit temporário. Uma vez feito o(s) Seu (s) commit (s) temporário (s), 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)>
Isto vai fazer recuar o(s) Seu (s) commit (s) temporário (s). O resultado final deixa a sua cópia de trabalho (intencionalmente) suja com as mesmas alterações que você originalmente tinha.

No lado de recepção, você pode usar o mesmo truque para aplicar as alterações à cópia de trabalho, sem ter o histórico de commit. Basta aplicar o(S) Sistema (s), e git reset --mixed <SHA of commit *before* the patches>.

Note que pode ter de estar bem sincronizado para esta opção funcionar. Eu vi alguns erros ao aplicar patches quando a pessoa que os fez não tinha puxado para baixo tantas mudanças como eu tinha. Deve haver formas de fazer com que funcione, mas não investiguei muito. ele.

Aqui está como criar os mesmos patches no Git tartaruga (não que eu recomende usar essa ferramenta):

  1. Commit your working changes
  2. carregue com o botão direito no directório raiz do ramo e carregue em Tortoise Git -> Create Patch Serial
    1. escolha o intervalo que fizer sentido (Since: FETCH_HEAD vai funcionar se você estiver bem sincronizado)
    2. Crie o(s) patch (S)
  3. carregue com o botão direito no directório raiz do ramo e carregue em Tortise Git -> Show Log
  4. carregue com o botão direito na persistência antes de a (s) Sua (s) persistência (ões) temporária( AIS), e clique em reset "<branch>" to this...
  5. seleccione a opção Mixed

E como aplicá-las:

  1. carregue com o botão direito no directório raiz do ramo e carregue em Tortoise Git -> Apply Patch Serial
  2. Seleccione o(S) Sistema (s) correcto (s) e aplique-o
  3. carregue com o botão direito no directório raiz do ramo e carregue em Tortise Git -> Show Log
  4. carregue com o botão direito no commit antes de os commit( s) do patch, e carregue em reset "<branch>" to this...
  5. Seleccione o Mixed opção
 93
Author: Merlyn Morgan-Graham, 2012-03-25 22:18:36

Para criar um 'patch' com ambos os ficheiros & novos modificados ('staged'), poderá executar:

git diff HEAD > file_name.patch
 38
Author: Ionel Sirbu, 2015-10-13 09:17:20

Eu gosto:

git format-patch HEAD~<N>

Onde <N> é o número do último commits para gravar como patches.

Os detalhes de como usar o comando estão no DOC

UPD
Aqui você pode encontrar como aplicá-los então.

UPD para aqueles que não tiveram a ideia de format-patch
Adicionar outro nome:

git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'

Depois, em qualquer directório do seu repositório de projectos, execute:

git make-patch

Este comando irá criar 0001-uncommited.patch na sua pasta actual. Remendo irá conter todas as alterações e ficheiros não rastreados que são visíveis para o próximo comando:

git status .
 27
Author: Eugen Konkov, 2019-03-07 08:11:28

Se quiser fazer binário, dê uma opção --binary quando executar git diff.

 10
Author: gitster, 2014-05-21 13:32:42

Também podemos especificar os ficheiros, para incluir apenas os ficheiros com alterações relativas, particularmente quando abrangem várias pastas e. X.

git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch

Achei que isto não estava especificado nas respostas ou comentários, que são todos relevantes e corretos, por isso escolhi adicioná-lo. Explícito é melhor do que implícito!

 4
Author: Anshu Kumar, 2020-01-27 12:57:50