Làm cách nào để hiển thị cam kết đầu tiên bằng 'git log'?


Câu trả lời:


298

Câu trả lời ngắn

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.)

Giải trình

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.gitkho 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 đó e83c516là đ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.gitnhưng), nhưng không lâu như libfoo (cam kết có ngày sớm nhất libfoo.gitcó 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.githọ 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-parentskhô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-revcó 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

Tặng kem

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

49
Tôi tin rằng git rev-list --max-parents=0 HEADsẽ làm như vậy, và đơn giản hơn một chút.
tiho

3
@tiho: Vâng, nó cũng làm như vậy, và đơn giản hơn; mặc dù tùy chọn đó không hoàn toàn được người phát minh ra tại thời điểm câu hỏi / câu trả lời này.
Chris Johnsen

Nó xảy ra với tôi rằng cam kết đầu tiên là nhiều hơn một cam kết hơn là một cam kết gốc
tiwo

@tiho Tôi nghĩ câu trả lời của bạn nên là câu trả lời của riêng nó chứ không chỉ là một bình luận. Bằng cách đó, nó sẽ nổi bật hơn và bạn sẽ nhận được nhiều điểm xứng đáng.
Russell Silva

@RussellSilva Tôi không quan tâm đến điểm, nhưng tôi tin rằng có thể chỉnh sửa câu trả lời của người khác, điều này có thể tốt hơn là thêm một điểm mới. Mặc dù vậy, tôi không thực sự thoải mái khi tự mình làm điều đó, cứ thoải mái làm điều đó :)
tiho 17/11/14

414

Tôi thấy rằng:

git log --reverse

hiển thị cam kết từ đầu.


19
thú vị git log --reverse -5làm cho nó bỏ qua --reversevì một số lý do
Dan2552

6
@ Dan2552 Hình như là một lỗi, nên được báo cáo?
saeedgnu

23
có vẻ như lần đầu tiên giới hạn kết quả ở 5 mục, và sau đó đảo ngược
phân cực

3
@ 太極 者 無極 là đúng, đó là hành vi được ghi lại.
nghiêm trọng

43

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

7
git log --reverseđảo ngược lịch sử, vì vậy bạn phải sử dụng head -1thay vì tail -1để có được cam kết đầu tiên.
rubiii

4
Sẽ tốt nhất nếu git không bỏ qua -ncờ khi --reverseđược đưa ra.
Frederick Nord


6

Không phải là cách làm đẹp nhất tôi đoán:

git log --pretty=oneline | wc -l

Điều này cung cấp cho bạn một số sau đó

git log HEAD~<The number minus one>

1

git log --format="%h" | tail -1cung 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.

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.