Como usar o Visual Studio Code como o editor padrão do Git MergeTool

121

Hoje eu estava tentando usar o git mergetoolno prompt de comando do Windows e percebi que o padrão era usar o Vim , o que é legal, mas prefiro o VS Code .

Como posso fazer com que o código do Visual Studio funcione como minha GUI para lidar com conflitos de mesclagem (ou mesmo como uma ferramenta de comparação) para Git?

Eric D. Johnson
fonte

Respostas:

240

A partir do Visual Studio Code 1.13, a Better Merge foi integrada ao núcleo do Visual Studio Code.

A maneira de conectá-los é modificar o seu .gitconfige você tem duas opções .

  1. Para fazer isso com entradas de linha de comando, digite cada um destes: (Observação: substitua "por 'no Windows Git Bash, macOS e Linux conforme esclarecido por Iztok Delfin e e4rache)

    1. git config --global merge.tool vscode
    2. git config --global mergetool.vscode.cmd "code --wait $MERGED"
    3. git config --global diff.tool vscode
    4. git config --global difftool.vscode.cmd "code --wait --diff $LOCAL $REMOTE"
  2. Para fazer isso, colando alguma linha .gitconfig com o Visual Studio Code .

    • Execute a git config --global core.editor "code --wait"partir da linha de comando.
    • A partir daqui, você pode inserir o comando git config --global -e. Você vai querer colar o código no "Bloco Extra" abaixo.

      [user]
          name = EricDJohnson
          email = [email protected]
      [gui]
          recentrepo = E:/src/gitlab/App-Custom/Some-App
      # Comment: You just added this via 'git config --global core.editor "code --wait"'
      [core]
          editor = code --wait
      # Comment: Start of "Extra Block"
      # Comment: This is to unlock Visual Studio Code as your Git diff and Git merge tool
      [merge]
          tool = vscode
      [mergetool "vscode"]
          cmd = code --wait $MERGED
      [diff]
          tool = vscode
      [difftool "vscode"]
          cmd = code --wait --diff $LOCAL $REMOTE
      # Comment: End of "Extra Block"
      

Agora, de dentro do seu diretório Git com um conflito executado git mergetoole, tada, você tem o Visual Studio Code ajudando a lidar com o conflito de mesclagem! (Certifique-se de salvar seu arquivo antes de fechar o Visual Studio Code.)

Aceitar mudança de entrada de alguém?

Para obter mais informações sobre como iniciar a codepartir da linha de comando, consulte esta documentação .

Para mais informações git mergetoolverifique esta documentação .

Eric D. Johnson
fonte
3
Existe uma linha acima <<<< Cabeçalho, que é inserido que lista as opções: "Aceitar Mudança Atual | Aceitar Mudança Recebida | Aceitar Ambas as Mudanças | Comparar Mudanças" e acredito que insere isso em cada seção de mudanças detectadas no arquivo . Mas dentro de uma seção, se você quiser mesclar um pouco disso e um pouco daquilo manualmente, acredito que você faria essa alteração em seu local e, em seguida, escolheria a opção "Aceitar alteração atual". Portanto, o fluxo de trabalho faz com que você dê um passo para trás para dar um passo à frente. Se outros resolverem isso de uma maneira diferente, poste aqui para nos informar
Eric D. Johnson
3
Recebo o erro unknown tool: vscode... Tenho quase certeza de chamar o VsCode da linha de comando que você deve usar em codevez devscode
Kolob Canyon
19
Além disso, isso não está funcionando para mim. Ele simplesmente abre o VsCode e nenhum arquivo é criado
Kolob Canyon,
1
O que eu gostaria de fazer é "giff difftool mybranch master" e ter o código do VS aberto com o diff de todos os arquivos que foram alterados. No momento, ele abriria apenas um e esperaria que você o fechasse.
Pluc
1
Oh sim, eu sei disso, mas não tem a flexibilidade que estou procurando, como obter uma diferença entre dois commits ou dois branches. E se isso acontecer, navegar no git no código vs é horrível na minha opinião. Eu apenas gosto de sua interface de usuário diff e merge. Eu estava indo e vi o git difftool -dpor um diretório diff. Vou verificar como isso funciona amanhã.
Pluc
23

Tive que substituir as aspas duplas por aspas simples:

  git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'

para que funcione corretamente (com aspas duplas, $ LOCAL e $ REMOTE são substituídos por seus valores).

Isso é necessário se você estiver usando o Git Bash para Windows em vez do Prompt de Comando do Windows.

e4rache
fonte
1
Não para mim. Acabei de fazer isso no Windows usando o prompt de comando. Talvez você esteja usando algo diferente? Em caso afirmativo, sugiro adicionar qual ambiente você está usando para que outras pessoas com o mesmo ambiente saibam que precisarão fazer essa alteração.
Todesengel de
1
@ e4rache e @ Iztok-Delfin o que você listou aqui é um conteúdo útil, mas você acidentalmente fez uma resposta, quando na verdade é um comentário. Tenho certeza de que você teve problemas porque não tinha 50 pontos no SO para permitir comentários, o que é uma espécie de problema de fluxo de trabalho do site que talvez deva ser examinado. De qualquer forma, obrigado por contribuir, e acrescentei sua dica na minha resposta acima. Obrigado por ajudar aqueles que vêm depois e estão usando o Git Bash:^)
Eric D. Johnson
@ eric-d-johnson Eu pretendia totalmente fazer um comentário em vez de uma resposta. (desculpe, sou novo neste site) e btw eu estava usando o bash no linux. Existe uma maneira de transformar essa resposta em um comentário?
e4rache
@ e4rache Não sei como fazer um comentário, mas talvez um moderador veja isso e nos dê algumas dicas (dica, dica). Se você tivesse os 50 pontos, você poderia fazer um comentário sobre a resposta aceita e excluir esta, então quando você se tornar uma estrela do rock com toneladas de pontos, você pode voltar aqui e fazer todas as tarefas domésticas que te fazem feliz e traz de volta boas lembranças de como tudo começou.
Eric D. Johnson,
1
@mohamedghonemi Bom feedback. Atualizei a explicação na parte superior para macOS e Linux agora para lembrar de usar aspas simples '.
Eric D. Johnson
2

