Tôi có thể tạo 'git diff' chỉ các số dòng VÀ thay đổi tên tệp không?


275

Câu hỏi này gọi cho "số dòng", nếu bạn không quan tâm đến số dòng trong đầu ra, hãy xem câu hỏi và câu trả lời này .


Về cơ bản, tôi không muốn xem nội dung đã thay đổi, chỉ có tên tệp và số dòng.


Tôi tò mò, số dòng có thực sự hữu ích mà không cần mã không? Hay bạn muốn số lượng dòng thay đổi?
Andrew Marshall

tốt, không đặc biệt, nhưng tôi cần nó để đánh dấu nơi tôi đã thay đổi mã của mình.
wei

1
Một cách sử dụng này sẽ là kết hợp thông tin với báo cáo phạm vi mã, để đánh giá xem mã mới hoặc mã sửa đổi trong một cam kết có được kiểm tra hay không
AntonyG

@AntonyG Tôi đã tìm thấy câu hỏi này trong khi cố gắng xây dựng một tiện ích thực hiện chính xác điều tương tự (phạm vi bảo hiểm so với các dòng thay đổi). Bạn đã quản lý để xây dựng báo cáo? Nếu vậy, bạn đã xuất bản nó ở bất cứ đâu?
Andrew Newdigate

@AndrewNewdigate nó sẽ là một công cụ tuyệt vời nhưng tôi không bao giờ xây dựng nó. Tôi đã thực hiện một số loại xử lý kết quả bảo hiểm mã khác khi tôi gặp câu hỏi này, nhưng không thể biện minh được thời gian cần thiết để thực hiện đề xuất của mình
AntonyG

Câu trả lời:


70

Lưu ý: nếu bạn đang chỉ tìm kiếm tên các tập tin thay đổi ( mà không cần các số dòng cho dòng đã được thay đổi), đó là dễ dàng, nhấp vào liên kết này để một câu trả lời ở đây .


Không có built-in tùy chọn cho việc này (và tôi không nghĩ rằng đó là tất cả những gì hữu ích cả hai), nhưng nó tốt để làm điều này trong git, với sự giúp đỡ của một "diff bên ngoài" kịch bản.

Đây là một thứ khá nhảm nhí; tùy thuộc vào bạn để sửa chữa đầu ra theo cách bạn muốn.

#! /bin/sh
#
# run this with:
#    GIT_EXTERNAL_DIFF=<name of script> git diff ...
#
case $# in
1) "unmerged file $@, can't show you line numbers"; exit 1;;
7) ;;
*) echo "I don't know what to do, help!"; exit 1;;
esac

path=$1
old_file=$2
old_hex=$3
old_mode=$4
new_file=$5
new_hex=$6
new_mode=$7

printf '%s: ' $path
diff $old_file $new_file | grep -v '^[<>-]'

Để biết chi tiết về "khác biệt bên ngoài", hãy xem mô tả GIT_EXTERNAL_DIFFtrong trang hướng dẫn git (khoảng dòng 700, khá gần cuối).


1
Cảm ơn. Tôi thực sự đã viết một kịch bản tương tự, sau khi được xác nhận rằng không có tùy chọn tích hợp nào cho việc này, :)
wei

Đường ống để | grep -o '^[0-9]*'cung cấp cho bạn chỉ những con số, giả sử bạn không quan tâm đến phía bên tay phải.
GKFX

1
@DylanYoung có; để giới hạn các tệp được hiển thị, hãy thêm vào --diff-filter=...nơi ...phần đó là loại thay đổi bạn muốn xem: Mđể sửa đổi, Athêm, Dxóa, và các phần khác theo git difftài liệu.

@Sventies: đó không phải là những gì OP yêu cầu, như tôi lưu ý ở đầu câu trả lời của tôi. Anh ta không muốn tên của các tập tin một mình. Anh ta muốn tên với số dòng .

Đủ công bằng @torek :)
Sventies 15/03/19

831

Quá dễ:

git diff --name-only

Đi ra và khác!


88
Đây có thể là câu trả lời mà hầu hết mọi người đang tìm kiếm khi họ xem trang này (nó dành cho tôi). Tuy nhiên, nó không trả lời câu hỏi ban đầu, trong đó đề cập cụ thể đến số dòng.
Pieter Müller

12
Đây KHÔNG phải là câu trả lời được chấp nhận vì nó chỉ giải quyết được một nửa vấn đề - bạn vẫn cần xuất ra dòng nào (cho mỗi tệp) đã được thay đổi.
adamwong246

Đó là nó! Tôi đã tìm kiếm công tắc này chính xác!
Adam Arold

Tại sao không sử dụng "trạng thái git"? Nó cũng cho bạn biết các tập tin chưa được theo dõi.
Naveen Paul

1
@JimmyPaul vì đôi khi bạn đã cam kết. Ví dụ: bạn cần liệt kê tệp đã thay đổi giữa chủ và chi nhánh nâng cao hiện tại của bạngit diff --name-only master..HEAD
Hettomei

68

Số dòng như số dòng thay đổi hoặc số dòng thực tế có chứa các thay đổi? Nếu bạn muốn số lượng dòng thay đổi, sử dụng git diff --stat. Điều này cung cấp cho bạn một màn hình như thế này:

[me@somehost:~/newsite:master]> git diff --stat
 whatever/views/gallery.py |    8 ++++++++
 1 files changed, 8 insertions(+), 0 deletions(-)

