วิธีการหาบรรพบุรุษร่วมกันล่าสุดของสองสาขา Git?
วิธีการหาบรรพบุรุษร่วมกันล่าสุดของสองสาขา Git?
คำตอบ:
git merge-base
คุณกำลังมองหา การใช้งาน:
$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
git log master...HEAD
--octopus
ธงเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง ชัดเจน - ผิด แต่git merge-base branch1 branch2 branch3
จะทำให้คุณมีความมุ่งมั่น แต่ตามที่อธิบายไว้ในส่วนการสนทนาในเอกสารนั้นไม่จำเป็นต้องเป็นบรรพบุรุษร่วมกันของทั้งสามสาขา
git diff master...feature
แสดงการกระทำใหม่ทั้งหมดของสาขาฟีเจอร์ปัจจุบันของคุณ
man git-diff
เอกสารที่:
git diff A...B
เหมือนกับ:
git diff $(git merge-base A B) B
แต่การ...
พิมพ์และจดจำง่ายกว่า
ดังที่เดฟกล่าวถึงกรณีพิเศษที่HEAD
สามารถละเว้นได้ ดังนั้น:
git diff master...HEAD
เหมือนกับ:
git diff master...
feature
ซึ่งเป็นพอถ้าสาขาปัจจุบันคือ
ในที่สุดจำคำสั่งนั้นสำคัญ! การทำเช่นgit diff feature...master
นั้นจะแสดงการเปลี่ยนแปลงที่master
ไม่ได้เปิดอยู่feature
ไม่ได้อยู่ใน
ฉันหวังว่าคำสั่ง git จะรองรับไวยากรณ์นั้น แต่ฉันไม่คิดว่าพวกเขาทำ และบางคนก็มีความหมายที่แตกต่างกันสำหรับ...
: อะไรคือความแตกต่างระหว่าง double-dot ".. " และ triple-dot "... " ใน Git
git diff master...
ในกรณีพิเศษที่แตกต่างHEAD
git diff origin/branchname...
ดังที่ระบุไว้ในคำตอบก่อนหน้านี้git merge-base
ทำงาน:
$ git merge-base myfeature develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
แต่ถ้าmyfeature
เป็นสาขาปัจจุบันตามปกติคุณสามารถใช้ use --fork-point
:
$ git merge-base --fork-point develop
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2
อาร์กิวเมนต์นี้ใช้ได้กับ git รุ่นล่าสุดเท่านั้น อย่างไรก็ตามมันไม่ได้ผลเสมอไปและไม่ชัดเจนว่าทำไม โปรดดูข้อ จำกัด ที่ระบุไว้ท้ายคำตอบนี้
สำหรับข้อมูลการส่งแบบเต็มโปรดพิจารณา:
$ git log -1 $(git merge-base --fork-point develop)
git version 2.14.1.windows.1
ฉันมี ทำงานgit merge-base --fork-point branch2
กับสาขา(ด้วยความมุ่งมั่นของตัวเอง)ที่ฉันรู้ได้แยกจากสาขาปัจจุบันไม่ได้ผลใด ๆ ในขณะที่git merge-base branch1 branch2
แสดงให้เห็นถึงจุดแยก มีปัญหาอะไร
branch2
git merge-base --fork-point branch1
gitk
ฯลฯ เพื่อดูว่าทรีมีลักษณะอย่างไร บางทีคุณอาจได้รับคำตอบ
git merge-base branch1 branch2
ฉันสามารถติดตามเส้นทางและหาบรรพบุรุษร่วมกันซึ่งตรงกับผลการ แต่สิ่งที่แปลกคือ--fork-point
ไม่ทำอะไรเลย คุณได้รับการยืนยันการทำงานสำหรับคุณตามที่ตั้งใจไว้?
ด้วยgitk
คุณสามารถดูสองสาขากราฟิก:
gitk branch1 branch2
แล้วมันก็ง่ายที่จะหาบรรพบุรุษร่วมกันในประวัติศาสตร์ของทั้งสองสาขา