Estou fazendo algo muito simples errado. Estou tentando preparar um arquivo de patch comum, para poder aplicar novamente algumas alterações:
$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$
Com o something_here
espaço em branco , quase funciona, mas os nomes dos arquivos não estão corretos. Acho que estou perdendo alguma opção.
Na vida real, vou fazer uma mesclagem após o checkout, para que o patch possa falhar por lá, mas você vê no que estou entrando.
Edite
Minha falha aqui por fazer a pergunta errada. A questão real é: eu quero salvar minhas alterações, fazer uma mesclagem e reaplicar as alterações, se possível? Perguntei da maneira errada, porque estou acostumado a usar o patch para resolver esse tipo de problema e git diff
parecia que era isso que eu queria que eu fizesse.
Comentário de Charles Bailey teve a resposta certa. Para mim, o git-apply é a coisa certa a fazer (o git-stash parece mais pesado do que eu preciso, o rebasing e os pacotes estão definitivamente além do meu nível de habilidade atual.) Vou aceitar a resposta que Charles deu (porque você não pode aceitar um comentário). Obrigado por todas as sugestões.
Editar, 6 anos depois
Como qualquer pessoa familiarizada com o assunto sabe, eu superestimei a dificuldade de git stash
. Quase todos os dias, usarei a seguinte sequência:
$ git stash
$ git merge
$ git stash pop
patch
vez degit apply
?git stash
ou outras ferramentas git?git stash
é a solução mais fácil para o que você está tentando fazer, mas existem muitas abordagens que funcionam.git-svn
.Respostas:
Se você quiser usar o patch, precisará remover os
a/
b/
prefixos que o git usa por padrão. Você pode fazer isso com a--no-prefix
opção (você também pode fazer isso com a-p
opção do patch ):Geralmente, porém, é mais fácil usar o straight
git diff
e depois usar a saída para alimentargit apply
.Na maioria das vezes, tento evitar o uso de patches de texto. Geralmente, uma ou mais confirmações temporárias combinadas com rebase
git stash
e pacotes são mais fáceis de gerenciar.Para o seu caso de uso, acho que
stash
é o mais apropriado.fonte
git diff --no-prefix master > diff.patch
e depoisgit checkout master
patch -p0 < diff.patch
patch --dry-run < diff.patch
antes de emitir o último comando.patch
fora do git (talvez usando um arquivo de correção gerado pordiff
) em um caso de uso mais geral.Basta usar
-p1
: você precisará usar-p0
o--no-prefix
caso de qualquer maneira, para que você possa deixar de fora o--no-prefix
e usar-p1
:fonte
git diff
gera uma linha quepatch
ignora.git apply
é o caminho a percorrer.As diferenças do git têm um segmento de caminho extra anexado aos caminhos do arquivo. Você pode remover esta entrada no caminho especificando -p1 com patch, assim:
fonte
save.patch
arquivo para qualquer lugar (incluindo arquivos binários).git apply <file>
fonte
git diff > save.patch
e emgit checkout .
vez de um reset, mas sim ...git apply
ou tornando o diff relevante para o seu estado e o ponteiro para o último commit disponível. Fazer simplesmentegit diff
não fez nadagit apply
. A coisa comgit diff
é (eu acho) de usargit reset
- as relações entre os repo, o índice, ea área de trabalho são o problema.Um truque útil para evitar a criação de arquivos de patch temporários:
fonte
git stash show -p stash@{3} | patch -p1 -d [dst-dir]