Làm cách nào tôi có thể liệt kê tất cả các xác nhận đã thay đổi một tệp cụ thể?


803

Có cách nào để liệt kê tất cả các cam kết đã thay đổi một tệp cụ thể không?


1
Bạn đang tìm kiếm các thay đổi cho một tập tin trên một chi nhánh; trên tất cả các chi nhánh địa phương; trên tất cả các chi nhánh trên một điều khiển duy nhất; hoặc trên tất cả? Tôi nghĩ rằng tất cả sẽ yêu cầu một kịch bản.
benhorgen

Câu trả lời:


1083

Các --followcông việc cho một tập tin cụ thể

git log --follow -- filename

Sự khác biệt với các giải pháp khác được đưa ra

Lưu ý rằng các giải pháp khác bao gồm git log path(không có --follow). Cách tiếp cận này rất hữu ích nếu bạn muốn theo dõi, ví dụ như thay đổi trong một thư mục , nhưng vấp ngã khi các tệp được đổi tên (do đó sử dụng --follow filename).


32
+1 --followtài khoản để đổi tên, vì vậy, điều này mạnh mẽ hơngit log -- path
Gabe Moothart

42
Lưu ý rằng --followchấp nhận một đường dẫn , có thể là một tệp nhưng cũng là một thư mục. Trong trường hợp sau, nó sẽ chạy đệ quy và báo cáo các thay đổi cho tất cả các tệp bên dưới điểm đó. (Hành vi này không được ghi lại trong trang và có thể không vĩnh viễn.)
StvnW

5
Có gì khác biệt giữa cái đó và chỉgit log filename?
VaTo

8
@SaulOrtega, git log filenamekhông tuân theo đổi tên tệp, nghĩa là nó sẽ hiển thị tất cả các cam kết liên quan đến tên tệp đó (không phải tệp thực tế). Nếu bạn tạo các file XY, thay đổi cả, sau đó xóa Yvà đổi tên Xđể Yrồi cũng thay đổi nó, và bạn chạy git log Y, bạn sẽ nhận được thông điệp cho cả Ymới một. Và ngược lại, với --followbạn sẽ nhận được các cam kết liên quan đến tập tin đó khi nó được đặt tên X khi nó được đặt tên Y.
MarSoft

7
sử dụng "git log --all filename" để xem tất cả các cam kết trong tất cả các chi nhánh
Lebnik

122

git log pathnên làm những gì bạn muốn Từ git logngười đàn ông :

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.

11
Không hoạt động nếu đường dẫn của tệp đã thay đổi. câu trả lời của jackrabbit không hoạt động trong trường hợp này.
kwahn

1
Tác phẩm này nếu bạn cần phải hạn chế việc đăng nhập vào một chi nhánh cụ thể
AMS

63

Tôi đã xem xét kỹ điều này và tất cả những câu trả lời này dường như không thực sự cho tôi thấy tất cả các cam kết trên tất cả các chi nhánh.

Đây là những gì tôi đã đưa ra bằng cách làm rối tung với các tùy chọn xem chỉnh sửa gitk. Điều này cho tôi thấy tất cả các cam kết cho một tệp bất kể chi nhánh, cục bộ, reflog và từ xa.

gitk --all --first-parent --remotes --reflog --author-date-order -- filename

Nó cũng hoạt động với git log:

git log --all --first-parent --remotes --reflog --author-date-order -- filename

11
Điều này là hoàn hảo khi ai đó thực hiện thay đổi nhưng họ quên nơi họ đã cam kết thay đổi.
earthmeLon

2
Rất hữu ích. Bao gồm cả các cam kết stash
Juan Antonio Tubío

Đây nên là câu trả lời ưa thích. Câu hỏi là tìm tất cả các cam kết, cái này thì có.
carl verbiest

Lưu ý rằng --reflogbao gồm các cam kết đã bị từ chối / sửa đổi hoặc loại bỏ. Có lẽ điều đó là hiển nhiên, nhưng tôi đã cố gắng sử dụng nó với git logvà đang cố gắng tìm ra lý do tại sao tôi thấy các cam kết dường như trùng lặp!
Soren Bjornstad

43

Sử dụng lệnh dưới đây để nhận các cam kết cho một tệp cụ thể:

git log -p filename

8
Tôi hiểu rằng điều này không trả lời chính xác câu hỏi vì anh ta muốn có một danh sách các cam kết nhưng đây là vàng và có trong hồ sơ của tôi.
zbest

3
Điều này hoàn toàn không hoạt động nếu tệp không tồn tại trong nhánh thanh toán hiện tại. Bạn có thể thêm nhánh thích git log -p mybranch -- filenamehoặc chỉ sử dụng git log --all -- filenameđể tìm trong tất cả các nhánh.
Soren Bjornstad

37

Nó nên đơn giản như git log <somepath>; kiểm tra trang chủ ( git-log(1)).

Cá nhân tôi thích sử dụng git log --stat <path>để tôi có thể thấy tác động của từng cam kết đối với tệp.


9
Hoặc thậm chí -pnếu bạn muốn xem khác biệt đầy đủ, không chỉ là nó có một số dòng được sửa đổi.
Cascabel

