Làm thế nào tôi có thể tính toán số lượng dòng thay đổi giữa hai lần xác nhận trong git?


748

Có cách nào dễ dàng để tính toán số lượng dòng thay đổi giữa hai lần xác nhận trong git không?

Tôi biết tôi có thể làm một git diff, và đếm các dòng, nhưng điều này có vẻ tẻ nhạt. Tôi cũng muốn biết làm thế nào tôi có thể làm điều này, chỉ bao gồm các cam kết của riêng tôi trong dòng dõi.


3
Bạn nhìn vào BitBucket.
Alex78191

Câu trả lời:


1114

Bạn muốn --stattùy chọn git diffhoặc nếu bạn đang muốn phân tích điều này trong một tập lệnh, --numstattùy chọn.

git diff --stat <commit-ish> <commit-ish>

--stattạo ra đầu ra có thể đọc được của con người mà bạn đã từng thấy sau khi hợp nhất; --numstattạo ra một bố cục bảng đẹp mà các kịch bản có thể dễ dàng giải thích.

Tôi bằng cách nào đó đã bỏ lỡ rằng bạn đang tìm cách thực hiện điều này trên nhiều lần xác nhận cùng một lúc - đó là một nhiệm vụ cho git log. Ron DeVera chạm vào điều này, nhưng bạn thực sự có thể làm nhiều hơn những gì anh ấy đề cập. Vì git logbên trong gọi các máy móc khác để in thông tin được yêu cầu, bạn có thể cung cấp cho nó bất kỳ tùy chọn khác biệt nào - không chỉ --shortstat. Những gì bạn có thể muốn sử dụng là:

git log --author="Your name" --stat <commit1>..<commit2>

nhưng bạn có thể sử dụng --numstathoặc --shortstatlà tốt. git logcũng có thể chọn các cam kết theo nhiều cách khác nhau - hãy xem tài liệu . Bạn có thể quan tâm đến những thứ như --since(thay vì chỉ định phạm vi cam kết, chỉ cần chọn các cam kết kể từ tuần trước) và --no-merges(các cam kết hợp nhất không thực sự giới thiệu các thay đổi), cũng như các tùy chọn đầu ra đẹp ( --pretty=oneline, short, medium, full...).

Đây là một lớp lót để nhận tổng số thay đổi thay vì mỗi lần thay đổi từ nhật ký git (thay đổi các tùy chọn lựa chọn cam kết như mong muốn - đây là cam kết của bạn, từ commit1 sang commit2):

git log --numstat --pretty="%H" --author="Your Name" commit1..commit2 | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("+%d, -%d\n", plus, minus)}'

(bạn phải để nhật ký git in một số thông tin nhận dạng về cam kết; Tôi tùy ý chọn hàm băm, sau đó sử dụng awk để chỉ chọn ra các dòng có ba trường, đó là những trường có thông tin thống kê)


2
Điều này không trả lời cho câu hỏi ban đầu về "dòng thay đổi". Thay đổi một dòng được tính là cả dòng chèn và xóa. Tính toán số lượng dòng thay đổi cần nhiều công việc hơn được mô tả ở đây.
Ville Laitila

12
@VilleLaitila: Đây là gần như bạn có thể nhận được mà không cần một nỗ lực vô lý, và nó là đủ tốt cho OP và 15 người khác. (Làm thế nào để bạn xác định khi một dòng thay đổi trở thành một dòng được thêm vào và một dòng bị xóa? Bằng cách chỉnh sửa khoảng cách giữa dòng - và +, như là một phần của độ dài dòng?) Chúng ta đều biết rằng các thay đổi được nhân đôi; chúng ta chỉ có thể gọi đó là một số liệu hữu ích về lượng thay đổi và tiếp tục với cuộc sống của mình.
Cascabel

188
git diff --shortstat <commit1> <commit2>là người tôi muốn
Kim

9
Để tham khảo, định dạng ngày cho --since--untillà một cái gì đó như: yesterday, 1 month 2 weeks 3 days 1 hour 1 second ago, hoặc1979-02-26 18:30:00
juanmirocks

4
@Bryson Vâng, đó là lý do tại sao dòng đó nói <commit-ish>- nó hoạt động với bất kỳ thứ gì thể hiện cam kết, bao gồm các cam kết theo nghĩa đen, các nhánh, thẻ và ref nói chung. Xem thêm stackoverflow.com/questions/23303549/ khăn
Cascabel

193

Đối với những người lười biếng, sử dụng git log --stat.


14
Tôi thấy điều này hữu ích, thêm một -10để hiển thị mười cam kết trước đó.
Choylton B. Higginbottom

2
Khi bạn xem xong lịch sử cam kết, gõ Qđể trở về thiết bị đầu cuối.
Stevoisiak

180
git diff --shortstat

chỉ cung cấp cho bạn số lượng dòng thay đổi và thêm vào. Điều này chỉ hoạt động với những thay đổi chưa được tổ chức. Để so sánh với một chi nhánh:

git diff --shortstat some-branch

3
Mát mẻ! nhưng .. lưu ý rằng điều này chỉ hoạt động với những thay đổi chưa được thực hiện
TomCobo

3
Nếu bạn đã thay đổi theo giai đoạn git add, hãy đảm bảo thực hiệngit diff --shortstat --cached
TomNash

2463 tệp đã thay đổi, 39745 lần chèn (+), xóa 21383 (-) Tôi thực sự đã xóa khoảng 5k đến 10k trong tháng trước. Đó là gần như tất cả những gì tôi đã làm ngoài việc di chuyển mọi thứ xung quanh. Có cái gì đó không đúng. Nó không bao gồm các tập tin bị loại bỏ hoặc một cái gì đó?
jgmjgm

