Làm thế nào để tìm ra tổ tiên chung gần đây nhất của hai nhánh Git?
Làm thế nào để tìm ra tổ tiên chung gần đây nhất của hai nhánh Git?
Câu trả lời:
Bạn đang tìm kiếm git merge-base
. Sử dụng:
$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
git log master...HEAD
--octopus
cờ để có kết quả đúng. Rõ ràng nhưng sai git merge-base branch1 branch2 branch3
sẽ cung cấp cho bạn một cam kết, nhưng, như được mô tả trong phần Thảo luận trong các tài liệu, nó không nhất thiết là tổ tiên chung của cả ba nhánh.
git diff master...feature
hiển thị tất cả các cam kết mới của nhánh tính năng hiện tại (có thể là nhiều cam kết) của bạn.
man git-diff
tài liệu:
git diff A...B
giống như:
git diff $(git merge-base A B) B
nhưng ...
dễ hơn để gõ và nhớ.
Như Dave đã đề cập , trường hợp đặc biệt HEAD
có thể được bỏ qua. Vì thế:
git diff master...HEAD
giống như:
git diff master...
Đó là đủ nếu chi nhánh hiện tại là feature
.
Cuối cùng, hãy nhớ rằng vấn đề trật tự! Làm git diff feature...master
sẽ hiển thị những thay đổi mà master
không phải trên feature
.
Tôi muốn nhiều lệnh git sẽ hỗ trợ cú pháp đó, nhưng tôi không nghĩ chúng làm được. Và một số thậm chí có ngữ nghĩa khác nhau cho ...
: Sự khác biệt giữa dấu chấm kép ".." và dấu ba chấm "..." trong phạm vi cam kết Git là gì?
git diff master...
trong trường hợp đặc biệt khác vớiHEAD
git diff origin/branchname...
Như đã lưu ý trong câu trả lời trước, git merge-base
tác phẩm:
$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
nhưng nếu myfeature
là nhánh hiện tại, như thường thấy, bạn có thể sử dụng --fork-point
:
$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
Đối số này chỉ hoạt động trong các phiên bản đủ gần đây của git. Thật không may, nó không luôn luôn hoạt động, tuy nhiên, và không rõ tại sao. Vui lòng tham khảo các giới hạn được ghi nhận vào cuối câu trả lời này .
Để biết thông tin cam kết đầy đủ, hãy xem xét:
$ git log -1 $(git merge-base --fork-point develop)
git version 2.14.1.windows.1
. Chạy git merge-base --fork-point branch2
với một nhánh (với các cam kết riêng) mà tôi biết đã rẽ nhánh từ nhánh hiện tại không mang lại kết quả nào, trong khi git merge-base branch1 branch2
hiển thị chính xác điểm rẽ nhánh. Điều gì có thể là vấn đề?
branch2
rồi chạy git merge-base --fork-point branch1
.
gitk
, v.v. để xem cây trông như thế nào. Có lẽ bạn sẽ nhận được câu trả lời của bạn.
git merge-base branch1 branch2
. Nhưng điều kỳ lạ là --fork-point
không có gì cả. Bạn đã xác nhận nó hoạt động cho bạn như dự định?
Với gitk
bạn có thể xem hai nhánh đồ họa:
gitk branch1 branch2
Và sau đó thật dễ dàng để tìm thấy tổ tiên chung trong lịch sử của hai nhánh.