git: Hiển thị khác biệt chỉ mục trong thông báo cam kết dưới dạng nhận xét


109

Khi git commitmở trình soạn thảo tin nhắn sẽ hiển thị một trạng thái ngắn gọn, giống như sau:

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

Làm cách nào tôi có thể tinh chỉnh git để hiển thị sự khác biệt được cam kết? Tôi biết rằng nó có thể là một sự khác biệt dài, nhưng vẫn .. rất hữu ích.


Bạn đang cố gắng làm gì mà bạn cần các thay đổi được liệt kê trong thông báo cam kết? Bạn chỉ có thể hiểu nhầm với một công cụ cụ thể và chúng tôi có thể giúp bạn giải quyết vấn đề thực tế.
Mark Rushakoff

1
Điều đó có cung cấp cho bạn một số thông tin mà bạn không nhận được với 'git log -p' không?
Jed Schneider

12
@Mark: OP muốn nhận xét khác biệt. Đây là một phiên bản dài hơn của gợi ý nhận xét mặc định. @Jed: OP muốn thông tin này trong mẫu thông báo cam kết. Có git diff --cachedtạo ra nó, nhưng tại sao phải chạy một lệnh riêng biệt nếu bạn muốn nó mọi lúc?
Cascabel

1
github.com/tpope/vim-fugitive/issues/149 đang theo dõi điều này để chạy trốn, trong trường hợp bạn đang thắc mắc. Nếu bạn không, bạn nên như vậy.
lkraav

Câu trả lời:


149

Các --verbose(hoặc -v) cờ cho git commitsẽ hiển thị khác về những gì sẽ được cam kết:

git commit --verbose


3
Có vẻ như sự khác biệt không được nhận xét, bất kỳ cách nào để làm cho nó trở thành một nhận xét theo mặc định?
Idan K

25
Các thông điệp khác nhau không cần phải được bình luận, Idan; git biết bỏ qua chúng như thể chúng là những bình luận.
Brandon Rhodes

@BrandonRhodes Làm thế nào để nói git bit ti bỏ qua điểm khác biệt? Tôi đã một kịch bản để tạo ra vài dòng Ngoài ra ở định dạng khác, nhưng nó đã rút ngắn từ dòng đầu tiên
Dennis C

2
@IdanK, một lợi ích đối với các dòng khác biệt không được nhận xét trong mẫu thông báo cam kết là màu mã vim hoạt động trên nội dung khác biệt được thêm vào (nếu bạn đã cài đặt bổ sung loại tệp git cho vim). Nếu những dòng khác biệt này được nhận xét, màu này sẽ không hoạt động.
Christopher

1
Bỏ qua bình luận trước đây của tôi; thủ phạm là plugin EditorConflig gây rối với dòng "Không chạm vào dòng ở trên".
Daniel Liuzzi

31

Không đủ danh tiếng để đăng câu trả lời cho câu trả lời của Alan, nhưng đối với Idan và bất kỳ ai khác, tôi chỉ thử nó và các dòng khác nhau trong thông báo cam kết không được bình luận rõ ràng. Tuy nhiên, họ vẫn không xuất hiện trong thông điệp cam kết cuối cùng, cảm ơn trời.

$ git commit --verbose

Trong trình soạn thảo của tôi:

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!

(lưu ý thiếu #các dòng khác trước)

Và sau đó là thông báo cam kết thực tế:

$ git log -n 1
commit ad21a2655ef6d8173c2df08dc9893055b26bc068
Author: Tom Jakubowski <tom@crystae.net>
Date:   Thu Oct 27 19:12:54 2011 -0700

    Feeling a bit pessimistic now.

Rõ ràng, git showvẫn sẽ hiển thị sự khác biệt, nhưng đó là bởi vì nó luôn làm cho các cam kết. :)


2
Trong các phiên bản mới của git (tôi có 2.3), sự khác biệt được bắt đầu bằng dòng sau: # ------------------------ >8 ------------------------- Tôi cho rằng git tự động xóa mọi thứ xuất hiện sau nó.
Jan Warchoł

Kể từ ít nhất 2.4.1, tôi thấy: # ------------------------> 8 ------------ ------------ # Không chạm vào dòng trên. # Mọi thứ bên dưới sẽ bị xóa. vì vậy điều này xác nhận những gì bạn đang nghĩ.
Anthony Panozzo

@AnthonyPanozzo Điều này dường như đã bị hỏng vào 2.5.3. Mặc dù có điểm đánh dấu "Không chạm vào dòng phía trên", sự khác biệt đầy đủ vẫn xuất hiện trong thông báo cam kết.
Daniel Liuzzi

Làm việc cho tôi trong 2.8.2
Anthony Panozzo

3
Để thiết lập điều này từ dòng lệnh:git config --global commit.verbose true
Taylor Edmiston

10

Cách đơn giản nhất để đảm bảo hành vi này luôn tồn tại là thêm phần này vào git configtệp của bạn :

[commit]
  verbose = true

Bạn có thể cần phải định cấu hình trình chỉnh sửa của mình để thực sự hiển thị ở chế độ khác (để làm nổi bật cú pháp). Tôi sử dụng Notepad2 làm sự thay thế Notepad của Windows và -s diffđặt bảng màu phù hợp (màu đỏ cho các dòng đã xóa, v.v.):

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

9

Tôi đã đặt những dòng sau trong .git / hooks / standard-commit-msg để nhận được một điểm khác biệt:

#!/bin/bash

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

Bằng cách này, bạn không chỉ có thể nhận xét sự khác biệt mà còn có thể thêm nhiều thông tin hơn (như tùy chọn thống kê ).

Chỉnh sửa: Ngoài ra git commit --verbose không bao gồm sự khác biệt với thông báo cam kết theo cách này sẽ thực hiện mà không có #s.


4
Thay vì nhận xét bạn có thể sử dụng, # ------------------------ >8 ------------------------bạn có thể tìm thêm git-scm.com/docs/git-commit#git-commit-scissors
AB

8

Nếu bạn muốn luôn thấy sự khác biệt khi bạn cam kết, bạn có thể thêm phần sau vào ~/.gitconfigtệp của mình :

[alias]
commit = commit -v

Tuy nhiên, bạn có thể - bạn đang sử dụng phiên bản git nào? Điều này hoạt động đối với tôi với phiên bản 2.0.0
gỉ

2
Câu trả lời của bạn có vẻ đầy hứa hẹn nhưng cũng không hiệu quả với tôi. Tôi đã thử git config --global alias.commit 'commit -v'và bí danh đã được thêm như bạn đề xuất - chỉ tự động. Tôi đã tạo một bí danh khác có tên cvhoạt động như mong đợi. Phiên bản git của tôi là 2.5.0 được đóng gói trong Ubuntu 15.10.
Daniel Böhmer

6
Để thiết lập điều này từ dòng lệnh:git config --global commit.verbose true
Taylor Edmiston
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.