Làm cách nào để có được danh sách tất cả các tệp đã thay đổi giữa hai lần xác nhận Git?


178

Do quan liêu, tôi cần lấy danh sách tất cả các tệp đã thay đổi trong kho lưu trữ của mình để báo cáo (tôi bắt đầu với mã nguồn hiện có).

Tôi nên chạy cái gì để có danh sách này?


34
"do quan liêu" xD
ptim

Câu trả lời:


238

Đối với các tệp được thay đổi giữa SHA đã cho và cam kết hiện tại của bạn:

git diff --name-only <starting SHA> HEAD

hoặc nếu bạn muốn bao gồm các tệp đã thay đổi nhưng chưa được cam kết:

git diff --name-only <starting SHA>

Tổng quát hơn, cú pháp sau sẽ luôn cho bạn biết các tệp nào đã thay đổi giữa hai lần xác nhận (được chỉ định bởi SHA hoặc tên khác của chúng):

git diff --name-only <commit1> <commit2>

2
và nếu bạn muốn biết các tệp được sửa đổi cho một cam kết cụ thể, hãy thực hiện:git diff --name-only <SHA> <SHA>^
thebugfinder

3
Sử dụng --name-statuscờ thay vì --name-onlytiện dụng để lấy danh sách các tệp và xem trạng thái sửa đổi của chúng, chẳng hạn như Đã thêm hoặc Sửa đổi.
Thane Plummer

@Amber nên đề cập đến ghi chú của @Thane Plummer --name-statuscho thấy những gì đã xảy ra với họ
Zoltán Süle

64

Để tìm tên của tất cả các tệp được sửa đổi kể từ lần xác nhận cuối cùng của bạn:

git diff --name-only

Hoặc (để biết thêm một chút thông tin, bao gồm các tệp chưa được theo dõi):

git status

48
  • Để liệt kê tất cả unstaged theo dõi thay đổi tập tin:

    git diff --name-only
    
  • Để liệt kê tất cả các tập tin thay đổi theo dõi theo giai đoạn :

    git diff --name-only --staged
    
  • Để liệt kê tất cả các tập tin đã thay đổi theo giai đoạn và không theo dõi:

    { git diff --name-only ; git diff --name-only --staged ; } | sort | uniq
    
  • Để liệt kê tất cả các tệp chưa được theo dõi (những tệp được liệt kê bởi git status, vì vậy không bao gồm bất kỳ tệp nào bị bỏ qua):

    git ls-files --other --exclude-standard
    

Nếu bạn đang sử dụng này trong một kịch bản shell, và bạn muốn lập trình kiểm tra nếu các lệnh quay trở lại bất cứ điều gì, bạn sẽ được quan tâm git diff's --exit-codelựa chọn.


16

Khi tôi đã thêm / sửa đổi / xóa nhiều tệp (kể từ lần xác nhận cuối cùng), tôi muốn xem xét các sửa đổi đó theo thứ tự thời gian.

Cho rằng tôi sử dụng:

  • Để liệt kê tất cả các tệp không theo giai đoạn:

    git ls-files --other --modified --exclude-standard
    
  • Để có được ngày sửa đổi cuối cùng cho mỗi tệp:

    while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done
    

Mặc dù ruvim gợi ý trong các ý kiến :

xargs -0 stat -c '%y %n' -- 
  • Để sắp xếp chúng từ cũ nhất đến gần đây hơn:

    sort
    

Một bí danh làm cho nó dễ sử dụng hơn:

alias gstlast='git ls-files --other --modified --exclude-standard|while read filename; do  echo -n "$(stat -c%y -- $filename 2> /dev/null) "; echo $filename;  done|sort'

Hoặc (ngắn hơn và hiệu quả hơn, nhờ ruvim )

alias gstlast='git ls-files --other --modified --exclude-standard|xargs -0 stat -c '%y %n' --|sort'

Ví dụ:

username@hostname:~> gstlast
2015-01-20 11:40:05.000000000 +0000 .cpl/params/libelf
2015-01-21 09:02:58.435823000 +0000 .cpl/params/glib
2015-01-21 09:07:32.744336000 +0000 .cpl/params/libsecret
2015-01-21 09:10:01.294778000 +0000 .cpl/_deps
2015-01-21 09:17:42.846372000 +0000 .cpl/params/npth
2015-01-21 12:12:19.002718000 +0000 sbin/git-rcd

