Ver diferenças de galhos com meld?


159

Eu sei que posso ver a diferença entre HEAD e estado atual com meld .. Mas como posso ver as diferenças entre os ramos, por exemplo, mastere develcom o meld?

No momento, faço as seguintes etapas:

  1. Renomear pasta da cópia de trabalho
    Por exemplo mv /projectA /projectA_master)
  2. Clonar o projeto novamente
    git clone url
  3. Mudar para develramificação
    cd projectA && git -b devel origin/devel
  4. Ver diferenças com meld
    meld /projectA_Master projectA

Não existe uma maneira mais fácil de obter o mesmo resultado na fusão? Eu só preciso revisar as alterações e não principalmente para mesclar.


Respostas:


55

Também achei esse problema irritante, por isso fiz o git meld, que permite uma maneira mais confortável de diferenciar confirmações arbitrárias contra a árvore de trabalho ou a área de preparação. Você pode encontrá-lo em https://github.com/wmanley/git-meld . É um pouco como o script de Mark, mas funciona para comparar qualquer confirmação arbitrária ou a área de preparação ou o diretório de trabalho com qualquer um dos outros. Se uma das coisas com as quais você está comparando é a árvore de trabalho, também é a leitura-gravação, para que você não perca as alterações.


1
Excelente ferramenta, Will. Obrigado! Absolutamente recomendado ... agora, se ao menos funcionasse também.
Dipstick

Tyvm para uma grande ferramenta - (lembrete para si mesmo para adicionar ao apelido!)
kfmfe04

26
Citando Will, do repositório do hit github: "NOTA: o git-meld está obsoleto, pois o git difftool aprendeu a opção --dir-diff no git 1.7.11."
Oluc 05/05

318

Curto e doce:

git config --global diff.tool meld

Isso configura o Git para ser usado meldcomo a ferramenta diff. (Você não precisa especificar os argumentos da linha de comando, o suporte a meldestá embutido no Git.)

Então, se você quiser um diff gráfico em vez de um textual, simplesmente invoque em git difftoolvez de git diff(ambos usam os mesmos argumentos). No seu caso:

git difftool master..devel

Atualização: se você não deseja o diff de um arquivo por vez, mas deseja usar a exibição "subdiretório" do meld com todas as alterações entre os dois ramos, observe a opção -dou . Por exemplo, quando estou no ramo XYZ e quero ver o que é diferente entre este e o ramo ABC, eu executo o seguinte:--dir-diffgit difftool

git difftool -d ABC

3
não é isso que estou procurando. Ele me mostra as diferenças arquivo por arquivo. Arquivei isso com um script diff.py e 'git diff master..devel' antes. Quero ver todas as diferenças e a árvore de diretórios como 'meld folderA / folderB /'.
Marten Bauer

Marten, é assim que o git funciona. Ele apenas rastreia arquivo, portanto, você só pode ver a diferença arquivo por arquivo. No git, você não pode cometer um diretório vazio sozinho. Algum motivo específico para você exibir diff entre dir?
Donny Kurnia

@DonnyKurnia: Demorei um pouco para descobrir o que o OP está tentando fazer: o Meld tem uma interface de usuário separada para visualizar todas as alterações em um diretório. Você pode filtrar os arquivos de visualização com base nos mesmos, alterados, novos. O OP deseja usar essa interface do usuário para mostrar as alterações. (Isso permite que você veja uma lista de todas as alterações e escolha as que deseja diferenciar.) Portanto, não é uma comparação entre diretórios, mas uma comparação entre confirmações, mas visualizada como um todo.
Idbrii 5/08

17
@MartenBauer Eu acho que é isso que você quer: git difftool --dir-diff master devel
Stéphane

3
Isso pode ser feito para que a ramificação atual não esteja em uma pasta tmp e, portanto, permita edições?
Zkent 03/03

100

A partir do git v1.7.11, você pode usar git difftool --dir-diffpara executar uma comparação de diretório. O que funciona muito bem com o meld sem scripts https://github.com/wmanley/git-meld .

Configurar git

git config --global diff.tool meld

Use-o

git difftool -d topic             // -d is --dir-diff
git difftool -d master..topic

Para macOS

brew cask install meld
git config --global difftool.meld.cmd 'open -W -a Meld --args \"$LOCAL\" \"$PWD/$REMOTE\"'
git config --global difftool.meld.trustExitCode true

