Làm thế nào để liệt kê chỉ các tên tệp đã thay đổi giữa hai lần xác nhận?


Câu trả lời:


2666
git diff --name-only SHA1 SHA2

nơi bạn chỉ cần bao gồm đủ SHA để xác định các cam kết. Bạn cũng có thể làm, ví dụ

git diff --name-only HEAD~10 HEAD~5

để thấy sự khác biệt giữa cam kết mới nhất thứ mười và mới nhất thứ năm (hoặc hơn).


152
Điều này làm việc cho chương trình git là tốt. git show --name-only SHA1.
Tháng 8 Lilleaas

78
git diff --name-status [TAG|SHA1]cũng cho thấy các thao tác đã được thực hiện đối với các tệp
recbot

2
bạn cũng có thể thực hiện: git diff - name-only HEAD @ {3} HEAD @ {0} cho các cam kết chính xác mà bạn muốn so sánh.
b01

7
@AugustLilleaas thực sự sử dụng chương trình sẽ chỉ hiển thị 2 cam kết cụ thể, nếu bạn có các cam kết giữa 2 lần đó thì chúng sẽ bị bỏ qua
chrisan

4
Như đã lưu ý dưới đây, git diff --name-statusdường như không muốn hiển thị các tệp đã thêm. @sschuberth chỉ ra git show, có vẻ như hoạt động đúng với tôi : git show --pretty=format: --name-status. Chỉ cần làm git show --name-statuscho thêm một chút thông tin, nhưng vẫn tốt và dày đặc ... đó sẽ là lệnh goto mới của tôi;)
travc

417
git diff --name-status [SHA1 [SHA2]]

giống như - chỉ tên, ngoại trừ bạn nhận được một tiền tố đơn giản cho bạn biết điều gì đã xảy ra với tệp (đã sửa đổi, xóa, thêm ...)

git log --name-status --oneline [SHA1..SHA2]

là tương tự, nhưng các xác nhận được liệt kê sau thông báo cam kết, vì vậy bạn có thể thấy khi một tệp được thay đổi.

  • nếu bạn quan tâm đến chỉ là những gì đã xảy ra với một số tập tin / thư mục bạn có thể thêm -- <filename> [<filename>...]vào git logphiên bản.

  • nếu bạn muốn xem những gì đã xảy ra cho một cam kết duy nhất, hãy gọi nó là SHA1, sau đó làm
    git log --name-status --oneline [SHA1^..SHA1]

Cờ trạng thái tệp:
M đã sửa đổi - Tệp đã được sửa đổi
C sao chép chỉnh sửa - Tệp đã được sao chép và sửa đổi
R đổi tên-chỉnh sửa - Tệp đã được đổi tên và sửa đổi
A đã thêm - Tệp đã được thêm
D Đã xóa - Tệp đã bị xóa
U không được trộn - Tệp có xung đột sau khi hợp nhất


Tôi tình cờ nói git diff --name-status và nó đã cho 'tập tin được thêm vào'.
aartist

1
Đối với nhật ký git, nó cần có hai dấu chấm giữa các SHA, như SHA1..SHA2 và SHA thứ hai không phải là tùy chọn, vì vậy nó sẽ trông như thế này: git log --name-status --oneline [SHA1 .. SHA2]
twasbrillig

Có cách nào để loại trừ một số tệp / loại tệp nhất định không?
Tháng Tám

3
Các --relative[=<path>]tùy chọn có thể giúp bạn, tôi không chắc chắn. Nếu không thì luôn luôn | erep -v '(.tmp|.foo|.dontwant)$'...
artfulrobot

80

Dường như không ai đề cập đến việc chuyển đổi --stat:

$ git diff --stat HEAD~5 HEAD
 .../java/org/apache/calcite/rex/RexSimplify.java   | 50 +++++++++++++++++-----
 .../apache/calcite/sql/fun/SqlTrimFunction.java    |  2 +-
 .../apache/calcite/sql2rel/SqlToRelConverter.java  | 16 +++++++
 .../org/apache/calcite/util/SaffronProperties.java | 19 ++++----
 .../org/apache/calcite/test/RexProgramTest.java    | 24 +++++++++++
 .../apache/calcite/test/SqlToRelConverterTest.java |  8 ++++
 .../apache/calcite/test/SqlToRelConverterTest.xml  | 15 +++++++
 pom.xml                                            |  2 +-
 .../apache/calcite/adapter/spark/SparkRules.java   |  7 +--
 9 files changed, 117 insertions(+), 26 deletions(-)

Cũng có --numstat

$ git diff --numstat HEAD~5 HEAD
40      10      core/src/main/java/org/apache/calcite/rex/RexSimplify.java
1       1       core/src/main/java/org/apache/calcite/sql/fun/SqlTrimFunction.java
16      0       core/src/main/java/org/apache/calcite/sql2rel/SqlToRelConverter.java
8       11      core/src/main/java/org/apache/calcite/util/SaffronProperties.java
24      0       core/src/test/java/org/apache/calcite/test/RexProgramTest.java
8       0       core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
15      0       core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
1       1       pom.xml
4       3       spark/src/main/java/org/apache/calcite/adapter/spark/SparkRules.java

--shortstat

