Criar um patch git a partir das alterações por persistir na pasta de trabalho actual
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.
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
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>
.
Aqui está como criar os mesmos patches no Git tartaruga (não que eu recomende usar essa ferramenta):
- Commit your working changes
- carregue com o botão direito no directório raiz do ramo e carregue em
Tortoise Git
->Create Patch Serial
- escolha o intervalo que fizer sentido (
Since
:FETCH_HEAD
vai funcionar se você estiver bem sincronizado) - Crie o(s) patch (S)
- escolha o intervalo que fizer sentido (
- carregue com o botão direito no directório raiz do ramo e carregue em
Tortise Git
->Show Log
- 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...
- seleccione a opção
Mixed
E como aplicá-las:
- carregue com o botão direito no directório raiz do ramo e carregue em
Tortoise Git
->Apply Patch Serial
- Seleccione o(S) Sistema (s) correcto (s) e aplique-o
- carregue com o botão direito no directório raiz do ramo e carregue em
Tortise Git
->Show Log
- carregue com o botão direito no commit antes de os commit( s) do patch, e carregue em
reset "<branch>" to this...
- Seleccione o
Mixed
opção
Para criar um 'patch' com ambos os ficheiros & novos modificados ('staged'), poderá executar:
git diff HEAD > file_name.patch
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 .
Se quiser fazer binário, dê uma opção --binary
quando executar git diff
.
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!