Mọi thứ, như bạn lưu ý, không đơn giản như vậy trong Git. Đặc biệt, định nghĩa "trước" và "sau" cần làm rõ hơn một chút.
Nếu bạn tin tưởng những người cam kết vào kho lưu trữ của bạn không gây rối với dấu thời gian, và bạn đã biết cả hai cam kết trên cùng một chi nhánh, bạn có thể so sánh dấu thời gian của các cam kết và chỉ xem cái nào trước đó. Sử dụng lệnh sau cho mỗi cam kết và so sánh kết quả.
git log -1 --format='%ci' <commit>
Với Git, bạn không nhất thiết có thể tin tưởng dấu thời gian, tuy nhiên, không giống như Subversion không có kho lưu trữ trung tâm có công việc sản xuất chúng. Bạn cũng không thể chắc chắn rằng hai cam kết trên cùng một nhánh (mặc dù vấn đề đó cũng tồn tại với Subversion).
Để tránh những vấn đề đó, hãy nói về việc một cam kết có phải là tổ tiên của tổ chức khác hay không, thay vì cho dù nó là trước hay sau nó.Trong cam kết đồ thị sau, B và C là tổ tiên của A, trong khi B không phải là tổ tiên của C hay ngược lại:
B (master)
| C (branch)
|/
A (root)
Để xác định xem cam A là tổ tiên của cam kết B, sử dụng lệnh sau đây (dựa trên an article at git ready):
git rev-list <commitA> | grep $(git rev-parse <commitB>)
các danh sách phần đầu tiên tất cả các cam kết đó là tổ tiên của cam A; phần thứ hai nhận được băm đầy đủ của cam kết B, sau đó tìm kiếm danh sách tổ tiên cho cam kết đó. Nếu bạn thấy bất kỳ đầu ra nào, commit A là một tổ tiên của commit B. Hoán đổi các đối số để làm việc nếu commit A là một tổ tiên của commit B thay vào đó.
Biểu mẫu thứ hai này chậm hơn, nhưng cung cấp cho bạn sự chắc chắn tuyệt đối rằng một cam kết là tổ tiên của người khác.
Vậy dấu thời gian đại diện cho khi tôi làm git log -1 --format = '% ci'? Tôi chỉ cố hiểu một kịch bản khi tôi không thể tin vào dấu thời gian. –
Glide
@Glide: Dấu thời gian đó biểu thị thời gian thực hiện cam kết. Tuy nhiên, vì cam kết ban đầu được thực hiện trên kho lưu trữ cục bộ của nhà phát triển, nếu đồng hồ trên máy tính của họ sai hoặc họ sử dụng một mẹo như chơi với 'GIT_COMMITTER_DATE', dấu thời gian đó có thể không chính xác. –
Hey, lệnh hoạt động nhưng những gì bạn nói về cách nó hoạt động không chính xác. Lệnh git rev-list thực sự xác định xem commit B có phải là tổ tiên của commit hay không. Bạn nói "phần đầu tiên liệt kê tất cả các commit là tổ tiên của commit A". Mà nó dường như, từ một số thử nghiệm tôi chỉ làm. Vì vậy nếu bạn đang tìm kiếm thông qua danh sách đó cho một SHA cam kết, thì grep sẽ thành công IFF cam kết B là trong danh sách tổ tiên đó, tức là tổ tiên của cam kết A - đối lập với những gì bạn đã viết. – eeeeaaii