git: muestra la diferencia de índice en el mensaje de confirmación como comentario

109

Cuando se git commitabre, el editor de mensajes muestra un breve estado, algo como esto:

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is ahead of 'origin/master' by 26 commits.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   Showcase/src/com/gigantt/BorderArea.mxml
#   modified:   Showcase/src/com/gigantt/Client.mxml
#   modified:   Showcase/src/com/gigantt/GraphItem.mxml
#

¿Cómo puedo modificar git para mostrar también la diferencia que se va a comprometer? Soy consciente de que puede ser una diferencia larga, pero aún así ... muy útil.

Assaf Lavie
fuente
¿Qué está tratando de hacer que necesita los cambios enumerados en el mensaje de confirmación? Es posible que tenga un malentendido con una herramienta en particular y es posible que podamos ayudarlo a solucionar el problema real.
Mark Rushakoff
1
¿Eso le proporciona alguna información que no obtiene con 'git log -p'?
Jed Schneider
12
@Mark: El OP quiere que se comente la diferencia. Es una versión más detallada de la sugerencia predeterminada con comentarios. @Jed: El OP quiere esta información en la plantilla de mensaje de confirmación. Sí lo git diff --cachedproduce, pero ¿por qué ejecutar un comando separado si lo desea cada vez?
Cascabel
1
github.com/tpope/vim-fugitive/issues/149 está siguiendo esto para fugitive, en caso de que se lo pregunte. Si no es así, debería serlo.
lkraav

Respuestas:

149

La bandera --verbose(o -v) para git commitmostrará la diferencia de lo que se confirmaría:

git commit --verbose

Alan Haggai Alavi
fuente
3
parece que la diferencia no está comentada, ¿hay alguna forma de convertirla en un comentario por defecto?
Idan K
25
Los mensajes diff no necesitan ser comentados, Idan; git sabe ignorarlos como si fueran comentarios.
Brandon Rhodes
@BrandonRhodes ¿Cómo decirle a git bit ti que ignore la diferencia? Tengo un script para generar algunas líneas de adición en formato diff, pero se truncó desde la primera línea
Dennis C
2
@IdanK, un beneficio de que las líneas de diferencias no se comentan en la plantilla de mensaje de confirmación es que la coloración del código de vim funciona en el contenido de diferencias agregado (si tiene las adiciones de tipo de archivo git instaladas para vim). Si se comentaran estas líneas de diferencia, este color no funcionaría.
Christopher
1
Ignore mi comentario anterior; el culpable fue que el complemento EditorConflig se metió con la línea "No tocar la línea de arriba".
Daniel Liuzzi
31

No hay suficiente reputación para publicar una respuesta a la respuesta de Alan, pero para Idan y cualquier otra persona, simplemente lo probé y las líneas de diferencia en el mensaje de confirmación no están explícitamente comentadas. Sin embargo, todavía no aparecen en el mensaje de confirmación final, gracias a Dios.

$ git commit --verbose

En mi editor:

Feeling a bit pessimistic now.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#
diff --git a/README b/README
index af5626b..c62237e 100644
--- a/README
+++ b/README
@@ -1 +1 @@
-Hello, world!
+Goodbye, world!

(tenga en cuenta la falta de #preceder las líneas de diferencia)

Y luego el mensaje de confirmación real:

$ git log -n 1
commit ad21a2655ef6d8173c2df08dc9893055b26bc068
Author: Tom Jakubowski <[email protected]>
Date:   Thu Oct 27 19:12:54 2011 -0700

    Feeling a bit pessimistic now.

Obviamente, git showseguirá mostrando la diferencia, pero eso es porque siempre lo hace para las confirmaciones. :)

tomjakubowski
fuente
2
En las nuevas versiones de git (tengo 2.3), la diferencia tiene como prefijo la siguiente línea: # ------------------------ >8 ------------------------- supongo que git elimina automáticamente todo lo que aparece después.
Jan Warchoł
A partir de al menos 2.4.1, veo: # ------------------------> 8 ------------ ------------ # No toque la línea de arriba. # Todo lo que aparece a continuación se eliminará. entonces esto confirma lo que estabas pensando.
Anthony Panozzo
@AnthonyPanozzo Esto parece estar roto en 2.5.3. A pesar del marcador "No tocar la línea de arriba", la diferencia completa termina en el mensaje de confirmación de todos modos.
Daniel Liuzzi
Funciona para mí en 2.8.2
Anthony Panozzo
3
Para configurar esto desde la línea de comando:git config --global commit.verbose true
Taylor Edmiston
10

La forma más sencilla de asegurarse de que este comportamiento esté siempre presente es agregar esta sección a su git configarchivo:

[commit]
  verbose = true

Es posible que deba configurar su editor para que se muestre en modo diff (para resaltar la sintaxis). Utilizo Notepad2 como reemplazo del Bloc de notas de Windows y -s diffestablezco el esquema de color de manera apropiada (rojo para líneas eliminadas, etc.):

[core]
  editor = C:/Windows/system32/notepad.exe -s diff
Ryan Lundy
fuente
9

He puesto las siguientes líneas en .git / hooks / prepare-commit-msg para obtener una diferencia comentada:

#!/bin/bash

if [ "$2" == "" ] ; then
    git diff --staged -p --stat 2> /dev/null | awk '{ printf "#"; print}' >> "$1"  2>/dev/null
fi

De esta manera, no solo puede comentar la diferencia, sino también agregar más información (como lo hace la opción estadística ).

Editar: También git commit --verbose no incluye la diferencia en el mensaje de confirmación de esta manera lo haría sin los #.

Miguel
fuente
4
En lugar de comentar que puede usar # ------------------------ >8 ------------------------, puede encontrar más git-scm.com/docs/git-commit#git-commit-scissors
AB
8

Si desea ver siempre la diferencia cuando se compromete, puede agregar lo siguiente a su ~/.gitconfigarchivo:

[alias]
commit = commit -v
oxidado
fuente
Sin embargo, puedes, ¿en qué versión de git estás? Esto funciona para mí con la versión 2.0.0
oxidado
2
Tu respuesta parece prometedora, pero tampoco me funciona. Lo intenté git config --global alias.commit 'commit -v'y el alias se agregó como sugirió, solo automáticamente. Creé otro alias llamado cvque funciona como se esperaba. Mi versión de git es 2.5.0 empaquetada en Ubuntu 15.10.
Daniel Böhmer
6
Para configurar esto desde la línea de comando:git config --global commit.verbose true
Taylor Edmiston