Quando há uma colisão durante git merge
, abro uma ferramenta de fusão chamada Meld . Abre três arquivos LOCAL, BASE e REMOTE. Como eu li LOCAL é minha filial local, BASE é ancestral comum e REMOTE é a filial a ser mesclada.
Agora, à minha pergunta: qual versão do arquivo será finalmente usada? É REMOTO? Em caso afirmativo, posso editá-lo como quiser, independentemente do que está no ramo BASE, por exemplo?
merge.conflictstyle
opção de configuração definida emdiff3
vez do padrãomerge
.HEAD
,<<<<<
e=====
sinais, isso significa que não há nenhum conflito de todo. Neste caso, a janela do meio não vai estar vazio, ele irá mostrar o resultado da junção, mas não haverá nenhuma parte "vermelho"<<<<<<
,======
nem>>>>>>
marcadores no painel do meio (ou seja, a versão base) quer; e, às vezes, o painel do meio ficará vazio, como um GR relatado. Talvez essa diferença seja devido a configurações diferentes. Quando eu iniciar a ferramenta de Meld, os seguintes arquivos terão existir, assumindo que o nome do arquivo no repositório éX.java
:X.java
,X.java.orig
,X.java.BACKUP.#
,X.java.BASE.#
,X.java.LOCAL.#
,X.java.REMOTE.#
, onde#
é algum número. Chamar o resultado da mesclagem da versão BASE é confuso; MERGED seria melhor.O Meld possui um recurso de mesclagem oculta de 3 vias, ativado ao passar no 4º parâmetro:
Os painéis direito e esquerdo são abertos no modo somente leitura, para que você não possa acidentalmente mesclar o caminho errado. O painel do meio mostra o resultado da mesclagem. Para os conflitos, mostra a versão base para que você possa ver todos os bits importantes: texto original no meio e modificações conflitantes nos dois lados. Finalmente, quando você pressiona o botão "Salvar", o arquivo $ MERGED é gravado - exatamente como esperado pelo git.
O arquivo ~ / .gitconfig que eu uso contém as seguintes configurações:
isso abre a combinação com 3 guias, a 1ª e a 2ª guia contendo as diferenças simples que estou tentando mesclar, e a 3ª guia, aberta por padrão, mostra a exibição de mesclagem em 3 direções.
Agora, o motivo pelo qual o recurso está oculto é que ele ainda não está polido o suficiente. É muito útil como é agora, mas Kai Willadsen, o autor da fusão, apontou algumas rugas que precisam ser resolvidas. Por exemplo, não há GUI para iniciar o modo de mesclagem em três direções; a sintaxe da linha de comando é um pouco misteriosa e tal. Se você fala python e tem algum tempo em suas mãos - você sabe o que fazer.
Edit: Nas versões mais recentes do Meld, a synax mudou um pouco. Isso estava nos comentários, mas pertence à resposta.
O comando meld agora usa a opção --output, portanto, a última linha do snippet acima deve ser:
fonte
--output
para o resultado $ MERGED. Descobri isso enquanto olha para o script lançamento fusão que veio com minha versão do git: github.com/git/git/blob/master/mergetools/meld--output option
. Veja esta linha no script de lançamento:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
cmd = meld $LOCAL $BASE $REMOTE --auto-merge --output $MERGED
. Portanto, isso abre três guias (boa maneira antiga), mescla automaticamente mesclagens não conflitantes no meio, onde o meio é $ MERGED e será usado como saída de resolução de conflitos.--output=<file>
ou-o <file>
, consultemeld --help
Existem 4 arquivos envolvidos:
$LOCAL
O arquivo na ramificação em que você está mesclando; intocado pelo processo de mesclagem quando mostrado a você$REMOTE
O arquivo na ramificação de onde você está mesclando; intocado pelo processo de mesclagem quando mostrado a você$BASE
O ancestral comum de $ LOCAL e $ REMOTE, ie. o ponto em que os dois ramos começaram a desviar o arquivo considerado; intocado pelo processo de mesclagem quando mostrado a você$MERGED
O arquivo parcialmente mesclado, com conflitos; esse é o único arquivo tocado pelo processo de mesclagem e, na verdade, nunca é mostrado para você emmeld
O
$MERGED
arquivo é aquele que contém os<<<<<<
,>>>>>>
,=====
(e, talvez,||||||
marcadores) (que os conflitos delimitar). Este é o arquivo que você edita manualmente para corrigir conflitos.A edição manual de conflitos e a edição visual de conflitos são feitas em arquivos diferentes e apresentam informações diferentes.
Ao usar o mergetool (assumir
meld
), os arquivos que estão vendo nele são:$LOCAL
,$BASE
,$REMOTE
. Observe que você não vê o$MERGED
arquivo, embora isso seja passado como um parâmetro ocultomeld
para gravar lá o resultado da edição.Em outras palavras, em
meld
, você está editando o arquivo no meio$BASE
, e escolhe todas as alterações manualmente, da esquerda ou da direita . É um arquivo limpo, não tocado pelo processo de mesclagem. A única falha é que, quando você salva, você não salva no$BASE
arquivo, mas no quarto parâmetro oculto demeld
, esse é o$MERGED
arquivo (que você nem vê). O$BASE
arquivo não contém nenhum conflito ou mesclagem parcial bem-sucedida porque não é o$MERGED
arquivo .Na edição visual, ao apresentar o
$BASE
arquivo (em vez do$MERGED
arquivo),git
basicamente descarta todas as suas tentativas de fazer a fusão (essas tentativas são visíveis, se você desejar, no arquivo $ MERGED) e permite fazer a fusão completamente do zero .A conclusão é que, nos conflitos de mesclagem manual e visual, você não está visualizando os mesmos arquivos, mas o resultado final é gravado no mesmo arquivo (que é o
$MERGED
arquivo).A correção manual dos conflitos é feito em
$MERGED
, porquegit
não tem média de apresentar-lhe três arquivos, por isso esmaga as informações dos três arquivos ($LOCAL
,$BASE
,$REMOTE
) em que$MERGED
arquivo.Mas as ferramentas visuais têm os meios para mostrar-lhe três arquivos: eles mostram os
$LOCAL
,$BASE
,$REMOTE
arquivos. Você está escolhendo alterações dos$LOCAL
e$REMOTE
arquivos e você está trazendo os para o$BASE
arquivo, completamente re-construção e até mesmo substituir a fracassada tentativa de fusão que é o$MERGED
arquivo.fonte
$LOCAL
,$REMOTE
,$BASE
ea saída inicialmente igual a$BASE
, mas que é diferente$MERGED
na medida em que não tem a tentativa de git para mesclar os arquivos e os marcadores de conflito e assim por diante. De fato, essa seria a maneira de usar essas ferramentas mais semelhantes à abordagem em três painéis de LOCAL / REMOTE / BASE + OUTPUT, que não mostra mescladas. O quarto painel apenas permite separar a base da saída.A solução da Cosmin funciona, mas o arquivo $ BASE é atualizado - não $ MERGED . Isso atualizará o arquivo $ MERGED :
Meld:
v1.8.4
fonte
cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
--diff $BASE $LOCAL --diff $BASE $REMOTE
no final? para mim no 1.8.4, isso funciona bem (tanto quanto eu posso ver):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
Com o Meld 1.7, a solução da Tomek Bury não funciona mais.
As configurações padrão não me satisfaziam:
Em vez disso, para Meld> = 1,7 , sugiro uma de duas outras soluções.
Primeira solução :
Segunda solução :
.gitconfig
Copie e cole isso no seu
.gitconfig
arquivo para obter as soluções descritas acima:Copie e cole isso em um
.gitconfig.local
arquivo para definir meld17 ou meld16 apenas para esta máquina, caso você use o .gitconfig em várias máquinas:fonte
cmd = meld $LOCAL $BASE $REMOTE --auto-merge
, o painel do meio será o $ BASE, e não o $ MERGE, que é realmente usado como saída da resolução de conflitos.Eu descobri que nenhum dos arquivos padrão mostrados estava sendo salvo. meld estava aparecendo e
$LOCAL
, por padrão. Para fazer funcionar, eu precisava fazer um show de fusão em vez de . Colocando isso no meu fixo para mim:$REMOTE
$BASE
$MERGED
$BASE
~/.gitconfig
Estou usando o Arch, com:
fonte
Por algum motivo, as versões mais recentes do meld não exibem linhas de marcador adicionadas para conflitos (<<<<<<<, =======, >>>>>>>). Se você quiser ver essas linhas, instale o meld v 1.3.3 ou anterior.
fonte
Por favor, veja a resposta de Saad para a resposta correta.
Com o meld 1.8.1 no Ubuntu, eu estava recebendo o
e adicionando --output antes de $ MERGED corrigi-lo para mim:
fonte