git: Tampilkan perbedaan indeks dalam pesan komit sebagai komentar

109

Saat git commitmembuka editor pesan ditampilkan status singkat, seperti ini:

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

Bagaimana saya dapat mengubah git untuk menunjukkan juga perbedaan yang harus dilakukan? Saya sadar bahwa ini mungkin perbedaan yang lama, tapi tetap .. sangat berguna.

Assaf Lavie
sumber
Apa yang Anda coba lakukan sehingga Anda memerlukan perubahan yang tercantum dalam pesan komit? Anda mungkin hanya salah paham dengan alat tertentu, dan kami mungkin dapat membantu Anda mengatasi masalah yang sebenarnya.
Mark Rushakoff
1
apakah itu memberi Anda beberapa informasi yang tidak Anda dapatkan dengan 'git log -p'?
Jed Schneider
12
@ Mark: OP ingin perbedaannya dikomentari. Ini adalah versi yang lebih verbose dari petunjuk default yang diberi komentar. @ Jed: OP menginginkan informasi ini di template pesan komit. Ya git diff --cachedmemproduksinya, tetapi mengapa menjalankan perintah terpisah jika Anda menginginkannya setiap saat?
Cascabel
1
github.com/tpope/vim-fugitive/issues/149 mengikuti ini untuk buronan, jika Anda bertanya-tanya. Jika tidak, Anda seharusnya.
lkraav

Jawaban:

149

The --verbose(atau -v) flag untuk git commitakan menampilkan diff dari apa yang akan dilakukan:

git commit --verbose

Alan Haggai Alavi
sumber
3
tampaknya diff tidak dikomentari, adakah cara untuk menjadikannya komentar secara default?
Idan K
25
Pesan diff tidak perlu dikomentari, Idan; git tahu untuk mengabaikannya seolah-olah itu adalah komentar.
Brandon Rhodes
@BrandonRhodes Bagaimana cara memberitahu git bit ti mengabaikan perbedaan? Saya memiliki skrip untuk menghasilkan beberapa baris tambahan dalam format diff, tetapi terpotong dari baris pertama
Dennis C
2
@IdanK, keuntungan dari baris diff yang tidak dikomentari dalam template pesan komit adalah pewarnaan kode vim bekerja pada konten diff yang ditambahkan (jika Anda memiliki tambahan tipe file git yang diinstal untuk vim). Jika garis-garis pembeda ini dikomentari, pewarnaan ini tidak akan berhasil.
Christopher
1
Abaikan komentar saya sebelumnya; pelakunya adalah plugin EditorConflig yang mengacaukan baris "Jangan sentuh baris di atas".
Daniel Liuzzi
31

Reputasi tidak cukup untuk mengirim balasan atas jawaban Alan, tetapi untuk Idan dan siapa pun saya baru saja mencobanya dan baris diff dalam pesan komit tidak dikomentari secara eksplisit. Namun, mereka masih belum muncul di pesan komit terakhir, syukurlah.

$ git commit --verbose

Di editor saya:

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!

(perhatikan kurangnya #sebelumnya garis diff)

Dan kemudian pesan komit yang sebenarnya:

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

Jelas, git showmasih akan menunjukkan perbedaan, tetapi itu karena selalu dilakukan untuk komit. :)

tomjakubowski
sumber
2
Dalam versi baru git (saya punya 2.3), diff diawali dengan baris berikut: # ------------------------ >8 ------------------------- saya berasumsi bahwa git secara otomatis menghapus semua yang muncul setelahnya.
Jan Warchoł pada
Setidaknya pada 2.4.1, saya melihat: # ------------------------> 8 ------------ ------------ # Jangan sentuh baris di atas. # Semua di bawah ini akan dihapus. jadi ini menegaskan apa yang Anda pikirkan.
Anthony Panozzo
@AnthonyPanozzo Ini sepertinya rusak pada 2.5.3. Meskipun ada penanda "Jangan sentuh baris di atas", perbedaan penuh berakhir di pesan komit.
Daniel Liuzzi
Bekerja untuk saya di 2.8.2
Anthony Panozzo
3
Untuk menyetelnya dari baris perintah:git config --global commit.verbose true
Taylor Edmiston
10

Cara termudah untuk memastikan perilaku ini selalu ada adalah dengan menambahkan bagian ini ke git configfile Anda :

[commit]
  verbose = true

Anda mungkin perlu mengkonfigurasi editor Anda agar benar-benar ditampilkan dalam mode diff (untuk penyorotan sintaks). Saya menggunakan Notepad2 sebagai pengganti Windows Notepad, dan -s diffmengatur skema warna dengan tepat (merah untuk garis yang dihapus, dll.):

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

Saya telah meletakkan baris berikut di .git / hooks / prepared-commit-msg untuk mendapatkan perbedaan yang dikomentari:

#!/bin/bash

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

Dengan cara ini Anda tidak hanya dapat mengomentari perbedaan, tetapi juga menambahkan lebih banyak info (seperti opsi stat ).

Edit: Juga git commit --verbose tidak menyertakan diff ke pesan komit cara ini akan dilakukan tanpa #s.

Michael
sumber
4
Daripada berkomentar, Anda dapat menggunakan # ------------------------ >8 ------------------------Anda dapat menemukan lebih banyak git-scm.com/docs/git-commit#git-commit-scissors
AB
8

Jika Anda ingin selalu melihat perbedaan saat Anda berkomitmen, Anda dapat menambahkan yang berikut ini ke ~/.gitconfigfile Anda :

[alias]
commit = commit -v
berkarat
sumber
Anda bisa, meskipun - versi git apa yang Anda gunakan? Ini berfungsi untuk saya dengan versi 2.0.0
berkarat
2
Jawaban Anda tampak menjanjikan tetapi tidak berhasil untuk saya. Saya mencoba git config --global alias.commit 'commit -v'dan alias ditambahkan seperti yang Anda sarankan - hanya secara otomatis. Saya membuat alias lain bernama cvyang berfungsi seperti yang diharapkan. Versi git saya adalah 2.5.0 seperti yang dikemas di Ubuntu 15.10.
Daniel Böhmer
6
Untuk menyetelnya dari baris perintah:git config --global commit.verbose true
Taylor Edmiston