git: Mostra o índice diff na mensagem de confirmação como comentário

109

Quando git commitaberto, o editor de mensagens mostra um breve status, mais ou menos assim:

# 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
#

Como posso ajustar o git para mostrar também o diff a ser confirmado? Estou ciente de que pode ser uma longa diferença, mas ainda assim ... tão útil.

Assaf Lavie
fonte
O que você está tentando fazer para precisar das mudanças listadas na mensagem de confirmação? Você pode ter apenas um mal-entendido com uma ferramenta específica, e podemos ajudá-lo a solucionar o problema real.
Mark Rushakoff de
1
isso fornece algumas informações que você não obtém com 'git log -p'?
Jed Schneider de
12
@Mark: O OP quer o diff comentado. É uma versão mais detalhada da dica padrão comentada. @Jed: O OP quer essas informações no modelo de mensagem de confirmação. Sim git diff --cachedproduz, mas por que executar um comando separado se você deseja isso sempre?
Cascabel de
1
github.com/tpope/vim-fugitive/issues/149 está seguindo isso para fugitivos, caso você esteja se perguntando. Se você não é, você deveria estar.
lkraav

Respostas:

149

O sinalizador --verbose(ou -v) para git commitexibirá a diferença do que seria confirmado:

git commit --verbose

Alan Haggai Alavi
fonte
3
parece que o diff não está comentado, há alguma maneira de torná-lo um comentário por padrão?
Idan K
25
As mensagens diff não precisam ser comentadas, Idan; git sabe como ignorá-los como se fossem comentários.
Brandon Rhodes,
@BrandonRhodes Como dizer ao git bit para ignorar o diff? Eu tenho um script para gerar algumas linhas de adição no formato diff, mas ele foi truncado na primeira linha
Dennis C,
2
@IdanK, um benefício para as linhas diff não serem comentadas no modelo de mensagem de confirmação é que a coloração do código vim funciona no conteúdo diff adicionado (se você tiver as adições de tipo de arquivo git instaladas para vim). Se essas linhas de diferenças fossem comentadas, essa coloração não funcionaria.
Christopher
1
Desconsidere meu comentário anterior; o culpado foi o plugin EditorConflig mexendo com a linha "Não toque na linha acima".
Daniel Liuzzi
31

Não há reputação suficiente para postar uma resposta à resposta de Alan, mas para Idan e qualquer outra pessoa eu apenas experimentei e as linhas de diferenças na mensagem de confirmação não foram explicitamente comentadas. No entanto, eles ainda não aparecem na mensagem final do commit, graças a Deus.

$ git commit --verbose

No meu 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!

(observe a falta de #precedência das linhas de diferenças)

E então a mensagem de confirmação 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 showainda mostrará o diff, mas isso é porque sempre mostra para os commits. :)

Tomjakubowski
fonte
2
Em novas versões do git (eu tenho 2.3), o diff é prefixado com a seguinte linha: # ------------------------ >8 ------------------------- presumo que o git remove automaticamente tudo o que aparece depois dele.
Jan Warchoł
Pelo menos em 2.4.1, vejo: # ------------------------> 8 ------------ ------------ # Não toque na linha acima. # Tudo abaixo será removido. então isso confirma o que você estava pensando.
Anthony Panozzo
@AnthonyPanozzo Isso parece não funcionar no 2.5.3. Apesar do marcador "Não toque na linha acima", a diferença completa acaba na mensagem de confirmação de qualquer maneira.
Daniel Liuzzi
Funciona para mim em 2.8.2
Anthony Panozzo
3
Para definir isso na linha de comando:git config --global commit.verbose true
Taylor Edmiston
10

A maneira mais simples de garantir que esse comportamento esteja sempre presente é adicionar esta seção ao seu git configarquivo:

[commit]
  verbose = true

Você pode precisar configurar seu editor para realmente exibir no modo diff (para realce de sintaxe). Eu uso o Notepad2 como um substituto do bloco de notas do Windows e defino -s diffo esquema de cores de maneira apropriada (vermelho para linhas excluídas, etc.)

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

Coloquei as seguintes linhas em .git / hooks / prepare-commit-msg para obter uma diferença comentada:

#!/bin/bash

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

Desta forma, você pode não apenas comentar o diff, mas também adicionar mais informações (como a opção stat faz).

Editar: Também git commit --verbose não inclui o diff para a mensagem de commit desta forma faria sem os #s.

Michael
fonte
4
Em vez de comentar, você pode usar, # ------------------------ >8 ------------------------você pode encontrar mais git-scm.com/docs/git-commit#git-commit-scissors
AB
8

Se você quiser sempre ver a diferença ao fazer um commit, você pode adicionar o seguinte ao seu ~/.gitconfigarquivo:

[alias]
commit = commit -v
oxidado
fonte
Você pode, no entanto - em qual versão do git você está? Isso funciona para mim com a versão 2.0.0
enferrujado de
2
Sua resposta parece promissora, mas também não funciona para mim. Tentei git config --global alias.commit 'commit -v'e o alias foi adicionado como você sugeriu - apenas automaticamente. Criei outro alias chamado cvque funciona como esperado. Minha versão git é 2.5.0 conforme empacotado no Ubuntu 15.10.
Daniel Böhmer
6
Para definir a partir da linha de comando:git config --global commit.verbose true
Taylor Edmiston