Không có tùy chọn để có được số dòng của các thay đổi.


1
Tôi đã suy nghĩ số dòng thực tế. Cảm ơn mặc dù.
wei

Tôi bằng cách nào đó nghi ngờ anh ấy muốn một công cụ GUI cho việc này.
ThiefMaster

29

git diff master --compact-summary

Đầu ra là:

 src/app/components/common/sidebar/toolbar/toolbar.component.html   |  2 +-
 src/app/components/common/sidebar/toolbar/toolbar.component.scss   |  2 --

Đây chính xác là những gì bạn cần. Định dạng tương tự như khi bạn thực hiện cam kết hoặc lấy các cam kết mới từ xa.

PS: Đó là dây mà không ai trả lời theo cách này.


1
Điều đó đã không được chỉ định. Nó hoạt động từ 2.18 phát hành năm trước.
Seitbekir Seidametov

Hoàn hảo. Điều này làm việc cho tôi và phản ứng là hoàn hảo.
Victor

15

1) Yêu thích của tôi:

git diff --name-status

Chuẩn bị trạng thái tập tin, ví dụ:

A   new_file.txt
M   modified_file.txt 
D   deleted_file.txt

2) Nếu bạn muốn thống kê, thì:

git diff --stat

sẽ hiển thị một cái gì đó như:

new_file.txt         |  50 +
modified_file.txt    | 100 +-
deleted_file         |  40 -

3) Cuối cùng, nếu bạn thực sự chỉ muốn tên tệp:

git diff --name-only

Sẽ chỉ đơn giản là hiển thị:

new_file.txt
modified_file.txt
deleted_file

4

Hiển thị tên tệp và số lượng / nubmer của các dòng đã thay đổi trong mỗi tệp trong khoảng thời gian từ bây giờ đến cam kết đã chỉ định:

git diff --stat <commit-hash>

2

Tôi biết đây là một câu hỏi cũ nhưng trên Windows, điều này sẽ lọc đầu ra git cho các tệp và thay đổi số dòng:

(git diff -p --stat) | findstr "@@ --git"

diff --git a/dir1/dir2/file.cpp b/dir1/dir2/file.cpp
@@ -47,6 +47,7 @@ <some function name>
@@ -97,7 +98,7 @@ <another functon name>

Để giải nén các tập tin và các dòng thay đổi từ đó là một công việc nhiều hơn một chút:

for /f "tokens=3,4* delims=-+ " %f in ('^(git diff -p --stat .^) ^| findstr ^"@@ --git^"') do @echo %f

a/dir1/dir2/file.cpp
47,7
98,7

1

Đầu ra sạch nhất, chỉ có tên tệp / đường dẫn, đi kèm với

git diff-tree --no-commit-id --name-only -r

HTH


0

Trên git version 2.17.1, không có cờ tích hợp để đạt được mục đích này.

Dưới đây là một lệnh ví dụ để lọc tên tệp và số dòng từ một khác biệt hợp nhất:

git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'

Ví dụ: khác biệt thống nhất:

$ git diff --unified=0
diff --cc foobar
index b436f31,df63c58..0000000
--- a/foobar
+++ b/foobar
@@@ -1,2 -1,2 +1,6 @@@ Line abov
++<<<<<<< HEAD
 +bar
++=======
+ foo
++>>>>>>> Commit message

Sẽ cho kết quả:

❯ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? @@@)' | paste -s -d':'
foobar:1

Để khớp với đầu ra của các lệnh trong kết quả khớp grep chung:

$ git diff --unified=0 | grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? )| @@@.*' | sed -e '0~3{s/ @@@[ ]\?//}' | sed '2~3 s/$/\n1/g' | sed "N;N;N;s/\n/:/g"
foobar:1:1:Line abov
  1. grep -Po '^diff --cc \K.*|^@@@( -[0-9]+,[0-9]+){2} \+\K[0-9]+(?=(,[0-9]+)? ): Khớp tên tệp từ diff --cc <filename>OR Kết hợp số dòng từ @@@ <from-file-range> <from-file-range> <to-file-range>OR Kết hợp văn bản còn lại sau @@@.
  2. sed -e '0~3{s/ @@@[ ]\?//}': Xóa @@@[ ]\?khỏi mọi dòng thứ 3 để có được bối cảnh 1 dòng tùy chọn trước đó ++<<<<<<< HEAD.
  3. sed '2~3 s/$/\n1/g': Thêm \n1mỗi 3 dòng giữa dòng thứ 2 và thứ 3 cho số cột.
  4. sed "N;N;N;s/\n/:/g": Tham gia cứ sau 3 dòng với a :.

0

Tôi sử dụng grepnhư một giải pháp ngây thơ.

$ git diff | grep -A2 -- '---'

một ví dụ đầu ra:

--- a/fileA.txt
+++ b/fileA.txt
@@ -0,0 +1,132 @@
--
--- a/B/fileC.txt
+++ b/B/fileC.txt
@@ -33663,3 +33663,68800 @@ word_38077.png,Latin
--
--- a/D/fileE.txt
+++ b/D/fileE.txt
@@ -17998,3 +17998,84465 @@ word_23979.png,Latin
--
--- a/F
+++ b/F
@@ -1 +1 @@

Có lẽ bạn có thể thấy một đầu ra màu. Nó giúp bạn đọc đầu ra dễ dàng.

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.