178 votes

Comment utiliser Visual Studio Code comme éditeur par défaut pour Git MergeTool, y compris pour la fusion à trois voies

Aujourd'hui, j'essayais d'utiliser le git mergetool sur l'invite de commande Windows et j'ai réalisé qu'il utilisait par défaut 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 de différenciation) pour Git ?

Est-il possible de configurer VS Code pour obtenir des visuels pour une fusion à trois branches ?

348voto

Eric D. Johnson Points 2374

Mise à jour : À partir de Visual Studio Code 1.70, la fusion à trois voies avec des améliorations a été ajoutée. Des visuels et des explications supplémentaires sont disponibles si cela vous intéresse.

À partir de Visual Studio Code 1.13, une meilleure fusion a été intégrée dans le cœur de Visual Studio Code.

La façon de les connecter est de modifier votre fichier .gitconfig et vous avez deux options.

  1. Pour le faire avec des commandes en ligne, entrez chacune de celles-ci : (Remarque : si vous utilisez l'invite de commandes Windows, remplacez ' par ". Merci à Iztok Delfin et e4rache pour avoir aidé à clarifier ceci.)

    1. git config --global merge.tool vscode
    2. git config --global mergetool.vscode.cmd 'code --wait --merge $REMOTE $LOCAL $BASE $MERGED'
    3. git config --global diff.tool vscode
    4. git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
  2. Pour le faire en collant quelques lignes dans le fichier .gitconfig avec Visual Studio Code.

    • Exécutez git config --global core.editor 'code --wait' depuis l'invite de commandes.

    • À partir de là, vous pouvez saisir la commande git config --global -e. Vous voudrez coller le code du "Bloc supplémentaire" ci-dessous.

        [user]
            name = EricDJohnson
            email = cool-email@neat.org
        [gui]
            recentrepo = E:/src/gitlab/App-Custom/Some-App
        # Comment: Vous venez d'ajouter ceci via 'git config --global core.editor "code --wait"'
        [core]
            editor = code --wait
        # Comment: Début du "Bloc supplémentaire"
        # Comment: Ceci sert à débloquer Visual Studio Code en tant qu'outil de fusion et de différenciation Git
        [merge]
            tool = vscode
        [mergetool "vscode"]
        # Comment: Ancienne méthode avant la fusion à trois voies affichée en commentaire
        #    cmd = code --wait $MERGED
        # Comment: Pour la "fusion à trois voies"
            cmd = code --wait --merge $REMOTE $LOCAL $BASE $MERGED
        [diff]
            tool = vscode
        [difftool "vscode"]
            cmd = code --wait --diff $LOCAL $REMOTE
        # Comment: Fin du "Bloc supplémentaire"

Maintenant, depuis votre répertoire Git avec un conflit, exécutez git mergetool et, tada, Visual Studio Code vous aide à gérer le conflit de fusion ! (Assurez-vous juste de enregistrer votre fichier avant de fermer Visual Studio Code.)

Accepter le changement entrant ?

Pour plus d'informations sur le lancement de code depuis l'invite de commandes, consultez cette documentation.

Pour plus d'informations sur git mergetool, consultez cette documentation.

1 votes

Est-ce que cette intégration de Better Merge vous permet d'accepter et de choisir quelle portion fusionner? Ou devez-vous toujours enlever manuellement les commentaires supplémentaires du conflit comme <<<< HEAD et >>>> develop?

3 votes

Il y a une ligne ci-dessus <<<< Head, qui est insérée et qui répertorie les options : "Accepter le changement actuel | Accepter le changement entrant | Accepter les deux changements | Comparer les changements" et je crois qu'elle l'insère sur chaque section de changements détectés dans le fichier. Mais au sein d'une section, si vous souhaitez fusionner manuellement un peu de ceci et un peu de cela, je crois que vous feriez ce changement localement, puis choisiriez l'option "Accepter le changement actuel". Ainsi, le flux de travail vous oblige un peu à reculer pour pouvoir avancer. Si d'autres trouvent une autre manière de résoudre cela, merci de la poster ici pour nous éduquer.

1 votes

Ah je le vois sur votre capture d'écran maintenant, très clair. Merci beaucoup pour l'explication et le mode d'emploi. Je l'utiliserai avec plaisir la prochaine fois que des conflits se présenteront :)

33voto

e4rache Points 111

J'ai dû remplacer les doubles guillemets 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).

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

1 votes

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 c'est le cas, je suggère d'indiquer l'environnement que vous utilisez afin que les autres utilisateurs qui ont le même environnement sachent qu'ils devront apporter cette modification.

1 votes

@e4rache et @Iztok-Delfin ce que vous avez répertorié ici est un contenu utile mais vous l'avez accidentellement transformé en réponse, alors qu'il s'agit vraiment d'un commentaire. Je suis sûr que vous avez rencontré des problèmes parce que vous n'aviez pas les 50 points sur SO pour vous permettre de commenter, ce qui est un problème de flux de travail du site qui devrait peut-être être examiné. Quoi qu'il en soit, merci pour votre contribution, et j'ai ajouté votre conseil dans ma réponse ci-dessus. Merci d'aider ceux qui viennent plus tard et qui utilisent Git Bash :^)

0 votes

@eric-d-johnson J'ai totalement voulu faire un commentaire au lieu d'une réponse. (désolé, je suis nouveau sur ce site) et au fait, j'utilisais bash sur linux. Y a-t-il un moyen de transformer cette réponse en un commentaire?

24voto

mvd Points 517

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

Donc votre git config --global --edit ressemble à ceci.

[merge]
        tool = vscode
[mergetool "vscode"]
        cmd = code --new-window --wait $MERGED
[diff]
        tool = vscode
[difftool "vscode"]
        cmd = code --new-window --wait --diff $LOCAL $REMOTE

0 votes

J'ai utilisé ces réglages, mais lorsque je fais git diff commit_id1 commit_id2, cela n'ouvre pas une fenêtre éditeur de code VS. Cela reste toujours sur le terminal. Est-ce que j'utilise la mauvaise commande ?

0 votes

@user5965026 avez-vous essayé git diftool plutôt que git diff?

1 votes

Note : utilisez cmd = code --wait --merge $REMOTE $LOCAL $BASE $MERGED si vous avez VSCode 1.7+ et voulez une interface de fusion à trois voies.

11voto

gomino Points 2693

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

git difftool --help 
-x , --extcmd=
       Spécifie une commande personnalisée pour visualiser les différences. git-difftool ignore les valeurs par défaut configurées et exécute $command $LOCAL $REMOTE lorsque cette option est spécifiée.
       De plus, $BASE est défini dans l'environnement.

Avec cette information, vous pouvez facilement utiliser la commande suivante sans toucher à la configuration de git :

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

Question similaire ici

2voto

Daniel Bahmani Points 443

Si quelqu'un veut le résoudre dans Visual Studio, une autre option serait de le faire à travers 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

7 votes

Visual Studio n'est pas équivalent à Visual Studio Code. La manière dont les paramètres sont gérés est assez différente. Consultez stackoverflow.com/a/33798601 pour les différences.

2 votes

@jwd630 Je sais que VS Code est différent de VS. J'ai eu ce problème dans VS mais je n'ai pas pu trouver de solution, donc j'ai pensé qu'il serait préférable de le poster au cas où quelqu'un rencontrerait ce problème. Pas besoin de voter négativement.

3 votes

Il s'agit d'une réponse à une question totalement différente pour un produit différent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X