plug nerd gitgutter vim-fugitive

vim-fugitive - nerd - vim plugins



¿Cómo puedo ejecutar `git diff--staged` con Fugitive? (7)

Actualización: 28/03/2017,

La versión actual de fugitive lo hará automáticamente cuando presiona D en un archivo.

Si el archivo está almacenado, solo se mostrarán los cambios organizados en el diff. Si el archivo no está almacenado, solo se verán los cambios que no estén almacenados.

El comando :Gdiff es equivalente a ejecutar git diff en ese archivo.

¿Cuál es el equivalente para git diff --staged o git diff --cached ?


Como ya se señaló, Gdiff , Gdiff : o Gdiff :0 le da la diferencia con el índice, Gdiff - o Gdiff HEAD le da la diferencia con la CABEZA.

Enfoque de triple división

Así que primero haga una diferencia con : luego con - muestre 3 paneles de diferencias en vim:

  1. CABEZA
  2. índice ("en caché" o "en escena")
  3. arbol de trabajo

command! -bar Gvstage :Gvdiff -|Gvdiff : " vertical 3-split command! -bar Gsstage :Gsdiff -|Gsdiff : " horizontal 3-split

Por supuesto, también puede ir Gvdiff - a Gvdiff - si ya está en modo diferencial.

Ahora, empujar y obtener cambios es un poco más complicado con 3 ventanas abiertas, sin embargo, puede hacer diffput de índice a árbol de trabajo y viceversa fácilmente, ya que en el HEAD modifiable está desactivado, por lo que nunca puede orientarse.

De lo contrario, puede agregar algunos accesos directos para los comandos diffput y diffget , sabiendo que pueden tomar un "especificador de búfer", que puede ser un patrón (ver: ayuda a combinar) o el número de búfer. Modifiqué los comandos anteriores para guardar el número del búfer inicial y usar patrones para los demás:

command! -bar Gvstage :let t:working_copy=bufnr(''%'')|Gvdiff -|Gvdiff : " vertical 3-split command! -bar Gsstage :let t:working_copy=bufnr(''%'')|Gsdiff -|Gsdiff : " horizontal 3-split nnoremap <Leader>hg :diffget fugitive://*/.git//[0-9a-f][0-9a-f]*/<CR> " HEAD get nnoremap <Leader>ig :diffget fugitive://*/.git//0/<CR> " index get nnoremap <Leader>ip :diffput fugitive://*/.git//0/<CR> " index put nnoremap <Leader>wg :diffget <C-R>=t:working_copy<CR><CR> " work get nnoremap <Leader>wp :diffput <C-R>=t:working_copy<CR><CR> " work put

Difftool enfoque

Alternativamente, si solo quieres una buena vista de vimdiff de lo que está en escena en lugar de un parche, déjame sugerirte:

command! Greview :exec "Git difftool --tool=vimdiff --staged " . fugitive#buffer().path()

Esto inicia una nueva instancia de vim, así que cuando la abandonas, regresas a las pestañas y ventanas que ya tenías abiertas, lo cual es perfecto. Esto es más rápido (al menos para mí) que la transición a través de la ventana de estado de git, pero tiene el inconveniente de que no se puede editar el archivo en etapas.


En caso de que alguien haya tropezado con esta pregunta.

: Gdiff - en escena

haré .. :)


He encontrado una manera de hacer esto. Ejecutar :Gstatus , debería obtener una ventana con contenidos como los siguientes:

# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: example.txt #

Desplácese hasta el archivo por etapas, example.txt , y presione Mayús + D. Esto abrirá una vista de diferencias, comparando lo que está en HEAD y lo que está en el índice. Notarás en la barra en la parte inferior que ambos nombres de archivo son nombres de archivo fugitivos especiales.

También, mientras que en la ventana de vista previa de Gstatus, puede presionar g ? , que listará todas las asignaciones válidas en el contexto actual.


Si bien vim-fugitive no proporciona análogos directos para git diff --staged o git diff --cached , proporciona un comando Vim de propósito general para canalizar la salida de comandos git arbitrarios en búferes Vim de solo lectura :Git! .

