example commands git git-diff code-visualization

commands - ¿Cómo puedo obtener una diferencia lado a lado cuando hago "git diff"?



gource (16)

Cuando escribo "git diff", me gustaría ver un diff lado a lado, como con "diff -y", o me gusta mostrar el diff en una herramienta interactiva como "kdiff3". ¿Cómo puede hacerse esto?


Abra Intellij IDEA , seleccione una o varias confirmaciones en la ventana de la herramienta "Control de versión", examine los archivos modificados y haga doble clic en ellos para inspeccionar los cambios al lado de cada archivo.

Con el lanzador de línea de comando incluido puedes traer IDEA a cualquier parte con una idea some/path simple idea some/path


Aquí hay un enfoque. Si canaliza menos, el ancho xterm se establece en 80, que no es tan caliente. Pero si continúa el comando con, por ejemplo, COLS = 210, puede utilizar su xterm ampliado.

gitdiff() { local width=${COLS:-$(tput cols)} GIT_EXTERNAL_DIFF="diff -yW$width /$2 /$5; echo >/dev/null" git diff "$@" }


Aunque Git tiene una implementación interna de diff, puede configurar una herramienta externa en su lugar.

Hay dos formas diferentes de especificar una herramienta de diferencia externa:

  1. estableciendo las variables de entorno GIT_EXTERNAL_DIFF y GIT_DIFF_OPTS .
  2. configurar la herramienta diff externa a través de git config

Ver también:

Al hacer un git diff , Git comprueba tanto la configuración de las variables de entorno anteriores como su archivo .gitconfig .

Por defecto, Git pasa los siguientes siete argumentos al programa diff:

path old-file old-hex old-mode new-file new-hex new-mode

Por lo general, solo necesita los parámetros de archivo antiguo y de archivo nuevo. Por supuesto, la mayoría de las herramientas de diferencias solo toman dos nombres de archivo como argumento. Esto significa que debe escribir un script de contenedor pequeño, que toma los argumentos que Git proporciona al script, y los entrega al programa git externo de su elección.

Digamos que pones tu script wrapper bajo ~/scripts/my_diff.sh :

#!/bin/bash # un-comment one diff tool you''d like to use # side-by-side diff with custom options: # /usr/bin/sdiff -w200 -l "$2" "$5" # using kdiff3 as the side-by-side diff: # /usr/bin/kdiff3 "$2" "$5" # using Meld /usr/bin/meld "$2" "$5" # using VIM # /usr/bin/vim -d "$2" "$5"

entonces necesitas hacer ese script ejecutable:

chmod a+x ~/scripts/my_diff.sh

entonces necesita decirle a Git cómo y dónde encontrar su script de contenedor de diferencias personalizado. Tienes tres opciones para hacerlo: (prefiero editar el archivo .gitconfig)

  1. Usando GIT_EXTERNAL_DIFF , GIT_DIFF_OPTS

    por ejemplo, en su archivo .bashrc o .bash_profile puede configurar:

    GIT_EXTERNAL_DIFF=$HOME/scripts/my_diff.sh export GIT_EXTERNAL_DIFF

  2. Usando la git config

    use "git config" para definir dónde se puede encontrar su script de envoltura:

    git config --global diff.external ~/scripts/my_diff.sh

  3. Editando su archivo ~/.gitconfig

    puede editar su archivo ~/.gitconfig para agregar estas líneas:

    [diff] external = ~/scripts/my_diff.sh

Nota:

De forma similar a la instalación de su herramienta de diferencias personalizada, también puede instalar una herramienta de combinación personalizada, que podría ser una herramienta de fusión visual para ayudar a visualizar mejor la fusión. (vea la página de progit.org)

Ver: http://fredpalma.com/518/visual-diff-and-merge-tool/ y https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration


Esta pregunta apareció cuando estaba buscando una forma rápida de usar Git forma integrada para localizar las diferencias. Mi criterio de solución:

  • Inicio rápido, opciones integradas necesarias
  • Puede manejar muchos formatos fácilmente, xml, diferentes lenguajes de programación
  • Identifique rápidamente pequeños cambios de código en archivos de texto grandes

Encontré esta respuesta para obtener color en git.

Para obtener la diferencia de lado a lado en lugar de la línea de diferencia, la excelente answer en esta pregunta con los siguientes parámetros:

$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]"

