Câu trả lời ngắn:
git log --full-history -- your_file
sẽ hiển thị cho bạn tất cả các cam kết trong lịch sử của bạn, bao gồm các cam kết hợp nhất, đã được chạm vào your_file
. Cái cuối cùng (trên cùng) là cái đã xóa tệp.
Một số giải thích:
Các --full-history
lá cờ ở đây là rất quan trọng. Không có nó, Git thực hiện "đơn giản hóa lịch sử" khi bạn yêu cầu nó cho nhật ký của một tệp. Các tài liệu rất nhẹ về các chi tiết về chính xác cách thức hoạt động của nó và tôi thiếu sự can đảm và can đảm cần phải cố gắng tìm ra nó từ mã nguồn, nhưng các tài liệu git-log có nhiều điều để nói:
Chế độ mặc định
Đơn giản hóa lịch sử đến lịch sử đơn giản nhất giải thích trạng thái cuối cùng của cây. Đơn giản nhất vì nó cắt tỉa một số nhánh bên nếu kết quả cuối cùng là giống nhau (nghĩa là hợp nhất các nhánh có cùng nội dung)
Điều này rõ ràng liên quan đến khi tệp có lịch sử chúng ta muốn bị xóa , vì lịch sử đơn giản nhất giải thích trạng thái cuối cùng của tệp bị xóa là không có lịch sử . Có rủi ro mà git log
không có --full-history
đơn giản sẽ tuyên bố rằng tập tin không bao giờ được tạo ra? Không may là đúng vậy. Đây là một minh chứng:
mark@lunchbox:~/example$ git init
Initialised empty Git repository in /home/mark/example/.git/
mark@lunchbox:~/example$ touch foo && git add foo && git commit -m "Added foo"
[master (root-commit) ddff7a7] Added foo
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 foo
mark@lunchbox:~/example$ git checkout -b newbranch
Switched to a new branch 'newbranch'
mark@lunchbox:~/example$ touch bar && git add bar && git commit -m "Added bar"
[newbranch 7f9299a] Added bar
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo"
rm 'foo'
[master 7740344] Deleted foo
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 foo
mark@lunchbox:~/example$ git checkout newbranch
Switched to branch 'newbranch'
mark@lunchbox:~/example$ git rm bar && git commit -m "Deleted bar"
rm 'bar'
[newbranch 873ed35] Deleted bar
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git merge newbranch
Already up-to-date!
Merge made by the 'recursive' strategy.
mark@lunchbox:~/example$ git log -- foo
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery
Date: Tue Jan 12 22:50:50 2016 +0000
Deleted foo
commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery
Date: Tue Jan 12 22:50:19 2016 +0000
Added foo
mark@lunchbox:~/example$ git log -- bar
mark@lunchbox:~/example$ git log --full-history -- foo
commit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37c
Merge: 7740344 873ed35
Author: Mark Amery
Date: Tue Jan 12 22:51:36 2016 +0000
Merge branch 'newbranch'
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery
Date: Tue Jan 12 22:50:50 2016 +0000
Deleted foo
commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery
Date: Tue Jan 12 22:50:19 2016 +0000
Added foo
mark@lunchbox:~/example$ git log --full-history -- bar
commit 873ed352c5e0f296b26d1582b3b0b2d99e40d37c
Author: Mark Amery
Date: Tue Jan 12 22:51:29 2016 +0000
Deleted bar
commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ec
Author: Mark Amery
Date: Tue Jan 12 22:50:38 2016 +0000
Added bar
Lưu ý làm thế nào git log -- bar
trong bãi chứa thiết bị đầu cuối ở trên dẫn đến không có đầu ra theo nghĩa đen; Git đang "đơn giản hóa" lịch sử thành một tiểu thuyết bar
không bao giờ tồn tại. git log --full-history -- bar
mặt khác, cung cấp cho chúng tôi cam kết đã tạo bar
và cam kết đã xóa nó.
Để rõ ràng: vấn đề này không chỉ là lý thuyết. Tôi chỉ nhìn vào các tài liệu và phát hiện ra --full-history
cờ vì git log -- some_file
thất bại đối với tôi trong một kho lưu trữ thực sự nơi tôi đang cố gắng theo dõi một tệp đã bị xóa. Lịch sử đơn giản hóa đôi khi có thể hữu ích khi bạn đang cố gắng tìm hiểu làm thế nào một hiện tồn tại từ tập tin đến được ở trạng thái hiện tại của nó, nhưng khi cố gắng để theo dõi xuống một tập tin xóa nó nhiều khả năng vít bạn hơn bằng cách ẩn các cam kết mà bạn quan tâm . Luôn luôn sử dụng --full-history
cờ cho trường hợp sử dụng này.