Làm thế nào để có nhật ký git hiển thị tên tệp như svn log -v


987

Nhật ký của SVN có chế độ "-v" xuất ra tên tệp của các tệp đã thay đổi trong mỗi lần xác nhận, như vậy:

jes5199 $ svn đăng nhập -v
-------------------------------------------------- ----------------------
r1 | jes5199 | 2007-01 / 03 14:39:41 -0800 (Thứ tư, 03 tháng 1 năm 2007) | 1 dòng
Thay đổi đường dẫn:
   A / TÁC GIẢ
   A / SAO CHÉP
   A / Thay đổi
   A / ĐÁNH GIÁ
   A / CÀI ĐẶT
   A / MacOSX

Có cách nào nhanh chóng để có được danh sách các tệp đã thay đổi trong mỗi lần xác nhận trong git không?


15
Tự hỏi tại sao git logkhông chỉ hỗ trợ một -vchuyển đổi như nhiều người mong đợi / muốn? </ gripe>
MarkHu

Câu trả lời:


1528

Đối với tên đường dẫn đầy đủ của các tệp đã thay đổi:

git log --name-only

Đối với tên đường dẫn đầy đủ và trạng thái của các tệp đã thay đổi:

git log --name-status

Đối với tên đường dẫn viết tắt và khác biệt của các tệp đã thay đổi:

git log --stat

Có nhiều lựa chọn hơn, hãy xem tài liệu .


17
Tôi sử dụng git log --numstat. Xem git help logđể có thêm lựa chọn.
ma11hew28

29
git log --name-only --onelinecũng khá đơn giản - một dòng màu cho cam kết và một tệp trên mỗi dòng. stackoverflow.com/a/14227496/1995714
cp.engr

4
Với git 2.7.3, tôi đã phải sử dụng git log --name-status --find-renamesnó để hiển thị các tệp đã đổi tên thay vì thêm + xóa.
Suzanne Dupéron

1
Lưu ý rằng --statviết tắt các đường dẫn dài; chiều rộng là cấu hình nhưng biểu đồ bao bọc khó đọc hơn. Các định dạng khác như --numstatluôn luôn in đường dẫn đầy đủ.
Beni Cherniavsky-Paskin

@ ma11hew28 Cảm ơn. --numstatnằm ở dòng 946 của trang người đàn ông đó kể từ git 2.22.00. Đó là nhiều lựa chọn hơn hầu hết mọi người cần.
Tái lập Monica - M. Schröder

139

LƯU Ý: không dùng nữa, sử dụng thay thế git whatchangedgit log

Người dùng mới được khuyến khích sử dụng git-log [1] . Các whatchangedlệnh cơ bản cũng giống như git-log [1] nhưng giá trị mặc định để hiển thị đầu ra định dạng diff liệu và bỏ qua sáp nhập.

Lệnh được giữ chủ yếu vì lý do lịch sử; ngón tay của nhiều người đã học Git từ lâu git logđã được phát minh bằng cách đọc danh sách gửi thư nhân Linux được đào tạo để gõ nó.


Bạn có thể sử dụng lệnh git whatchanged --stat để nhận danh sách các tệp đã thay đổi trong mỗi lần xác nhận (cùng với thông báo cam kết).

Người giới thiệu


50

git show cũng là một mệnh lệnh tuyệt vời

Nó giống như thế svn diff, nhưng bạn có thể chuyển cho nó một hướng dẫn cam kết và thấy điều đó khác biệt.


46

Nếu bạn chỉ muốn lấy tên tệp mà không có phần còn lại của thông điệp cam kết, bạn có thể sử dụng:

git log --name-only --pretty=format: <branch name>

Điều này sau đó có thể được mở rộng để sử dụng các tùy chọn khác nhau có chứa tên tệp:

git log --name-status --pretty=format: <branch name>

git log --stat --pretty=format: <branch name>

Một điều cần lưu ý khi sử dụng phương pháp này là có một số dòng trống trong đầu ra sẽ phải bỏ qua. Sử dụng điều này có thể hữu ích nếu bạn muốn xem các tệp đã được thay đổi trên một nhánh cục bộ, nhưng chưa được đẩy đến một nhánh từ xa và không có gì đảm bảo mới nhất từ ​​điều khiển từ xa đã được kéo vào. Ví dụ: :

