git: Pokaż różnice indeksu w komunikacie zatwierdzenia jako komentarz

109

Po git commitotwarciu edytor wiadomości pokazuje krótki status, na przykład:

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

Jak mogę dostosować git, aby pokazać również różnicę, która ma zostać zatwierdzona? Zdaję sobie sprawę, że może to być długa różnica, ale nadal… bardzo przydatna.

Assaf Lavie
źródło
Co próbujesz zrobić, że potrzebujesz zmian wymienionych w komunikacie o zatwierdzeniu? Możesz mieć po prostu nieporozumienie z określonym narzędziem, a my możemy pomóc Ci obejść rzeczywisty problem.
Mark Rushakoff
1
czy to dostarcza informacji, których nie dostaniesz za pomocą „git log -p”?
Jed Schneider,
12
@Mark: OP chce, aby różnica została zakomentowana. To bardziej szczegółowa wersja domyślnej wskazówki z komentarzem. @Jed: OP potrzebuje tych informacji w szablonie komunikatu zatwierdzenia. Tak, git diff --cachedtworzy go, ale po co uruchamiać osobne polecenie, jeśli chcesz go za każdym razem?
Cascabel,
1
github.com/tpope/vim-fugitive/issues/149 śledzi to dla uciekinierów, na wypadek, gdybyś się zastanawiał. Jeśli nie, powinieneś.
lkraav

Odpowiedzi:

149

Flaga --verbose(lub -v) dla git commitwyświetli różnicę tego, co zostałoby popełnione:

git commit --verbose

Alan Haggai Alavi
źródło
3
wygląda na to, że różnica nie jest komentowana, jakikolwiek sposób, aby domyślnie był komentarzem?
Idan K
25
Komunikaty różnicowe nie muszą być komentowane, Idan; git wie, żeby je ignorować, jakby były komentarzami.
Brandon Rhodes,
@BrandonRhodes Jak powiedzieć git bit ti zignorować różnice? Mam skrypt do generowania kilku dodatkowych linii w formacie diff, ale został on obcięty z pierwszej linii
Dennis C
2
@IdanK, zaletą braku komentowania linii diff w szablonie komunikatu zatwierdzenia jest to, że kolorowanie kodu vima działa na dodanej zawartości diff (jeśli masz zainstalowane dodatki typu pliku git dla vim). Gdyby te linie różnic były wykomentowane, to kolorowanie nie zadziałałoby.
Christopher
1
Zignoruj ​​mój poprzedni komentarz; winowajcą była wtyczka EditorConflig mieszająca się z linią „Nie dotykaj linii powyżej”.
Daniel Liuzzi
31

Nie ma wystarczającej reputacji, aby opublikować odpowiedź na odpowiedź Alana, ale dla Idana i kogokolwiek innego właśnie to wypróbowałem, a linie różnic w komunikacie zmiany nie zostały wyraźnie zakomentowane. Jednak, dzięki Bogu, nadal nie pojawiają się w ostatnim komunikacie o zatwierdzeniu.

$ git commit --verbose

W moim edytorze:

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!

(zwróć uwagę na brak # poprzedzających linii różnicowych)

A potem rzeczywisty komunikat o zatwierdzeniu:

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

Oczywiście git shownadal będzie pokazywać różnicę, ale to dlatego, że zawsze tak jest dla zatwierdzeń. :)

tomjakubowski
źródło
2
W nowych wersjach gita (mam 2.3) diff jest poprzedzony następującą linią: # ------------------------ >8 ------------------------- Zakładam, że git automatycznie usuwa wszystko, co pojawia się po nim.
Jan Warchoł
Od przynajmniej 2.4.1 widzę: # ------------------------> 8 ------------ ------------ # Nie dotykaj powyższej linii. # Wszystko poniżej zostanie usunięte. więc to potwierdza to, o czym myślałeś.
Anthony Panozzo
@AnthonyPanozzo To wydaje się być zepsute w wersji 2.5.3. Pomimo znacznika „Nie dotykaj linii powyżej”, pełna różnica i tak kończy się w komunikacie zatwierdzenia.
Daniel Liuzzi
Działa dla mnie w 2.8.2
Anthony Panozzo
3
Aby ustawić to z wiersza poleceń:git config --global commit.verbose true
Taylor Edmiston,
10

Najprostszym sposobem upewnienia się, że takie zachowanie jest zawsze obecne, jest dodanie tej sekcji do git configpliku:

[commit]
  verbose = true

Może zajść potrzeba skonfigurowania edytora, aby faktycznie wyświetlał się w trybie porównywania (do podświetlania składni). Używam Notepad2 jako zamiennika Notatnika Windows i -s diffodpowiednio ustawiam schemat kolorów (czerwony dla usuniętych linii itp.):

[core]
  editor = C:/Windows/system32/notepad.exe -s diff
Ryan Lundy
źródło
9

Umieściłem następujące linie w .git / hooks / Preparat-commit-msg, aby otrzymać zakomentowaną różnicę:

#!/bin/bash

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

W ten sposób możesz nie tylko skomentować różnicę, ale także dodać więcej informacji (tak jak robi to opcja stat ).

Edycja: Również git commit --verbose nie dołącza różnic do komunikatu o zatwierdzeniu, w ten sposób obejdzie się bez #s.

Michael
źródło
4
Zamiast komentować, możesz użyć # ------------------------ >8 ------------------------, możesz znaleźć więcej git-scm.com/docs/git-commit#git-commit-scissors
AB
8

Jeśli chcesz zawsze widzieć różnicę po zatwierdzeniu, możesz dodać do swojego ~/.gitconfigpliku:

[alias]
commit = commit -v
zardzewiały
źródło
Możesz jednak - na jakiej wersji gita jesteś? To działa dla mnie w / wersja 2.0.0
zardzewiały
2
Twoja odpowiedź wygląda obiecująco, ale dla mnie też nie działa. Próbowałem git config --global alias.commit 'commit -v'i alias został dodany tak, jak sugerowałeś - po prostu automatycznie. Utworzyłem inny alias o nazwie, cvktóry działa zgodnie z oczekiwaniami. Moja wersja git to 2.5.0, w pakiecie z Ubuntu 15.10.
Daniel Böhmer,
6
Aby ustawić to z wiersza poleceń:git config --global commit.verbose true
Taylor Edmiston,