git: Zeigt den Indexunterschied in der Festschreibungsnachricht als Kommentar an

109

Wenn git commitder Nachrichteneditor geöffnet ist, wird ein kurzer Status angezeigt:

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

Wie kann ich git optimieren, um auch den Diff anzuzeigen, der festgeschrieben werden soll? Ich bin mir bewusst, dass es ein langer Unterschied sein kann, aber immer noch ... so nützlich.

Assaf Lavie
quelle
Was möchten Sie tun, damit Sie die in der Festschreibungsnachricht aufgeführten Änderungen benötigen? Möglicherweise haben Sie nur ein Missverständnis mit einem bestimmten Tool, und wir können Ihnen möglicherweise dabei helfen, das eigentliche Problem zu umgehen.
Mark Rushakoff
1
liefert Ihnen das einige Informationen, die Sie mit 'git log -p' nicht erhalten?
Jed Schneider
12
@ Mark: Das OP möchte, dass der Diff auskommentiert wird. Es ist eine ausführlichere Version des standardmäßig auskommentierten Hinweises. @Jed: Das OP möchte diese Informationen in der Commit-Nachrichtenvorlage haben. Ja git diff --cachederzeugt es, aber warum einen separaten Befehl ausführen, wenn Sie es jedes Mal wollen?
Cascabel
1
github.com/tpope/vim-fugitive/issues/149 verfolgt dies für Flüchtlinge, falls Sie sich fragen. Wenn Sie nicht sind, sollten Sie sein.
lkraav

Antworten:

149

Das --verbose(oder -v) Flag für git commitzeigt den Unterschied an, was festgeschrieben werden würde:

git commit --verbose

Alan Haggai Alavi
quelle
3
Es scheint, dass das Diff nicht auskommentiert ist. Wie kann man es standardmäßig zu einem Kommentar machen?
Idan K
25
Die Diff-Nachrichten müssen nicht auskommentiert werden, Idan; Git weiß, sie zu ignorieren, als wären sie Kommentare.
Brandon Rhodes
@BrandonRhodes Wie kann man Git Bit sagen, um den Unterschied zu ignorieren? Ich habe ein Skript, um einige zusätzliche Zeilen im Diff-Format zu generieren, aber es wurde von der ersten Zeile abgeschnitten
Dennis C
2
@IdanK, ein Vorteil für die Diff-Zeilen, die in der Commit-Nachrichtenvorlage nicht auskommentiert werden, besteht darin, dass die VIM-Code-Färbung für den hinzugefügten Diff-Inhalt funktioniert (wenn Sie die für vim installierten Git-Dateityp-Ergänzungen installiert haben). Wenn diese Diff-Linien auskommentiert würden, würde diese Färbung nicht funktionieren.
Christopher
1
Ignoriere meinen vorherigen Kommentar; Der Schuldige war das EditorConflig-Plugin, das mit der Zeile "Berühren Sie nicht die Zeile darüber" spielte.
Daniel Liuzzi
31

Nicht genug Ruf, um eine Antwort auf Alans Antwort zu posten, aber für Idan und alle anderen habe ich es gerade ausprobiert und die Diff-Zeilen in der Commit-Nachricht werden nicht explizit auskommentiert. Sie werden jedoch immer noch nicht in der endgültigen Festschreibungsnachricht angezeigt, Gott sei Dank.

$ git commit --verbose

In meinem 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!

(Beachten Sie das Fehlen #vor den Diff-Linien)

Und dann die eigentliche Commit-Nachricht:

$ 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.

Natürlich git showwird immer noch der Unterschied angezeigt, aber das liegt daran, dass dies immer für Commits gilt. :) :)

Tomjakubowski
quelle
2
In neuen Versionen von git (ich habe 2.3) wird dem Diff die folgende Zeile vorangestellt: # ------------------------ >8 ------------------------- Ich gehe davon aus, dass git automatisch alles entfernt, was danach erscheint.
Jan Warchoł
Ab mindestens 2.4.1 sehe ich: # ------------------------> 8 ------------ ------------ # Berühren Sie nicht die obige Linie. # Alles unten wird entfernt. Das bestätigt also, was Sie gedacht haben.
Anthony Panozzo
@AnthonyPanozzo Dies scheint am 2.5.3 kaputt zu sein. Trotz der Markierung "Berühren Sie nicht die Zeile darüber" landet der volle Unterschied trotzdem in der Festschreibungsnachricht.
Daniel Liuzzi
Funktioniert für mich in 2.8.2
Anthony Panozzo
3
So stellen Sie dies über die Befehlszeile ein:git config --global commit.verbose true
Taylor Edmiston
10

Der einfachste Weg, um sicherzustellen, dass dieses Verhalten immer vorhanden ist, besteht darin, diesen Abschnitt zu Ihrer git configDatei hinzuzufügen :

[commit]
  verbose = true

Möglicherweise müssen Sie Ihren Editor so konfigurieren, dass er tatsächlich im Diff-Modus angezeigt wird (zur Hervorhebung der Syntax). Ich verwende Notepad2 als Windows Notepad-Ersatz und stelle -s diffdas Farbschema entsprechend ein (rot für gelöschte Zeilen usw.):

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

Ich habe die folgenden Zeilen in .git / hooks / prepare-commit-msg eingefügt , um einen auskommentierten Unterschied zu erhalten:

#!/bin/bash

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

Auf diese Weise können Sie nicht nur den Unterschied auskommentieren, sondern auch weitere Informationen hinzufügen (wie dies bei der Option stat der Fall ist).

Bearbeiten: Auch git commit --verbose enthält nicht den Unterschied zur Commit-Nachricht, der auf diese Weise ohne die #s auskommen würde.

Michael
quelle
4
Anstatt zu kommentieren, können # ------------------------ >8 ------------------------Sie mehr git-scm.com/docs/git-commit#git-commit-scissors
AB
8

Wenn Sie beim Festschreiben immer den Unterschied sehen möchten, können Sie Ihrer ~/.gitconfigDatei Folgendes hinzufügen :

[alias]
commit = commit -v
rostig
quelle
Du kannst aber - auf welcher Version von Git bist du? Dies funktioniert für mich mit Version 2.0.0
rostig
2
Ihre Antwort sieht vielversprechend aus, funktioniert aber auch bei mir nicht. Ich habe es versucht git config --global alias.commit 'commit -v'und der Alias ​​wurde wie von Ihnen vorgeschlagen hinzugefügt - nur automatisch. Ich habe einen weiteren Alias ​​namens erstellt cv, der wie erwartet funktioniert. Meine Git-Version ist 2.5.0, wie in Ubuntu 15.10 gepackt.
Daniel Böhmer
6
So stellen Sie dies über die Befehlszeile ein:git config --global commit.verbose true
Taylor Edmiston