git log --name-only --pretty=format: my_local_branch --not origin/master

Sẽ hiển thị tất cả các tệp đã được thay đổi trên nhánh cục bộ, nhưng chưa được hợp nhất với nhánh chính trên điều khiển từ xa.


1
Lưu ý về khoảng trắng trong các ví dụ trên - nó giống như , git log --stat --pretty="format:" $branchName. Vì vậy, ví dụ , git log --stat --pretty="format:" $(git rev-parse --abbrev-ref HEAD). Trong khi tôi đang ở đây, đây là câu thần chú chính xác có liên quan đến mục đích của tôi:git log --name-only --pretty="format: " master..$(git rev-parse --abbrev-ref HEAD)
driftcatcher

41

Tôi sử dụng điều này hàng ngày để hiển thị lịch sử với các tệp đã thay đổi:

git log --stat --pretty=short --graph

Để giữ cho nó ngắn, hãy thêm một bí danh trong bạn .gitconfigbằng cách thực hiện:

git config --global alias.ls 'log --stat --pretty=short --graph'

Của tôi rất gần với điều đó, git log --pretty = oneline --graph --name-status. Tôi thấy nó ngắn gọn hơn, chỉ hiển thị danh sách các tập tin đã thay đổi.
Peter Suwara

15

Tôi sử dụng cái này:

git log --name-status <branch>..<branch> | grep -E '^[A-Z]\b' | sort | uniq

chỉ đưa ra danh sách các tệp và trạng thái của chúng (đã thêm, sửa đổi, xóa):

A   sites/api/branding/__init__.py
M   sites/api/branding/wtv/mod.py
...

7

git diff --stat HEAD^!hiển thị các tệp đã thay đổi và số dòng được thêm / xóa cho lần xác nhận cuối cùng ( HEAD).

Dường như với tôi rằng không có lệnh duy nhất nào có được đầu ra ngắn gọn chỉ bao gồm tên tệp và thêm và xóa số dòng cho một số lần xác nhận cùng một lúc, vì vậy tôi đã tạo tập lệnh bash của riêng mình cho điều đó:

#!/bin/bash
for ((i=0; i<=$1; i++))
do
    sha1=`git log -1 --skip=$i --pretty=format:%H`
    echo "HEAD~$i $sha1"
    git diff --stat HEAD~$(($i+1)) HEAD~$i 
done

Được gọi là vd. ./changed_files 99để có được những thay đổi trong một hình thức súc tích từ HEADđến HEAD~99. Có thể được đường ống, ví dụ. để less.


Bạn không thể làm gì git diff --stat HEAD..masterđể thể hiện sự khác biệt giữa CHÍNH và chủ, hoặc điều này không tồn tại khi bạn đăng câu trả lời của bạn vào năm 2012?
Ferrybig

1
Câu hỏi của @Ferrybig OP là về cách "lấy danh sách các tệp đã thay đổi trong mỗi lần xác nhận" , chứ không phải về sự khác biệt giữa HEADmaster. Đó là hai việc khác nhau.
nrz

4

Tôi thấy sau đây là màn hình lý tưởng để liệt kê các tệp đã thay đổi trên mỗi cam kết theo định dạng súc tích:

git log --pretty=oneline --graph --name-status

3

Tóm tắt các câu trả lời với đầu ra ví dụ

Đây là sử dụng một kho lưu trữ cục bộ với năm cam kết đơn giản.

‣ git log --name-only
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

file2
file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

file1
file2
file3


‣ git log --name-status
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

R100    file4   file5

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

M       file1

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

M       file2
D       file3

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

A       file4

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

A       file1
A       file2
A       file3


‣ git log --stat
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:36:32 2019 -0700

    foo file1

    really important to foo before the bar

 file1 | 3 +++
 1 file changed, 3 insertions(+)

commit 1b6413400b5a6a96d062a7c13109e6325e081c85
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:34:37 2019 -0700

    foobar file2, rm file3

 file2 | 1 +
 file3 | 0
 2 files changed, 1 insertion(+)

commit e0dd02ce23977c782987a206236da5ab784543cc
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:33:05 2019 -0700

    Add file4

 file4 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)

commit b58e85692f711d402bae4ca606d3d2262bb76cf1
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:32:41 2019 -0700

    Added files

 file1 | 0
 file2 | 0
 file3 | 0
 3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --oneline
