Qual versão do arquivo git será finalmente usada: LOCAL, BASE ou REMOTE?

174

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?

tsusanka
fonte

Respostas:

142

É a única no meio: BASE.

De fato, BASEnão é o ancestral comum, mas a mesclagem semi-acabada onde os conflitos são marcados com >>>>e <<<<.

Você pode ver os nomes dos arquivos na parte superior da janela de edição de fusão.

Veja a captura de tela aqui

base de fusão

Você pode editar o BASEarquivo como desejar, com ou sem o uso de comandos meld.
Você também pode se livrar do meld e apenas editar o arquivo com o seu editor de texto favorito.

  • O código entre <<<< HEADe =====marcadores é o do seu arquivo local antes da mesclagem.
  • O código entre ====e >>>> <branch name>é o do arquivo remoto.
Fabien Quatravaux
fonte
3
Algumas pessoas entendem melhor os blocos conflitantes em um arquivo que falhou na mesclagem automática se eles tiverem a merge.conflictstyleopção de configuração definida em diff3vez do padrão merge.
precisa saber é o seguinte
3
Na verdade, eu não vejo a CABEÇA, <<< e === canta. Caso você tenha fornecido a janela do meio estaria vazia. Mas isso é apenas uma nota para os outros, e thx para sua resposta.
tsusanka
Se você não ver 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"
Fabien Quatravaux
10
Quando estou fazendo fusões com Meld, eu não vejo nenhuma <<<<<<, ======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.
Teemu Leisti
3
BASE é de fato o ancestral comum, MERGED é o nome do arquivo com as informações de mesclagem parcial. Por favor, veja minha pergunta e resposta Configurando e usando o Meld como seu git difftool e mergetool, que explica exatamente como ele funciona. HTH.
mattst
107

O Meld possui um recurso de mesclagem oculta de 3 vias, ativado ao passar no 4º parâmetro:

meld $LOCAL $BASE $REMOTE $MERGED

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:

[merge]
tool = mymeld
conflictstyle = diff3
[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE $MERGED

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:

cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
Tomek Bury
fonte
7
@Jesse, @lumbric, parece que as versões mais recentes do meld usam a flag --outputpara 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
Johann
1
@ Lumbric Eu acredito que sim, para Meld 1.7.x + com o --output option. Veja esta linha no script de lançamento:"$merge_tool_path" --output "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
Johann
12
Na última fusão (versão> 1.8.4), temos que usar a opção --auto-merge. cmd = fusão --diff $ BASE $ LOCAL --diff $ BASE $ REMOTO --auto-merge $ LOCAL $ BASE $ REMOTO --output $ INCORPORADO
RoboAlex
7
Eu tive o mesmo problema do @pingpongboss usando o Meld 1.8.4: O Meld estava abrindo as coisas em um painel separado, em vez de abrir a terceira guia. O comando da multa finalmente funcionou é: 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.
farmir 25/09/15
2
A sintaxe para a saída pode ser --output=<file>ou -o <file>, consultemeld --help
levsa
57

Existem 4 arquivos envolvidos:

  1. $LOCALO arquivo na ramificação em que você está mesclando; intocado pelo processo de mesclagem quando mostrado a você

  2. $REMOTEO arquivo na ramificação de onde você está mesclando; intocado pelo processo de mesclagem quando mostrado a você

  3. $BASEO 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ê

  4. $MERGEDO arquivo parcialmente mesclado, com conflitos; esse é o único arquivo tocado pelo processo de mesclagem e, na verdade, nunca é mostrado para você emmeld


O $MERGEDarquivo é 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 $MERGEDarquivo, embora isso seja passado como um parâmetro oculto meldpara 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 $BASEarquivo, mas no quarto parâmetro oculto de meld, esse é o $MERGEDarquivo (que você nem vê). O $BASEarquivo não contém nenhum conflito ou mesclagem parcial bem-sucedida porque não é o $MERGEDarquivo .

Na edição visual, ao apresentar o $BASEarquivo (em vez do $MERGEDarquivo), gitbasicamente 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 $MERGEDarquivo).

A correção manual dos conflitos é feito em $MERGED, porque git 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 $MERGEDarquivo.

Mas as ferramentas visuais têm os meios para mostrar-lhe três arquivos: eles mostram os $LOCAL, $BASE, $REMOTEarquivos. Você está escolhendo alterações dos $LOCALe $REMOTEarquivos e você está trazendo os para o $BASEarquivo, completamente re-construção e até mesmo substituir a fracassada tentativa de fusão que é o $MERGEDarquivo.