Caso alguém queira resolvê-lo no Visual Studio, outra opção seria fazê-lo através do Visual Studio: Team Explorer -> clique no ícone Home => botão Configurações => expanda seção Git => clique em Configurações Globais

insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui

Daniel B
fonte
O Visual Studio não é equivalente ao Visual Studio Code. A maneira como essas configurações são feitas é bem diferente. Consulte stackoverflow.com/a/33798601 para as diferenças
jwd630
1
@ jwd630 Sei que o código do VS é diferente do VS. Tive esse problema no VS, mas não consegui encontrar uma solução para isso, então achei que seria melhor postá-lo caso alguém esteja tendo esse problema. Não há necessidade de votar contra.
Daniel B
2

Além da excelente resposta existente , você deve abrir o VS Code em uma nova janela adicionando -nà linha de comando.

Então você se git config --global --editparece com isso.

[merge]
        tool = vscode
[mergetool "vscode"]
        cmd = code -n --wait $MERGED
[diff]
        tool = vscode
[difftool "vscode"]
        cmd = code -n --wait --diff $LOCAL $REMOTE                                                    
mvd
fonte
1

Usando o manual, você pode encontrar um argumento interessante:

git difftool --help 
-x <command>, --extcmd=<command>
       Specify a custom command for viewing diffs.  git-difftool ignores the configured defaults and runs $command $LOCAL $REMOTE when this option is specified.
       Additionally, $BASE is set in the environment.

Com essas informações, você pode usar facilmente o seguinte comando sem tocar na configuração do git:

git difftool -x "code --wait --diff" 

Questão semelhante aqui

Gomino
fonte