Tôi có một dự án có lịch sử lâu dài. Tôi muốn hiển thị cam kết đầu tiên trên git.
Làm thế nào để tôi làm điều này?
Tôi có một dự án có lịch sử lâu dài. Tôi muốn hiển thị cam kết đầu tiên trên git.
Làm thế nào để tôi làm điều này?
Câu trả lời:
git rev-list --max-parents=0 HEAD
(từ bình luận của tiho . Như Chris Johnsen thông báo , --max-parents
đã được giới thiệu sau khi câu trả lời này được đăng.)
Về mặt kỹ thuật, có thể có nhiều hơn một cam kết gốc. Điều này xảy ra khi nhiều lịch sử độc lập trước đây được hợp nhất với nhau. Nó là phổ biến khi một dự án được tích hợp thông qua hợp nhất cây con .
Các git.git
kho có sáu cam kết gốc trong đồ thị lịch sử của nó (một cho mỗi Linus ban đầu cam kết, gitk , một số công cụ ban đầu riêng biệt, git-gui , gitweb , và git-p4 ). Trong trường hợp này, chúng tôi biết rằng đó e83c516
là điều mà chúng tôi có thể quan tâm. Đó là cả cam kết sớm nhất và cam kết gốc.
Nó không đơn giản như vậy trong trường hợp chung.
Hãy tưởng tượng rằng libfoo đã được phát triển trong một thời gian và lưu giữ lịch sử của nó trong kho Git ( libfoo.git
). Một cách độc lập, dự án Thanh bar cũng đã được phát triển ( bar.git
nhưng), nhưng không lâu như libfoo (cam kết có ngày sớm nhất libfoo.git
có ngày trước ngày cam kết có ngày sớm nhất bar.git
). Tại một số điểm, các nhà phát triển của thanh bar Thanh quyết định kết hợp libfoo vào dự án của họ bằng cách sử dụng hợp nhất cây con. Trước khi hợp nhất, việc xác định cam kết đầu tiên của bar.git
họ là rất khó khăn (có lẽ chỉ có một cam kết gốc). Tuy nhiên, sau khi hợp nhất, có nhiều xác nhận gốc và cam kết gốc sớm nhất thực sự đến từ lịch sử của libfoo, không phải thanh bar.
Bạn có thể tìm thấy tất cả các cam kết gốc của DAG lịch sử như thế này:
git rev-list --max-parents=0 HEAD
Đối với bản ghi, nếu --max-parents
không có sẵn, điều này cũng hoạt động:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$"
Nếu bạn có các thẻ hữu ích, thì git name-rev
có thể cung cấp cho bạn tổng quan nhanh về lịch sử:
git rev-list --parents HEAD | egrep "^[a-f0-9]{40}$" | git name-rev --stdin
Sử dụng thường xuyên? Khó nhớ? Thêm một bí danh git để truy cập nhanh
git config --global alias.first "rev-list --max-parents=0 HEAD"
Bây giờ bạn có thể làm
git first
git rev-list --max-parents=0 HEAD
sẽ làm như vậy, và đơn giản hơn một chút.
Tôi thấy rằng:
git log --reverse
hiển thị cam kết từ đầu.
git log --reverse -5
làm cho nó bỏ qua --reverse
vì một số lý do
Bạn chỉ có thể đảo ngược nhật ký của bạn và chỉ cần đăng nhập cho kết quả đầu tiên.
git log --pretty=oneline --reverse | head -1
git log --reverse
đảo ngược lịch sử, vì vậy bạn phải sử dụng head -1
thay vì tail -1
để có được cam kết đầu tiên.
-n
cờ khi --reverse
được đưa ra.
git log --format="%h" | tail -1
cung cấp cho bạn hàm băm cam kết (nghĩa là 0dd89fb
), mà bạn có thể đưa vào các lệnh khác, bằng cách thực hiện một số thứ như
git diff `git log --format="%h" --after="1 day"| tail -1`..HEAD
để xem tất cả các cam kết trong ngày cuối cùng.
git log -1
.