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?
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?
Câu trả lời:
Các --follow
cô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
).
--follow
tài khoản để đổi tên, vì vậy, điều này mạnh mẽ hơngit log -- path
--follow
chấ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.)
git log filename?
git log filename
khô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 X
và Y
, thay đổi cả, sau đó xóa Y
và đổi tên X
để Y
rồ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ả cũ Y
và mới một. Và ngược lại, với --follow
bạn sẽ nhận được các cam kết liên quan đến tập tin đó khi nó được đặt tên X
và khi nó được đặt tên Y
.
git log path
nên làm những gì bạn muốn Từ git log
ngườ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.
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
--reflog
bao 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 log
và đ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!
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
git log -p mybranch -- filename
hoặc chỉ sử dụng git log --all -- filename
để tìm trong tất cả các nhánh.
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.
-p
nế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.
git show
trên các cam kết cụ thể trông giống như chúng quan trọng.
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 upperLimit
là start_line_number
và lowerLimit
làending_line_number
Thông tin thêm - https://www.techpurohit.com/list-some-usiously-git-commands
Như jackrabb1t đã chỉ ra, --follow
sẽ 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à --follow
chỉ hoạt động cho một tập tin duy nhất.
--follow
hoạ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 đó.
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
git
ngườ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.
Nếu bạn muốn tìm kiếm tất cả các cam kết bằng filename
và không bằng filepath
, hãy sử dụng:
git log --all -- '*.wmv'
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>
[branch]
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.
gitk
đi kèm với Git cho Windows.
Để 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 b7c4f0d7
là lần gần đây nhất.
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>".
# 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>