$ git diff --shortstat HEAD~5 HEAD
9 files changed, 117 insertions(+), 26 deletions(-)

4
Câu trả lời được chấp nhận là chính xác, nhưng điều này là siêu hữu ích và cung cấp cho bạn thêm một chút thông tin. Cảm ơn!
kontur

2
Đồng ý rằng đây là một câu trả lời hữu ích hơn vì nó chứa các số liệu thống kê khác.
internet trên

52

Nhưng để xem các tệp đã thay đổi giữa chi nhánh của bạn và tổ tiên chung của nó với một chi nhánh khác (giả sử nguồn gốc / chủ):

git diff --name-only `git merge-base origin/master HEAD`

1
Điều này thực sự hữu ích! Tôi ước tôi có thể nói đơn giản git diffstatus masterhoặc tương tự, điều đó kích hoạt những điều trên.
oma

3
Hoặc git show --pretty=format: --name-only origin/master...
sschuberth

Bạn có thể không thể biến nó thành bí danh git, nhưng bạn chắc chắn có thể đặt nó vào .bashrc của mình.
Fred

3
Hoặc thậm chí đơn giản hơn: git diff --name-only HEAD...master(lưu ý ba dấu chấm). Để được giải thích chi tiết, xem tại đây .
Ostrokach

1
Hình như câu trả lời chủ yếu là đúng! Simple git diff --name-only master..branchkhông tương ứng với danh sách PR của github. Cách này chính xác hơn. Nhưng dù sao tôi cũng có 173 tập tin đã được so sánh với 171 trong github PR. (không có merge-basetôi có 228 so với 171)
x'ES

21

Để bổ sung câu trả lời của @ artfulrobot, nếu bạn muốn hiển thị các tệp đã thay đổi giữa hai nhánh:

git diff --name-status mybranch..myotherbranch

Hãy cẩn thận về quyền ưu tiên. Nếu bạn đặt nhánh mới hơn trước thì nó sẽ hiển thị các tệp như đã xóa chứ không phải thêm.

Thêm một grepcó thể tinh chỉnh những thứ hơn nữa:

git diff --name-status mybranch..myotherbranch | grep "A\t"

Điều đó sau đó sẽ chỉ hiển thị các tập tin được thêm vào myotherbranch.


4
Regexes là tốt đẹp thực sự có thể làm hầu hết mọi thứ. Tuy nhiên, trong trường hợp này, cũng --diff-filtercung cấp chức năng này một cách tự nhiên, điều đó có nghĩa là ít có cơ hội cho kết quả không chính xác (ví dụ: dương tính giả)
Jasper

8

Thêm bí danh dưới đây vào của bạn ~/.bash_profile, sau đó chạy , source ~/.bash_profile; bây giờ bất cứ lúc nào bạn cần để xem các tệp được cập nhật trong lần xác nhận cuối cùng, chạy, showfilestừ kho git của bạn.

alias showfiles='git show --pretty="format:" --name-only'

2
Hoặc git config --global alias.showfiles 'show --pretty="format:" --name-only'để thực hiện git showfiles.
cgmb

7

Điều này sẽ hiển thị những thay đổi trong tập tin:

git diff --word-diff SHA1 SHA2

5

Cũng lưu ý, nếu bạn chỉ muốn xem các tệp đã thay đổi giữa lần xác nhận cuối cùng và lần trước đó. Điều này hoạt động tốt:git show --name-only


3

Sử dụng git log --pretty = oneline> C: \ filename.log

sẽ chỉ ghi nhật ký một dòng (--pretty = oneline) là tên của tệp đã thay đổi. Cũng sẽ ghi lại tất cả các chi tiết vào tập tin đầu ra của bạn.


git log --pretty=onelinechỉ cung cấp cho tôi SHA và thông báo cam kết bằng git 2.10.1
damd

3

Như artfulrobot đã nói trong câu trả lời của mình:

git diff --name-status [SHA1 [SHA2]]

Ví dụ của tôi:

git diff --name-status 78a09k12067c24d8f117886c4723ccf111af4997 
4b95d595812211553070046bf2ebd807c0862cca
M       views/layouts/default.ctp
M       webroot/css/theme.css
A       webroot/img/theme/logo.png

3

Chỉ dành cho ai đó chỉ cần tập trung vào các tệp Java, đây là giải pháp của tôi:

 git diff --name-status SHA1 SHA2 | grep '\.java$'

1

Sau đây hoạt động tốt cho tôi:

$ git show --name-only --format=tformat: SHA1..SHA2

Nó cũng có thể được sử dụng với một cam kết duy nhất:

git show --name-only --format=tformat: SHA1

tiện dụng để sử dụng trong Jenkins nơi bạn được cung cấp Danh sách các thay đổi của SHA và muốn lặp lại chúng để xem tệp nào đã được thay đổi.

Điều này tương tự như một vài câu trả lời ở trên, nhưng sử dụng tformat:thay vì format:loại bỏ không gian phân cách giữa các lần xác nhận.


0

Dựa trên git diff --name-statustôi đã viết phần mở rộng git-diffview git hiển thị chế độ xem dạng cây phân cấp về những gì đã thay đổi giữa hai đường dẫn.

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.