46
git diff --stat commit1 commit2

EDIT: Bạn cũng phải xác định các xác nhận (không có tham số so sánh thư mục làm việc với chỉ mục). Ví dụ

git diff --stat HEAD^ HEAD

để so sánh cha mẹ HEADvới HEAD.


1
Không bao giờ thực sự có nhu cầu sử dụng diff-index- difffrontend có thể xử lý mọi thứ; trường hợp diff-indexđược bảo vệ bởi --cached/--staged, tôi tin. (Và không có cách nào để sử dụng diff-indexđể so sánh hai cam kết tùy ý như OP yêu cầu.)
Cascabel

Đầu ra của điều này là không có gì cho tôi.
Mike

@Mike: Bạn đã bỏ đi một carat? Là cam kết gần đây nhất của bạn một cam kết hợp nhất? Nếu git nói không có khác biệt, thì đó là vì không có khác biệt.
Cascabel

6
hoặc nếu không được git diff --stat HEAD
khuyến khích

1
Ngoài ra, bạn có thể so sánh trở lại xa hơn chỉ là cha mẹ bằng cách sử dụng HEAD~n, nbạn muốn quay lại bao xa. git diff --stat HEAD~5 HEADsẽ hiển thị số liệu thống kê kết hợp cho 5 lần xác nhận gần nhất liên quan đến CHÍNH.
Nathan Beck

18

Giả sử rằng bạn muốn so sánh tất cả các cam kết của mình giữa abcd123 (cam kết đầu tiên) và wxyz789 (cam kết cuối cùng), bao gồm:

git log wxyz789^..abcd123 --oneline --shortstat --author="Mike Surname"

Điều này cho đầu ra ngắn gọn như:

abcd123 Made things better
 3 files changed, 14 insertions(+), 159 deletions(-)
wxyz789 Made things more betterer
 26 files changed, 53 insertions(+), 58 deletions(-)

Đầu ra của cái này không là gì đối với tôi (Tôi đã cam kết và xác minh - tác giả là chính xác bằng cách sử dụng nó với nhật ký git và không có đối số nào khác).
Mike

Điều này xảy ra với tôi quá. Hai cam kết đã sai thứ tự, hoán đổi chúng xung quanh cố định nó.
bob Esponja

1
Đã cập nhật thứ tự cam kết và làm rõ những gì hai SHA đại diện. Cảm ơn vì đã bắt được nó :)
Ron DeVera

3
Các --shortstatlá cờ là tuyệt vời, nó hoạt động với git diffdù (không git log).
lucke84

Làm thế nào để tóm tắt chúng?
xpto

13

Một cách khác để có được tất cả nhật ký thay đổi trong một khoảng thời gian xác định

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10"

Đầu ra:

2637cc736 Revert changed code
 1 file changed, 5 insertions(+), 5 deletions(-)
ba8d29402 Fix review
 2 files changed, 4 insertions(+), 11 deletions(-)

Với nội dung đầu ra dài, bạn có thể xuất thành tệp để dễ đọc hơn

git log --author="Tri Nguyen" --oneline --shortstat --before="2017-03-20" --after="2017-03-10" > /mnt/MyChangeLog.txt

2

Mặc dù tất cả các câu trả lời trên là chính xác, nhưng câu trả lời dưới đây rất tiện để sử dụng nếu bạn cần số lần cam kết cuối cùng

dưới đây là để có được 5 lần cam kết cuối cùng

git diff $(git log -5 --pretty=format:"%h" | tail -1) --shortstat

để có được 10 lần cam kết gần nhất

git diff $(git log -10 --pretty=format:"%h" | tail -1) --shortstat

chung chung - thay đổi N với số lần cam kết cuối cùng bạn cần

git diff $(git log -N --pretty=format:"%h" | tail -1) --shortstat

để có được tất cả các cam kết kể từ khi bắt đầu

git diff $(git log --pretty=format:"%h" | tail -1) --shortstat


Điều này cho "'đuôi" không được nhận dạng như một lệnh nội bộ hoặc bên ngoài, chương trình có thể hoạt động hoặc tệp bó. "
Charles Roddie


1

Tôi chỉ tự giải quyết vấn đề này, vì vậy tôi sẽ chia sẻ những gì tôi nghĩ ra. Đây là kết quả cuối cùng:

> git summary --since=yesterday
total: 114 file changes, 13800 insertions(+) 638 deletions(-)

Lệnh bên dưới trông như thế này:

git log --numstat --format="" "$@" | awk '{files += 1}{ins += $1}{del += $2} END{print "total: "files" files, "ins" insertions(+) "del" deletions(-)"}'

Lưu ý $@trong lệnh log để truyền vào các đối số của bạn như --author="Brian"hoặc --since=yesterday.

Thoát khỏi awk để đặt nó vào bí danh git rất lộn xộn, vì vậy thay vào đó, tôi đặt nó vào một tập lệnh thực thi trên đường dẫn của tôi ( ~/bin/git-stat-sum), sau đó sử dụng tập lệnh trong bí danh trong .gitconfig:

[alias]
    summary = !git-stat-sum \"$@\"

Và nó hoạt động thực sự tốt. Một điều cuối cùng cần lưu ý là file changessố lượng thay đổi đối với các tệp chứ không phải số lượng các tệp duy nhất đã thay đổi. Đó là những gì tôi đang tìm kiếm, nhưng nó có thể không phải là những gì bạn mong đợi.

Đây là một hoặc hai ví dụ khác

git summary --author=brian
git summary master..dev
# combine them as you like
git summary --author=brian master..dev
git summary --all

Thực sự, bạn sẽ có thể thay thế bất kỳ git loglệnh nào git summary.

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.