Comment utiliser Visual Studio Code comme éditeur par défaut pour Git MergeTool

122

Aujourd'hui, j'essayais d'utiliser l' git mergetoolinvite de commande Windows et j'ai réalisé qu'il était par défaut d'utiliser Vim , ce qui est cool, mais je préférerais VS Code .

Comment puis-je faire en sorte que Visual Studio Code fonctionne comme mon interface graphique pour gérer les conflits de fusion (ou même comme un outil différent) pour Git?

Eric D. Johnson
la source

Réponses:

240

À partir de Visual Studio Code 1.13, Better Merge a été intégré au cœur de Visual Studio Code.

La façon de les relier est de modifier votre .gitconfiget vous avez deux options .

  1. Pour ce faire avec les entrées de ligne de commande, entrez chacun de ces éléments: (Remarque: remplacez "par 'sous Windows Git Bash, macOS et Linux comme précisé par Iztok Delfin et 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. Pour ce faire, collez une ligne dans le .gitconfig avec Visual Studio Code .

    • Exécutez à git config --global core.editor "code --wait"partir de la ligne de commande.
    • De là, vous pouvez entrer la commande git config --global -e. Vous voudrez coller le code dans le "Bloc supplémentaire" ci-dessous.

      [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"
      

Maintenant, à partir de votre répertoire Git avec une exécution de conflit git mergetoolet, tada, vous avez Visual Studio Code qui vous aide à gérer le conflit de fusion! (Assurez-vous simplement d' enregistrer votre fichier avant de fermer Visual Studio Code.)

Accepter le changement entrant, quelqu'un?

Pour plus d'informations sur le lancement à codepartir de la ligne de commande, consultez cette documentation .

Pour plus d'informations, git mergetoolconsultez cette documentation .

Eric D. Johnson
la source
3
Il y a une ligne au-dessus de <<<< Head, qui est insérée et qui répertorie les options: "Accepter la modification actuelle | Accepter les modifications entrantes | Accepter les deux modifications | Comparer les modifications" et je crois qu'elle insère cela dans chaque section des modifications détectées dans le fichier . Mais dans une section, si vous voulez personnaliser un peu de ceci et un peu de cela à la main, je crois que vous feriez ce changement dans votre local, puis optez pour l'option "Accepter la modification actuelle". Ainsi, le flux de travail vous oblige à prendre du recul pour faire un pas en avant. Si d'autres résolvent cela d'une manière différente, veuillez poster ici pour nous informer
Eric D. Johnson
3
Je reçois l'erreur unknown tool: vscode... Je suis à peu près sûr d'appeler VsCode à partir de la ligne de commande que vous devez utiliser à la codeplace devscode
Kolob Canyon
19
De plus, cela ne fonctionne pas pour moi. Il ouvre juste VsCode et aucun fichier n'est jamais soulevé
Kolob Canyon
1
Ce que je voudrais faire, c'est "giff difftool mybranch master" et ouvrir le code VS avec le diff de tous les fichiers qui ont changé. Pour le moment, il n'en ouvrirait qu'un et attendrait que vous le fermiez.
Pluc
1
Oh oui, je le sais, mais il n'a pas la flexibilité que je recherche comme obtenir un diff entre deux commits ou deux branches. Et si c'est le cas, naviguer dans git dans vs code est assez horrible à mon avis. J'aime juste leur interface utilisateur de comparaison et de fusion. J'allais voir le git difftool -dpour un répertoire diff. Je vais vérifier comment ça marche demain.
Pluc
23

J'ai dû remplacer les guillemets doubles par des guillemets simples:

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

pour que cela fonctionne correctement (avec des guillemets doubles, $ LOCAL et $ REMOTE sont remplacés par leurs valeurs).

Cela est nécessaire si vous utilisez Git Bash pour Windows au lieu de l'invite de commande Windows.

e4rache
la source
1
Pas pour moi. Je viens de le faire sur Windows en utilisant l'invite de commande. Peut-être que vous utilisez quelque chose de différent? Si tel est le cas, je suggère d'ajouter l'environnement que vous utilisez afin que les autres utilisateurs du même environnement sachent qu'ils devront effectuer ce changement.
Todesengel
1
@ e4rache et @ Iztok-Delfin ce que vous avez énuméré ici est un contenu utile, mais vous y avez accidentellement répondu, alors que c'est vraiment un commentaire. Je suis sûr que vous avez rencontré des problèmes parce que vous n'aviez pas le 50 point sur SO pour vous permettre de commenter, ce qui est une sorte de problème de flux de travail sur le site qui devrait peut-être être examiné. Quoi qu'il en soit, merci pour votre contribution, et j'ai ajouté votre astuce dans ma réponse ci-dessus. Merci d'aider ceux qui viennent plus tard et utilisent Git Bash:^)
Eric D. Johnson
@ eric-d-johnson J'avais l'intention de faire un commentaire plutôt qu'une réponse. (désolé, je suis nouveau sur ce site) et btw j'utilisais bash sur linux. Existe-t-il un moyen de transformer cette réponse en commentaire?
e4rache
@ e4rache Je ne sais pas comment en faire un commentaire, mais peut-être qu'un modérateur verra cela et nous donnera quelques conseils (indice, indice). Si vous aviez les 50 points, vous pourriez faire un commentaire sur la réponse acceptée et supprimer celle-ci, donc une fois que vous êtes devenu une rock-star TELLEMENT avec des tonnes de points, vous pouvez revenir ici et faire tout le ménage qui vous rend heureux et vous ramène. bons souvenirs de la façon dont tout a commencé.
Eric D. Johnson
1
@mohamedghonemi Bonne rétroaction. J'ai mis à jour l'explication en haut pour macOS et Linux maintenant pour ne pas oublier d'utiliser des guillemets simples '.
Eric D. Johnson le
2

Dans le cas où quelqu'un souhaite le résoudre dans Visual Studio, une autre option serait de le faire via Visual Studio: Team Explorer -> cliquez sur l'icône Accueil => bouton Paramètres => développez la section Git => cliquez sur Paramètres globaux

entrez la description de l'image ici entrez la description de l'image ici entrez la description de l'image ici

Daniel B
la source
Visual Studio n'est pas équivalent à Visual Studio Code. La façon dont ces paramètres sont effectués est assez différente. Voir stackoverflow.com/a/33798601 pour les différences
jwd630
1
@ jwd630 Je sais que le code VS est différent de VS. J'ai eu ce problème dans VS mais je n'ai pas trouvé de solution pour cela, alors j'ai pensé qu'il serait préférable de le publier au cas où quelqu'un rencontrerait ce problème. Pas besoin de voter contre.
Daniel B le
2

En plus de l' excellente réponse existante , vous devez ouvrir VS Code dans une nouvelle fenêtre en ajoutant -nà la ligne de commande.

Donc, vous git config --global --editressemblez à quelque chose comme ça.

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

En utilisant le manuel, vous pouvez trouver un argument intéressant:

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.

Avec ces informations, vous pouvez facilement utiliser la commande suivante sans toucher à la configuration git:

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

Question similaire ici

Gomino
la source