2
Eu acho que isso é realmente o que o OP queria. Observe a opção -g para usar a ferramenta guidiff e a opção -d para usar um --dir-diff. Isso é bom para fazer revisões de código. Nit: a opção difftool.prompt não é necessária ao especificar -d, pelo menos para o Git 1.8.
22713 Michael Percy

1
Isso é INCRÍVEL. Exatamente o que eu precisava. Obrigado!
Nicholas

5
Isso pode ser feito para que a ramificação atual não esteja em uma pasta tmp e, portanto, permita edições?
zkent

2
Gostaria muito de receber uma resposta para a pergunta do @zkent ... :(
tavlima

3
@zkent @tavlima: Este comando já permite edições na sua versão atual. Mesmo que você veja um codificador tmp no meld, se salvar - Ctrl+s- a parte correta, seu arquivo será modificado.
Benjamin

13

É importante dizer que o uso git difftool -dque você ainda pode editar seus arquivos de trabalho em Meld e salvá-los . Para conseguir isso, você precisa comparar alguma ramificação com sua árvore de trabalho atual, por exemplo:

git difftool -d branchname

O Meld mostrará que os diretórios esquerdo e direito estão localizados em / tmp. No entanto, os arquivos no diretório certo são na verdade links simbólicos para seus arquivos no diretório de trabalho atual (não se aplica ao Windows). Assim, você pode editá-los diretamente no Meld e quando salvá-los, suas alterações serão salvas no seu diretório de trabalho.

Uma opção ainda mais interessante é a comparação do diretório de trabalho atual com o stash. Você pode fazer isso digitando:

git difftool -d stash

Em seguida, você pode transferir algumas alterações do stash (janela esquerda) para sua cópia de trabalho atual (janela direita), sem usar git stash pop/applye evitar a resolução de conflitos incômoda que pode ser induzida por esses comandos.

Eu acho que isso pode aumentar significativamente o fluxo de trabalho com esconderijos. Você pode transferir gradualmente as alterações do stash para a cópia de trabalho e enviá-las uma a uma, introduzindo outras alterações, se desejar.


Piotr, é exatamente isso que tenho tentado fazer, mas no meu caso (no CentOS), nenhum link simbólico está sendo criado. Existe alguma configuração necessária, ou uma versão mínima do meld que suporte isso?
wrjohns

Eu acho que o Git é responsável pela criação dos links simbólicos, não pelo Meld. Verifique o manual do Git para obter o comando difftool. Talvez você deva atualizá-lo para uma versão mais recente?
Piotr Jurkiewicz

2
copiar novos arquivos de galho em dir trabalhar não funciona :(
pykiss

5

Embora pareça das outras respostas como se não houvesse uma maneira de fazer isso diretamente no repositório git no momento, é fácil (graças à resposta a outra pergunta :)) escrever um script que extraia as árvores de dois commits para diretórios temporários e execute o meld neles, removendo os dois diretórios quando o meld sair:

http://gist.github.com/498628

Obviamente, você perderá todas as alterações feitas pelo meld, mas é muito bom ter uma rápida visão geral das diferenças, eu acho.


3

Eu acho que uma maneira fácil de fazer isso é usando git reset --soft:

Objetivo: comparar as diferenças entre branch_a e branch_b com meld

git checkout branch_a
git checkout -b do_diff
git reset --soft branch_b
meld .

0

No git V1.7.9, você pode comparar dois commits sem a linha de comando:

Você deve configurar nas opções de edição do 'git gui', global: "Use merge tool: meld".

Inicie o gitk , selecione um commit, clique com o botão direito do mouse em outro commit> " diff this -> selected ". Em 'patch', clique com o botão direito do mouse em um arquivo> " diff externo ".

O meld será iniciado e exibirá a confirmação ainda selecionada, primeiro no lado direito.


0

Para o Meld no macOS, adicione-o ~/.gitconfigao recomendado pelo mantenedor do aplicativo macOS, yousseb :

[diff]
  tool = meld
[difftool]
  prompt = false
[difftool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args \"$LOCAL\" \"$REMOTE\"
[merge]
  tool = meld
[mergetool]
  prompt = false
[mergetool "meld"]
  trustExitCode = true
  cmd = open -W -a Meld --args --auto-merge \"$LOCAL\" \"$BASE\" \"$REMOTE\" --output=\"$MERGED\"

Você pode omitir as mergeconfigurações, se desejar.

A resposta de @ GutenYe não funcionou para mim devido a escape automático e / ou algo assim zsh.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.