Bây giờ tôi có thể xem lại các sửa đổi của mình, từ cũ nhất đến gần đây hơn.


Tại sao không sử dụng xargsvà gọi một lần stat? Một lớp lót đầy đủ:git ls-files -z --other --modified --exclude-standard | xargs -0 stat -c '%y %n' -- | sort
ruvim

@ruvim Cảm ơn bạn. Đề nghị rất tốt. Tôi đã chỉnh sửa câu trả lời để bao gồm nhận xét của bạn, để dễ nhìn hơn.
VonC

4

Tôi cần một danh sách các tệp đã thay đổi nội dung giữa hai lần xác nhận (chỉ được thêm hoặc sửa đổi), vì vậy tôi đã sử dụng:

git diff --name-only --diff-filter=AM <commit hash #1> <commit hash #2>

Các tùy chọn bộ lọc khác nhau từ tài liệu git diff :

bộ lọc diff = [(A | C | D | M | R | T | U | X | B) [[]]]

Chỉ chọn các tệp được thêm (A), Sao chép (C), Đã xóa (D), Sửa đổi (M), Đổi tên (R), có loại của chúng (ví dụ: tệp thông thường, symlink, mô hình con, Thay đổi) (T), là Unmerged (U), Unknown (X) hoặc đã ghép nối Broken (B). Bất kỳ sự kết hợp của các ký tự bộ lọc (bao gồm không có) có thể được sử dụng. Khi * (Tất cả hoặc không) được thêm vào kết hợp, tất cả các đường dẫn được chọn nếu có bất kỳ tệp nào khớp với các tiêu chí khác trong so sánh; nếu không có tệp phù hợp với tiêu chí khác, không có gì được chọn.

Ngoài ra, những chữ cái viết hoa này có thể được rút gọn để loại trừ. Ví dụ: --diff-filter = quảng cáo loại trừ các đường dẫn được thêm và xóa.

Nếu bạn cũng muốn liệt kê trạng thái (ví dụ A / M), hãy đổi --name-onlythành --name-status.


3

Danh sách sửa đổi chưa được chỉnh sửa có thể được lấy bằng cách sử dụng git statusgreplệnh như dưới đây. Một cái gì đó như git status -s | grep M:

root@user-ubuntu:~/project-repo-directory# git status -s | grep '^ M'
 M src/.../file1.js
 M src/.../file2.js
 M src/.../file3.js
 ....

Lưu ý rằng điều này chỉ có thể được sử dụng cho các thay đổi chưa được thực hiện, vì vậy nó không hữu ích cho 'các tệp đã thay đổi giữa hai lần xác nhận Git'
John Vandenberg

2

Với git showbạn có thể nhận được một kết quả tương tự. Để xem cam kết (giống như giao diện git log) với danh sách các tệp được bao gồm, hãy sử dụng:

git show --name-only [commit-id_A]^..[commit-id_B]

Đâu [commit-id_A]là cam kết ban đầu và [commit-id_B]là cam kết cuối cùng mà bạn muốn thể hiện.

Đặc biệt chú ý với ^biểu tượng. Nếu bạn không đặt điều đó, thông tin commit-id_A sẽ không triển khai.


1

Nếu bạn muốn kiểm tra các tệp đã thay đổi, bạn cần quan tâm đến nhiều thứ nhỏ nhất sẽ sử dụng tốt nhất, như nếu bạn muốn kiểm tra tệp nào đã thay đổi chỉ cần nhập

trạng thái git - nó sẽ hiển thị các tệp có thay đổi

sau đó nếu bạn muốn biết những thay đổi nào sẽ được thực hiện thì có thể kiểm tra theo cách,

git diff - sẽ hiển thị tất cả các thay đổi trong tất cả các tệp

nó chỉ tốt khi chỉ có một tập tin được sửa đổi

và nếu bạn muốn kiểm tra tập tin cụ thể thì hãy sử dụng

khác biệt

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.