Đúng, nhưng điều đó khá ồn ào khi xem xét hầu hết các tệp đã được thay đổi nhiều lần trong cuộc sống của họ. Tôi không muốn thấy sự khác biệt đầy đủ của mỗi cam kết từng chạm vào một tệp. Tôi thường tìm kiếm một thứ cụ thể, vì vậy tôi có thể nhận được một bản ghi chỉ với các tác động và sau đó git showtrên các cam kết cụ thể trông giống như chúng quan trọng.
rfunduk

git log --stat --follow - * .html => danh sách đầu ra của các xác nhận với chính xác một tệp trong mỗi cam kết. Rất đẹp!
Sergio Belevskij

18

Ngoài ra (kể từ Git 1.8.4), cũng có thể nhận được tất cả các cam kết đã thay đổi một phần cụ thể của tệp. Bạn có thể có được điều này bằng cách vượt qua dòng bắt đầu và số dòng kết thúc.

Kết quả trả về sẽ là danh sách các cam kết đã sửa đổi phần cụ thể này. Lệnh đi như sau:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

nơi upperLimitstart_line_numberlowerLimitending_line_number

Thông tin thêm - https://www.techpurohit.com/list-some-usiously-git-commands


17

Như jackrabb1t đã chỉ ra, --followsẽ mạnh mẽ hơn vì nó tiếp tục liệt kê lịch sử ngoài việc đổi tên / di chuyển. Vì vậy, nếu bạn đang tìm kiếm một tệp hiện không nằm trong cùng một đường dẫn hoặc một tệp đã được đổi tên trong các cam kết khác nhau, --follow sẽ theo dõi nó.

Đây có thể là một lựa chọn tốt hơn nếu bạn muốn trực quan hóa các thay đổi tên / đường dẫn:

git log --follow --name-status -- <path>

Nhưng nếu bạn muốn một danh sách nhỏ gọn hơn chỉ với những gì quan trọng:

git log --follow --name-status --format='%H' -- <path>

hoặc thậm chí

git log --follow --name-only --format='%H' -- <path>

Nhược điểm là --followchỉ hoạt động cho một tập tin duy nhất.


4
--followhoạt động cho một đường dẫn duy nhất , có thể là một thư mục. Nếu được thông qua một thư mục, nó sẽ chạy đệ quy và báo cáo các thay đổi cho tất cả các tệp bên dưới điểm đó.
StvnW

10

Nếu bạn đang cố gắng - theo dõi một tệp đã bị xóa trong lần sử dụng cam kết trước đó

git log --follow -- filename

3
Đối với gitngười mới: Sử dụng git log -p --follow -- filenameđể hiển thị các thay đổi là tốt. Cũng lưu ý: "tên tệp" có thể là một tệp, một thư mục hoặc một mô hình con.
Tino

8

Nếu bạn muốn xem tất cả các cam kết đã thay đổi một tệp, trong tất cả các nhánh, hãy sử dụng:

git log --follow --all <filepath>

8

Nếu bạn muốn tìm kiếm tất cả các cam kết bằng filenamekhông bằng filepath , hãy sử dụng:

git log --all -- '*.wmv'

6

Nếu bạn muốn xem tất cả các thay đổi được thực hiện trong các cam kết đã thay đổi một tệp cụ thể (thay vì chỉ các thay đổi đối với chính tệp đó), bạn có thể vượt qua --full-diff:

git log -p --full-diff [branch] -- <path>

hoặc không có[branch]
Anentropic

1
@Anentropic Dấu ngoặc vuông được cho là chỉ ra rằng đối số là tùy chọn.
Khối

Đó là tất cả những gì tôi cần, Nó cho thấy sự thay đổi hoàn toàn, bao gồm một số thay đổi từ việc hợp nhất.
Thanh niên

5

Sử dụng git log --all <filename>để xem các cam kết có ảnh hưởng <filename>trong tất cả các chi nhánh.


4
gitk <path_to_filename>

Giả sử gói "gitk" đã được cài đặt.

Nếu nó không được cài đặt, hãy làm điều này:

sudo apt-get install gitk

Và sau đó thử lệnh trên. Nó dành cho Linux ... Nó có thể giúp người dùng Linux nếu họ muốn có GUI.


Đối với người dùng Windows, lưu ý rằng gitkđi kèm với Git cho Windows.
Soren Bjornstad

2

Để có được một danh sách các băm cam kết sử dụng git rev-list

 git rev-list HEAD <filename>

Đầu ra:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

có nghĩa là 5 cam kết đã chạm vào tập tin này. Đó là thứ tự thời gian đảo ngược, vì vậy cam kết đầu tiên trong danh sách b7c4f0d7là lần gần đây nhất.


1

Trên Linux, bạn có thể sử dụng gitk cho việc này.

Nó có thể được cài đặt bằng "sudo apt-get install git-gui gitk". Nó có thể được sử dụng để xem các cam kết của một tệp cụ thể bằng "gitk <Tên tệp>".


1
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>

# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>

Tài liệu tham khảo

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.