Si no te gusta el extra [- o {+ la opción --word-diff=color se puede usar.

$ git diff --word-diff-regex="[A-Za-z0-9. ]|[^[:space:]]" --word-diff=color

Eso ayudó a obtener una comparación adecuada con el texto json y xml y el código java.

En resumen, las --word-diff-regex tienen una visibilidad útil junto con la configuración del color para obtener una experiencia coloreada lado a lado del código fuente en comparación con la diferencia de línea estándar, al navegar por archivos grandes con pequeños cambios de línea.


Hay muchas buenas respuestas en este hilo. Mi solución para este problema fue escribir un guión.

Nombre este ''git-scriptname'' (y hágalo ejecutable y póngalo en su PATH, como cualquier script), y puede invocarlo como un comando git normal ejecutando

$ git scriptname

La funcionalidad real es solo la última línea. Aquí está la fuente:

#!/usr/bin/env zsh # # Show a side-by-side diff of a particular file how it currently exists between: # * the file system # * in HEAD (latest committed changes) function usage() { cat <<-HERE USAGE $(basename $1) <file> Show a side-by-side diff of a particular file between the current versions: * on the file system (latest edited changes) * in HEAD (latest committed changes) HERE } if [[ $# = 0 ]]; then usage $0 exit fi file=$1 diff -y =(git show HEAD:$file) $file | pygmentize -g | less -R


Para Unix, combinando solo git y la diff incorporada:

git show HEAD:path/to/file | diff -y - path/to/file

Por supuesto, puedes reemplazar HEAD con cualquier otra referencia git, y probablemente quieras agregar algo como -W 170 al comando diff.

Esto supone que simplemente está comparando los contenidos de su directorio con una confirmación pasada. Comparar dos compromisos es más complejo. Si tu caparazón es bash , puedes usar "sustitución de proceso":

diff -y -W 170 <(git show REF1:path/to/file) <(git show REF2:path/to/file)

donde REF1 y REF2 son referencias git - etiquetas, ramas o hashes.


Personalmente, realmente me gusta github.com/jeffkaufman/icdiff !

Si está en Mac OS X con HomeBrew , solo haga brew install icdiff .

Para obtener las etiquetas de los archivos correctamente, además de otras características geniales, tengo en mi ~/.gitconfig :

[pager] difftool = true [diff] tool = icdiff [difftool "icdiff"] cmd = icdiff --head=5000 --highlight --line-numbers -L /"$BASE/" -L /"$REMOTE/" /"$LOCAL/" /"$REMOTE/"

Y lo uso como: git difftool


Puede hacer un diff lado a lado usando sdiff siguiente manera:

$ git difftool -y -x sdiff HEAD^ | less

donde HEAD^ es un ejemplo que debes reemplazar con lo que quieras diferir.

Encontré esta solución here donde hay un par de otras sugerencias también. Sin embargo, esta respuesta es la pregunta del OP de manera sucinta y clara.

Vea al hombre git-difftool para una explicación de los argumentos.


Si desea ver diffs lado a lado en un navegador sin involucrar a GitHub, puede disfrutar de git webdiff , un reemplazo directo para git diff :

$ pip install webdiff $ git webdiff

Esto ofrece una serie de ventajas sobre los difftools de GUI tradicionales como tkdiff que puede proporcionar resaltado de sintaxis y mostrar diferencias de imagen.

Lea más sobre esto here .



También puedes probar git diff --word-diff . No es exactamente uno al lado del otro, pero de alguna manera es mejor, por lo que es posible que lo prefiera a su necesidad real lado a lado.


Varios otros ya mencionaron https://github.com/ymattw/cdiff para git side-by-side difiriendo pero nadie dio una implementación completa del mismo.

Configurar cdiff:

git clone https://github.com/ymattw/cdiff.git cd cdiff ln -s `pwd`/cdiff ~/bin/cdiff hash -r # refresh your PATH executable in bash (or ''rehash'' if you use tcsh) # or just create a new terminal

Edite ~ / .gitconfig insertando estas líneas:

[pager] diff = false show = false [diff] tool = cdiff external = "cdiff -s $2 $5 #" [difftool "cdiff"] cmd = cdiff -s /"$LOCAL/" /"$REMOTE/" [alias] showw = show --ext-dif

El localizador es necesario para que cdiff trabaje con Diff, en esencia es un buscapersonas de todos modos, así que está bien. Difftool funcionará independientemente de estas configuraciones.

El alias show es necesario porque git show solo admite herramientas de diferencias externas mediante argumento.

El ''#'' al final del comando externo diff es importante. El comando diff de Git agrega $ @ (todas las variables de diff disponibles) al comando diff, pero solo queremos los dos nombres de archivo. Entonces llamamos a esos dos explícitamente con $ 2 y $ 5, y luego ocultamos el $ @ detrás de un comentario que de otra manera confundiría a sdiff. Resultando un error que se ve así:

fatal: <FILENAME>: no such path in the working tree Use ''git <command> -- <path>...'' to specify paths that do not exist locally.

Los comandos de Git ahora producen una diferencia de lado a lado:

git diff <SHA1> <SHA2> git difftool <SHA1> <SHA2> git showw <SHA>

Uso de Cdiff:

''SPACEBAR'' - Advances the page of the current file. ''Q'' - Quits current file, thus advancing you to the next file.

Ahora tiene diff lado a lado a través de git diff y difftool. Y tiene el código fuente cdiff python para la personalización del usuario avanzado si lo necesita.


Yo uso colordiff

En Mac OS X, instálalo con

$ sudo port install colordiff

En Linux es posible apt get install colordiff o algo así, dependiendo de su distribución.

Entonces:

$ git difftool --extcmd="colordiff -ydw" HEAD^ HEAD

O crea un alias

$ git alias diffy "difftool --extcmd=/"colordiff -ydw/""

Entonces puedes usarlo

$ git diffy HEAD^ HEAD

Lo llamé "diffy" porque diff -y es la diff -y side-by-side en Unix. Colordiff también agrega colores, que son más agradables. En la opción -ydw , el y es para el lado a lado, el w es para ignorar los espacios en blanco, y el d para producir el mínimo diff (por lo general obtienes un mejor resultado como diff)



cdiff puede mostrar lado a lado , incremental , y colorido diff, ver su página de inicio para más detalles y demostración en https://github.com/ymattw/cdiff


export GIT_EXTERNAL_DIFF=''meld $2 $5; echo >/dev/null''

entonces simplemente:

git diff