ed080bc (HEAD -> master) mv file4 to file5
file5
5c4e8cf foo file1
file1
1b64134 foobar file2, rm file3
file2
file3
e0dd02c Add file4
file4
b58e856 Added files
file1
file2
file3


‣ git log --pretty=oneline --graph --name-status
* ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master) mv file4 to file5
| R100  file4   file5
* 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328 foo file1
| M     file1
* 1b6413400b5a6a96d062a7c13109e6325e081c85 foobar file2, rm file3
| M     file2
| D     file3
* e0dd02ce23977c782987a206236da5ab784543cc Add file4
| A     file4
* b58e85692f711d402bae4ca606d3d2262bb76cf1 Added files
  A     file1
  A     file2
  A     file3


‣ git diff-tree HEAD
ed080bc88b7bf0c5125e093a26549f3755f7ae74
:100644 000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0000000000000000000000000000000000000000 D  file4
:000000 100644 0000000000000000000000000000000000000000 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 A  file5


‣ git log --stat --pretty=short --graph
* commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
| Author: My Name <user@email.com>
| 
|     mv file4 to file5
| 
|  file4 => file5 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit 5c4e8cfbe3554fe3d7d99b5ae4ba381fa1cdb328
| Author: My Name <user@email.com>
| 
|     foo file1
| 
|  file1 | 3 +++
|  1 file changed, 3 insertions(+)
| 
* commit 1b6413400b5a6a96d062a7c13109e6325e081c85
| Author: My Name <user@email.com>
| 
|     foobar file2, rm file3
| 
|  file2 | 1 +
|  file3 | 0
|  2 files changed, 1 insertion(+)
| 
* commit e0dd02ce23977c782987a206236da5ab784543cc
| Author: My Name <user@email.com>
| 
|     Add file4
| 
|  file4 | 0
|  1 file changed, 0 insertions(+), 0 deletions(-)
| 
* commit b58e85692f711d402bae4ca606d3d2262bb76cf1
  Author: My Name <user@email.com>

      Added files

   file1 | 0
   file2 | 0
   file3 | 0
   3 files changed, 0 insertions(+), 0 deletions(-)


‣ git log --name-only --pretty=format:
file5

file1

file2
file3

file4

file1
file2
file3


‣ git log --name-status --pretty=format:
R100    file4   file5

M       file1

M       file2
D       file3

A       file4

A       file1
A       file2
A       file3


‣ git diff --stat 'HEAD^!'
 file4 => file5 | 0
 1 file changed, 0 insertions(+), 0 deletions(-)


‣ git show
commit ed080bc88b7bf0c5125e093a26549f3755f7ae74 (HEAD -> master)
Author: My Name <user@email.com>
Date:   Mon Oct 21 15:46:04 2019 -0700

    mv file4 to file5

diff --git a/file4 b/file5
similarity index 100%
rename from file4
rename to file5


Tín dụng cho @ CB-Bailey @ Peter-Suwara @Gaurav @ Omer-Dagan @xsor @Hazok @nrz @ptc


0

Một lệnh hữu ích khác sẽ là git diff-tree <hash>nơi băm cũng có thể là một phạm vi băm (được biểu thị bằng <old>..<new>ký hiệu). Một ví dụ đầu ra:

$ git diff-tree  HEAD
:040000 040000 8e09a be406 M myfile

Các lĩnh vực là:

chế độ nguồn, chế độ Dest, hàm băm nguồn, hàm băm, trạng thái, tên tệp

Các trạng thái là những trạng thái bạn mong đợi: D (đã xóa), A (đã thêm), M (đã sửa đổi), v.v ... Xem trang man để biết mô tả đầy đủ.


0

Tôi thường sử dụng chúng để có được các bản ghi:

$ git log --name-status --author='<Name of author>' --grep="<text from Commit message>"

$ git log --name-status --grep="<text from Commit message>"

1
Tôi không biết về các tùy chọn này, nhưng bài đăng này sẽ hữu ích hơn nếu nó giải thích rằng nó lọc nhật ký. Trong một khoảnh khắc ở đó, tôi nghĩ rằng đó là một cách để thay đổi cách các tác giả được liệt kê trong đầu ra.
Stein
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.