Có cách nào để thêm git hiển thị dòng, thay đổi dòng và xóa dòng không?


110

"git diff --stat" và "git log --stat" hiển thị đầu ra như:

$ git diff -C --stat HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07
 app/controllers/application_controller.rb |   34 +++-------------------------
 1 files changed, 4 insertions(+), 30 deletions(-)

Nhưng điều thực sự xảy ra trong cam kết đó là 4 dòng đã được thay đổi và 26 dòng bị xóa, khác với việc thêm 4 dòng và xóa 30 dòng.

Có cách nào để nhận được các LOC đồng bằng (26 trong trường hợp này) không? Tôi không thực sự quan tâm đến việc phân biệt giữa các dòng được thêm vào hoặc bị xóa.

Câu trả lời:


127

Bạn có thể dùng:

git diff --numstat

để nhận thông tin khác biệt về số.

Đối với việc tách sửa đổi khỏi một cặp thêm và bớt, --word-diffcó thể hữu ích. Bạn có thể thử một cái gì đó như sau:

MOD_PATTERN='^.+(\[-|\{\+).*$' \
ADD_PATTERN='^\{\+.*\+\}$' \
REM_PATTERN='^\[-.*-\]$' \
git diff --word-diff --unified=0 | sed -nr \
    -e "s/$MOD_PATTERN/modified/p" \
    -e "s/$ADD_PATTERN/added/p" \
    -e "s/$REM_PATTERN/removed/p" \
    | sort | uniq -c

Nó hơi dài dòng nên bạn có thể muốn phân tích cú pháp nó trong tập lệnh của riêng mình.


2
Cảm ơn quornian nhưng numstat cung cấp thông tin chính xác giống như thống kê, bổ sung và xóa.
Juan Alonso

Đã cập nhật câu trả lời của tôi để bao gồm một ví dụ sử dụng --word-diff. Điều đó có thể hữu ích hơn.
quornian

14
Đầu ra của git diff --numstatđược chia nhỏ theo tệp. Để xem tổng số được thêm / bớt cho sự khác biệt, bạn có thể chuyển nó thành awk:git diff --numstat | awk '{ added += $1; removed += $2 } END { print "+" added " -" removed }'
ôm

15
@hughes Một cách đơn giản hơn để có được cùng một thông tin là git diff --shortstat. Theo kinh nghiệm của tôi, nó tương đương với việc tích lũy đầu ra của git diff --numstat.
klaus triendl

1
Cũng FWIW để xem số liệu thống kê cho những thay đổi tổ chức, chỉ cần thêm--cached
XLM

65
  1. Nếu bạn muốn biết các dòng được thêm / thay đổi / xóa bởi một cam kết với id commit-id, bạn có thể sử dụng

    git show commit-id --stat
    

    hoặc là

    git diff commit-id-before commit-id --stat
    
  2. Nếu bạn biết các dòng được thêm / thay đổi / xóa bởi một phạm vi cam kết, bạn có thể sử dụng

    git diff commit-id1 commit-id2 --stat
    
  3. Nếu bạn muốn biết các dòng được thêm / thay đổi / xóa bởi mỗi cam kết, bạn có thể sử dụng

    git log --stat
    

Giải pháp đó không trả lời câu hỏi, "git --stat" tính một dòng được sửa đổi duy nhất là "1 lần chèn và 1 lần xóa". Câu hỏi hỏi làm thế nào để có được "1 thay đổi".
Juan Alonso

6

Nếu tất cả các tệp của bạn được sắp xếp để cam kết, hãy xem --numstatnhư sau:

git diff --numstat HEAD~

4

git sử dụng diff "hợp nhất", chỉ có các dòng được thêm và xóa, làm định dạng khác biệt. Bạn phải làm điều gì đó bên ngoài để có được sự khác biệt hiển thị thêm, xóa và thay đổi thông tin.

https://wiki.postgresql.org/wiki/Working_with_Git#Context_diffs_with_Git cung cấp liên kết đến một tập lệnh cho phép chạy "diff" cũ thông thường - và từ đó bạn có thể tạo đầu ra khác biệt "ngữ cảnh" . Khác biệt ngữ cảnh hiển thị các dòng đã thêm, đã xóa và đã thay đổi, điều này sẽ cho phép bạn nhận được dữ liệu bạn muốn.


3

Bạn có thể sử dụng diffstatđể hiển thị số dòng đã sửa đổi. Ví dụ:

git diff HEAD c9af3e6136e8aec1f79368c2a6164e56bf7a7e07 | diffstat -C -m

Các -Ctùy chọn là để nhận ra colourised; các -mlựa chọn là cho hiển thị số dòng sửa đổi. Đầu ra mẫu:

 app/controllers/application_controller.rb |   30 -------------------!!!
 1 files changed, 0 insertions(+), 26 deletions(-), 4 modifications(!)

Số lượng dòng được sửa đổi là gần đúng, như đã man diffstatnói:

-m hợp nhất số lượng chèn / xóa từ mỗi "đoạn" của tệp vá để gần đúng số dòng đã sửa đổi.

Một sự khác biệt chính giữa git diff --statdiffstat: diffstatkhông hiển thị chuyển / đổi tên tệp (ví dụ app/{a.rb => b.rb}:).

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.