Cómo usar Visual Studio Code como editor predeterminado para Git MergeTool

121

Hoy estaba tratando de usar git mergetoolen el símbolo del sistema de Windows y me di cuenta de que estaba predeterminado usar Vim , lo cual es genial, pero prefiero VS Code .

¿Cómo puedo hacer que Visual Studio Code funcione como mi GUI para manejar conflictos de fusión (o incluso como una herramienta de diferenciación) para Git?

Eric D. Johnson
fuente

Respuestas:

240

A partir de Visual Studio Code 1.13, Better Merge se integró en el núcleo de Visual Studio Code.

La forma de conectarlos es modificar el suyo .gitconfigy tiene dos opciones .

  1. Para hacer esto con entradas de línea de comando, ingrese cada uno de estos: (Nota: reemplace "con 'en Windows Git Bash, macOS y Linux como lo aclararon Iztok Delfin y 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 hacer esto pegando alguna línea en el .gitconfig código de Visual Studio .

    • Ejecutar git config --global core.editor "code --wait"desde la línea de comandos.
    • Desde aquí puede ingresar el comando git config --global -e. Deberá pegar el código en el "Bloque adicional" a continuación.

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

Ahora desde dentro de su directorio de Git con un conflicto ejecutado git mergetooly, tada, ¡tiene Visual Studio Code que lo ayuda a manejar el conflicto de fusión! (Solo asegúrese de guardar su archivo antes de cerrar Visual Studio Code).

¿Acepta el cambio entrante alguien?

Para obtener más información sobre el lanzamiento codedesde la línea de comandos, consulte esta documentación .

Para obtener más información, git mergetoolconsulte esta documentación .

Eric D. Johnson
fuente
3
Hay una línea sobre <<<< Head, que se inserta y que enumera las opciones: "Aceptar el cambio actual | Aceptar el cambio entrante | Aceptar ambos cambios | Comparar cambios" y creo que inserta esto en cada sección de cambios detectados en el archivo . Pero dentro de una sección, si desea fusionar un poco de esto y un poco de eso a mano, creo que haría ese cambio en su local y luego iría con la opción "Aceptar cambio actual". Entonces, el flujo de trabajo hace que retrocedas un paso para dar un paso adelante. Si otros resuelven esto de una manera diferente, publique aquí para educarnos
Eric D. Johnson
3
Recibo el error unknown tool: vscode... Estoy bastante seguro de llamar a VsCode desde la línea de comando que tiene que usar en codelugar devscode
Kolob Canyon
19
Además, esto no me funciona. Simplemente abre VsCode y no se abre ningún archivo
Kolob Canyon
1
Lo que me gustaría hacer es "giff difftool mybranch master" y tener el código VS abierto con la diferencia de todos los archivos que cambiaron. En este momento, solo abrirá uno y esperará a que lo cierre.
Pluc
1
Oh, ya lo sé, pero no tiene la flexibilidad que estoy buscando como obtener una diferencia entre dos confirmaciones o dos ramas. Y si lo hace, navegar por git en vs code es bastante horrible en mi opinión. Me gusta su interfaz de usuario de diferenciación y fusión. Estaba yendo y vi la git difftool -ddiferencia de directorio. Verificaré cómo funciona eso mañana.
Pluc
23

Tuve que reemplazar las comillas dobles con comillas simples:

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

para que funcione correctamente (con comillas dobles, $ LOCAL y $ REMOTE se reemplazan por sus valores).

Esto es necesario si está utilizando Git Bash para Windows en lugar del símbolo del sistema de Windows.

e4rache
fuente
1
No para mí. Acabo de hacer esto en Windows usando el símbolo del sistema. ¿Quizás estás usando algo diferente? Si es así, sugiero que agregue el entorno que está utilizando para que otros con el mismo entorno sepan que necesitarán realizar este cambio.
Todesengel
1
@ e4rache y @ Iztok-Delfin lo que ha enumerado aquí es contenido útil, pero accidentalmente lo ha hecho una respuesta, cuando en realidad es un comentario. Estoy seguro de que tuvo problemas porque no tenía el punto 50 en SO para permitirle comentar, que es una especie de problema de flujo de trabajo del sitio que tal vez debería examinarse. De todos modos, gracias por contribuir, y agregué su consejo en mi respuesta anterior. Gracias por ayudar a los que vienen más tarde y están usando Git Bash:^)
Eric D. Johnson
@ eric-d-johnson Tenía la intención de hacer un comentario en lugar de una respuesta. (lo siento, soy nuevo en este sitio) y por cierto estaba usando bash en linux. ¿Hay alguna forma de transformar esta respuesta en un comentario?
e4rache
@ e4rache No sé cómo hacer un comentario, pero tal vez un moderador vea esto y nos dé algunos consejos (pista, pista). Si tuvieras los 50 puntos, podrías hacer un comentario sobre la respuesta aceptada y eliminar esta, de modo que una vez que te conviertas en una estrella de rock TAN con toneladas de puntos, puedas volver aquí y hacer cualquier limpieza que te haga feliz y te traiga de vuelta. buenos recuerdos de cómo empezó todo.
Eric D. Johnson
1
@mohamedghonemi Buena respuesta. Actualicé la explicación en la parte superior para macOS y Linux ahora para recordar usar comillas simples '.
Eric D. Johnson
2

En caso de que alguien quiera resolverlo en Visual Studio, otra opción sería hacerlo a través de Visual Studio: Team Explorer -> haga clic en el icono Inicio => botón Configuración => expanda la sección Git => haga clic en Configuración global

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Daniel B
fuente
Visual Studio no es equivalente a Visual Studio Code. La forma en que se realizan configuraciones como esta es bastante diferente. Consulte stackoverflow.com/a/33798601 para conocer las diferencias
jwd630
1
@ jwd630 Sé que el código VS es diferente al VS. Tuve este problema en VS pero no pude encontrar una solución para eso, así que pensé que sería mejor publicarlo en caso de que alguien esté experimentando este problema. No hay necesidad de votar en contra.
Daniel B
2

Además de la excelente respuesta existente , debe abrir VS Code en una nueva ventana agregando -na la línea de comando.

Entonces tu se git config --global --editve algo como esto.

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

Usando el manual puedes encontrar un argumento interesante:

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.

Con esta información, puede usar fácilmente el siguiente comando sin tocar la configuración de git:

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

Pregunta similar aquí

Gomino
fuente