Respuestas inaplicables

Antes de llegar a eso, replanteamos explícitamente la pregunta. git diff --staged y git diff --cached son sinónimos para la misma operación subyacente: diferenciar los contenidos del índice (el conjunto de todos los cambios en etapas) contra los contenidos de HEAD (la confirmación más reciente para la rama actual), Normalmente para revisar cambios antes de confirmar. La pregunta formulada se convierte entonces en:

¿Cuál es el medio más efectivo para revisar todos los cambios en etapas en vim-fugitive ?

Debe quedar claro que la respuesta automática aceptada actualmente no aborda esta pregunta. La siguiente auto-respuesta mejor calificada no es mejor.

:Gstatus enlaces de :Gstatus solo se aplican al archivo en la línea actual y, por lo tanto , no pueden usarse por definición para revisar todos los cambios en etapas. Además, el :Gstatus D ni siquiera revisa todos los cambios :Gstatus para el archivo en la línea actual. Solo difiere el índice y las copias del árbol de trabajo de ese archivo, en lugar de diferenciar el índice y las copias confirmadas más recientemente de ese archivo (que es una bestia completamente diferente).

:Gdiff HEAD es igualmente inaplicable. Solo difiere de las copias del árbol de trabajo más recientes y confirmadas del archivo correspondiente al búfer actual. :Gdiff sin un argumento es equivalente al :Gstatus D , que difiere nuevamente en el índice y en las copias del árbol de trabajo de ese archivo. Ninguno revisa todos los cambios en escena.

Respuestas aplicables

emaniacs golpeó lo más cercano a una solución de trabajo con este comentario a la última respuesta:

:Git diff --staged

¡Ahora estamos aproximándonos a la verdad!

:Git canaliza la salida del comando git pasado al buscapersonas externo actual, lo que permite una revisión de todos los cambios por etapas externos a Vim. Pero ahí está el problema: externo a Vim. Eso significa que no hay enlaces Vim, buffers o resaltado de sintaxis. Idealmente, preferiríamos una sintaxis de búfer Vim de solo lectura que destaque la salida de git diff --staged . ¿Podemos hacer esto?

La solución

Podemos, o Tim Pope no es el Papa Vim. El -soltada variante de :Git hace justamente eso, permitiendo una revisión total de todos los cambios en etapas dentro de Vim completo con resaltado de sintaxis basado en Vim de las diferencias de cambio:

:Git! diff --staged

Sí. Es bastante impresionante.

Pero vamos un paso más allá. En la tradición tradicional de los holgazanes perezosos en todas partes, definamos un nuevo comando Vim :Greview encapsula esta operación y un nuevo enlace <leader>gr ejecuta este comando. Solo .vimrc siguiente en tu .vimrc :

command Greview :Git! diff --staged nnoremap <leader>gr :Greview<cr>

Suponiendo que <leader> sea , revisión de todos los cambios en etapas se reduce a ,gr . No podía haber ningún Vimmier.


Uso :Gtabedit @:% | Gdiff : :Gtabedit @:% | Gdiff :

Esto es mejor que las otras respuestas porque se abre en vista dividida al igual que :Gdiff , en lugar de volcar la sintaxis diferencial en un solo búfer. Cuando hayas terminado, solo :tabc para volver.

Explicación

  1. Gtabedit abre una nueva pestaña y edita un objeto fugitivo:
    • de commit @ (HEAD), un archivo específico : el archivo actual % .
  2. Gdiff el búfer actual contra otro objeto fugitivo:
    • desde el índice : (puede especificar el archivo nuevamente con :% pero no es necesario).

Prima

Ahora tenemos equivalentes fugitivos para git diff ( :Gdiff ) y git diff --staged (el comando anterior). Para obtener el comportamiento de git show en el archivo actual, use :Gtabedit @~:% | Gdiff @ :Gtabedit @~:% | Gdiff @ .

Referencias


:Gdiff HEAD

Gdiff toma un argumento de revisión. Así que puedes pasarlo HEAD . Esto no es equivalente a git diff --staged , pero puede servir para un propósito similar.