Digamos que tenho alterações não confirmadas no meu diretório de trabalho. Como posso fazer um patch daqueles sem ter que criar um commit?
Digamos que tenho alterações não confirmadas no meu diretório de trabalho. Como posso fazer um patch daqueles sem ter que criar um commit?
Respostas:
git diff
para alterações sem etapas. git diff --cached
para mudanças em etapas.
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:
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 diff
saída. Portanto, uma maneira de fazer um patch é preparar tudo para um novo commit ( git add
cada 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 --staged
como sinônimo de --cached
.
git diff --no-color
. Caso contrário, parece um problema de codificação.
git diff
e git 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:
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):
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çãoPara criar um patch com os arquivos novos e modificados (em etapas), você pode executar:
git diff HEAD > file_name.patch
git diff --cached > mypatch.patch
não está funcionando.
file_name.patch
ser usado pelo patch
comando? Eles são compatíveis um com o outro?
Eu gosto:
git format-patch HEAD~<N>
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:
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"'
Em qualquer diretório do repositório do projeto, execute:
git make-patch
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:
git status .
Também podemos especificar os arquivos, para incluir apenas os arquivos com alterações relativas, principalmente quando eles abrangem vários diretórios ex
git diff ~/path1/file1.ext ~/path2/file2.ext...fileN.ext > ~/whatever_path/whatever_name.patch
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!