user1284631
fonte
Eu só queria que existem ferramentas (por exemplo, além de comparação) que mostram todos os 4 arquivos
yoniLavi
@yoniYalovitsky: yes, ou p4merge
user1284631
Eu costumava usar ferramenta de mesclagem de ClearCase pacote
mishmashru
@yoniLavi - bem, essas ferramentas mostram quatro painéis , mas não necessariamente todos os quatro arquivos, conforme descrito nesta resposta. Em particular, você pode configurar essas ferramentas 4-painel para mostrar a você $LOCAL, $REMOTE, $BASEea saída inicialmente igual a $BASE, mas que é diferente $MERGEDna 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.
BeeOnRope 16/08/18
16

A solução da Cosmin funciona, mas o arquivo $ BASE é atualizado - não $ MERGED . Isso atualizará o arquivo $ MERGED :

Meld: v1.8.4

[merge]
  conflictstyle = diff3
  tool = mymeld
[mergetool "mymeld"]
  cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE --diff $BASE $LOCAL --diff $BASE $REMOTE
Saad Malik
fonte
A solução do Saad funciona para mim no Ubuntu. No que diz respeito à pergunta original, esta é a resposta correta atual.
cosmin 14/03
3
Na minha versão do meld - 3.11, este comando funciona muito bem:cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
MartinM 7/15
por que você precisaria --diff $BASE $LOCAL --diff $BASE $REMOTEno final? para mim no 1.8.4, isso funciona bem (tanto quanto eu posso ver):cmd = meld --auto-merge --output $MERGED $LOCAL $BASE $REMOTE
farmir
1
@armarm: Não é necessário. Ele abre mais duas guias na combinação para que você possa ver LOCAL e REMOTE em comparação com o BASE individualmente.
Sam Kauffman
1
Não importa a ordem que eu tento com esses argumentos, a guia de três vias é sempre a terceira, enquanto a primeira é sempre selecionada por padrão. Existe uma maneira de selecionar a guia de três vias por padrão?
Sam Kauffman
13

Com o Meld 1.7, a solução da Tomek Bury não funciona mais.

As configurações padrão não me satisfaziam:

Configurações padrão

Em vez disso, para Meld> = 1,7 , sugiro uma de duas outras soluções.

Primeira solução :

 meld $LOCAL $BASE $REMOTE --auto-merge

primeira solução

Segunda solução :

 meld $LOCAL $MERGED $REMOTE

segunda solução

.gitconfig

Copie e cole isso no seu .gitconfigarquivo para obter as soluções descritas acima:

[merge]
    tool = meld16
[mergetool "meld17"]
    # use this for Meld >=1.7
    # see http://stackoverflow.com/a/22911793/859591
    # second solution:
    cmd = meld $LOCAL $MERGED $REMOTE
    # first solution:
    #cmd = meld $LOCAL $BASE $REMOTE --auto-merge
[mergetool "meld16"]
    cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED

[include]
    # requires git v1.7.10+
    path = .gitconfig.local

Copie e cole isso em um .gitconfig.localarquivo para definir meld17 ou meld16 apenas para esta máquina, caso você use o .gitconfig em várias máquinas:

# This is a host specific config file!
# Note that git 1.7.10+ is needed
# http://stackoverflow.com/a/9733277/859591
[merge]
    tool = meld17
lumbric
fonte
Isso não funciona no Meld 1.8.4. Se você executar 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.
farmir 25/09/15
1
@farmir Você escolheu $ BASE como a segunda guia.
Alex78191
11

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

[merge]
        tool = mymeld
[mergetool "mymeld"]
        cmd = meld "$LOCAL" "$MERGED" "$REMOTE"

Estou usando o Arch, com:

$ git --version
git version 1.8.2
$ meld --version
meld 1.7.1
Thomas Leonard
fonte
Com licença, esta configuração é compatível com o inux?
MadMad666
2

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.

Wnasich
fonte
Eu encontrei útil a resposta de @lumbric stackoverflow.com/a/22911793/641892
wnasich
2

Por favor, veja a resposta de Saad para a resposta correta.

Com o meld 1.8.1 no Ubuntu, eu estava recebendo o

número incorreto de argumentos fornecidos para --diff

e adicionando --output antes de $ MERGED corrigi-lo para mim:

[mergetool "mymeld"]
cmd = meld --diff $BASE $LOCAL --diff $BASE $REMOTE --diff $LOCAL $BASE $REMOTE --output $MERGED
cosmin
fonte