Ao aplicar um patch, há alguma maneira de resolver conflitos?

124

Eu estou no windows

Por várias razões, temos várias instâncias git de diferentes ramos svn.

Muitas vezes desejo corrigir um problema no repositório A, gerar um patch e aplicá-lo ao repositório B. Isso funciona bem, exceto se houver conflitos.

Ao fazer o rebaseamento, basta clicar com o botão direito na pasta e usar tortioseGit e selecionar a opção resolver. Isso traz um bom gui para me deixar trabalhar meus conflitos.

Existe alguma maneira de fazer isso com pedaços de patch rejeitados?

Aqui está minha abordagem atual para criar / aplicar os patches

git format-patch master --stdout > c:\\patch\\file.patch
git apply --reject --ignore-space-change --ignore-whitespace c:\\patch\\file.patch
Kenoyer130
fonte
3
Geralmente faço isso manualmente quando todas as opções de patch falham ...
stdcall
Se a fusão falhar, é porque o programa não consegue descobrir como fazer a fusão de forma inequívoca. Você deve obter um arquivo com conjuntos <<<<, ===, >>>> e deve entrar e resolvê-los manualmente.
tacaswell
Sim, fazer isso à mão é um verdadeiro pita quando você está falando alguns pedaços de 100 rej.
Kenoyer130
É quando você deseja usar git mergetoole fazer uma fusão de 3 vias com o gui de sua escolha (tenho parcialidade para o kdiff no Windows) ...
g19fanatic

Respostas:

254

Para gerar seu patch, faça o seguinte:

git format-patch --stdout first_commit^..last_commit > changes.patch

Agora, quando você estiver pronto para aplicar os patches:

git am -3 < changes.patch

O -3fará uma mesclagem de três vias se houver conflitos. Neste ponto, você pode fazer um git mergetool, se você quiser ir a um gui ou apenas manualmente mesclar os arquivos usando vim (o padrão <<<<<<, ||||||, >>>>>>resolução de conflitos).

g19fanatic
fonte
3
Pode ser útil para adicionar --ignore-whitespace --ignore-space-changeaos git amdemais. Eu tinha mesclagens triviais que não funcionavam sem ele.
angularsen
12
git apply -3 changes.patchparece funcionar para mim também
peterflynn
1
Mesmo que o patch não se aplique corretamente, ainda recebo "Nenhum arquivo precisa ser mesclado" de git mergetool. Em vez disso, tive que encontrar o commit de base que o patch original usou, aplicar em cima disso (felizmente meu repo tinha isso) e então rebase.
jozxyqk
4
Estou tendo o mesmo problema que @jozxyqk. Nem git am -3nem git apply -3vai realmente cair marcadores de conflito em meus arquivos, mesmo que eu recebo mensagens como Applied patch to 'configure.ac' with conflicts.e error: patch failed: .... Isso está ligado git 2.17.1. Talvez quando alguns arquivos não puderem ser corrigidos, git reverta?
nh2
1
Eu tenho o mesmo problema que @ nh2, você já encontrou o problema?
Eridanis
12

Se você está frequentemente enfrentando o mesmo conjunto de conflitos ao aplicar patches, rebasing ou mesclagem, então você pode usar a função git rerere (reutilizar resolução gravada). Isso permite que você pré-defina como os conflitos devem ser resolvidos com base em como você os resolveu no passado. Consulte http://git-scm.com/blog/2010/03/08/rerere.html para obter detalhes sobre como isso funciona.

mplf
fonte
5

TortoiseGit tem um recurso de mesclagem que pode abrir arquivos de patch.

Tem uma foto disso aqui .

ams
fonte
Na verdade, a opção de mesclagem pode ser o que estou procurando.
Kenoyer130
Realmente? Eu não uso o tortoise há muito tempo, mas a página do link tem o texto "TortoiseMerge pode abrir o arquivo de patch do Git diretamente, você o revisa e faz o patch para a cópia de trabalho.", Então parece que deveria!
ams
ele abre arquivos de patch ... entretanto, às vezes o formato do arquivo de patch quebra o tortoisegitmerge. Nunca tive sucesso com diff -u, mas sim com saída diff -c.
thistleknot de
Você também pode arrastar patches com o botão direito em uma pasta da árvore de trabalho e selecionar "Aplicar patch serial" (para patches como 0001-xxx.patch, ... 0002-xxy.patch) ou "Aplicar arquivo de patch único".
MrTux
2

Minha abordagem é:

  • Crie uma "Integração" -Branch onde os arquivos são idênticos
  • Aplique o patch a este Ramo de Integração
  • Mesclar ou rebase para master (não sei se rebase é útil aqui, porque eu não sei o que acontecerá ao aplicar novos patches)
MichiBack
fonte