Git: ค้นหาบรรพบุรุษที่พบบ่อยที่สุดของสองสาขา


844

วิธีการหาบรรพบุรุษร่วมกันล่าสุดของสองสาขา Git?


3
กำหนดล่าสุด: เวลาจริงของโลกจำนวนการกระทำการวัดอื่น ๆ
Ciro Santilli 冠状病毒审查六四事件法轮功

2
ที่เกี่ยวข้อง (การรวมข้ามกากบาด): stackoverflow.com/questions/26370185/…
jub0bs

1
@CiroSantilli 新疆改造中心 996ICU 六四事件มันเหมือนกันในเมตริกใด ๆ ใช่ไหม?
YakovL

@YakovL ฉันเชื่อว่าไม่ใช่เพราะการแตกแขนงและเนื่องจากคุณสามารถตั้งค่าวันที่ส่งคำสั่งบนออบเจกต์การกระทำของคุณเอง: วันที่นั้นเองนั้นไม่ใช่สิ่งที่คุณต้องการ
Ciro Santilli 冠状病毒审查六四事件法轮功

1
@CiroSantilli 新疆改造中心 996ICU 六四事件ดูเหมือนว่าฉันจะแตกต่างกันหากก่อนคอมมิชชันสามัญครั้งสุดท้ายในต้นไม้มีความมุ่งมั่นที่มีการประทับเวลาที่เก่ากว่า คุณช่วยยกตัวอย่างเล็กน้อยได้หรือไม่
YakovL

คำตอบ:


1019

git merge-baseคุณกำลังมองหา การใช้งาน:

$ git merge-base branch2 branch3
050dc022f3a65bdc78d97e2b1ac9b595a924c3f2

85
โปรดทราบว่านี่จะพบบรรพบุรุษที่พบบ่อยที่สุด ... ซึ่งฉันเชื่อว่าเป็นสิ่งที่ผู้ถามต้องการดังนั้น +1 เพียงสังเกตในกรณีที่ใครมาที่นี่พยายามหาบรรพบุรุษร่วมที่เก่าแก่ที่สุด (อย่างที่ฉันทำ) - ซึ่งดูได้ที่: stackoverflow.com/questions/1527234/…
lindes

16
@funroll: หรือจดชวเลขสำหรับ:git log master...HEAD
CB Bailey

17
@lindes บรรพบุรุษร่วมที่เก่าแก่ที่สุดจะไม่กระทำการเริ่มต้น?
Thorbjørn Ravn Andersen

8
@ ThorbjørnRavnAndersenใช่ฉันคิดว่ามันเป็นอย่างนั้น ... ความยากลำบากในการอธิบายมาพร้อมกับความจริงที่ว่าคอมไพล์ใช้กราฟ Directed Acyclic แต่ก็มักจะคิดว่าเป็นต้นไม้ซึ่งในทางเทคนิคแล้วไม่ใช่ เพื่อความระมัดระวังในถ้อยคำของฉันฉันกำลังพูดถึงกรณีที่คุณต้องการให้ผู้ปกครองของตัวอย่างแรกของการ "แยก" แยก ... เนื่องจากพวกเขาอาจมีหลายจุดที่พวกเขารวมใหม่และแยกอีกครั้งนี่คือ "ที่เก่าแก่ที่สุด" ของสิ่งเหล่านี้ แต่ไม่ได้เป็นบรรพบุรุษที่เก่าแก่ที่สุดซึ่งเป็น (ฉันคิดว่า) มักจะกระทำครั้งแรก
lindes

5
ในขณะที่คำถามนี้เกี่ยวกับการหาบรรพบุรุษร่วมกันของสองสาขาอย่างเคร่งครัดใครก็ตามที่ต้องการบรรพบุรุษร่วมกันของสามสาขาขึ้นไปควรทราบว่าพวกเขาต้องผ่าน--octopusธงเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง ชัดเจน - ผิด แต่git merge-base branch1 branch2 branch3จะทำให้คุณมีความมุ่งมั่น แต่ตามที่อธิบายไว้ในส่วนการสนทนาในเอกสารนั้นไม่จำเป็นต้องเป็นบรรพบุรุษร่วมกันของทั้งสามสาขา
Mark Amery

46

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


8
หรือเพียงแค่git diff master...ในกรณีพิเศษที่แตกต่างHEAD
เดฟ

"... " ใช้งานไม่ได้สำหรับฉันใน powershell, ตลกมันทำงานใน git console บางที repo ไม่สมบูรณ์ git diff $ (git merge-base AB) B ทำและเนื่องจากฉันใหม่สำหรับ git ฉันสงสัยนิดหน่อยว่านี่อาจรวมกิ่งไม้ได้ :)
464 Moiz Ahmed

1
ว้าว. น่าทึ่งมาก และถ้าสาขาที่คุณต้องการไม่มีอยู่ใน repo ท้องถิ่นของคุณเพราะคุณไม่เคยตรวจสอบมันคุณสามารถทำได้git diff origin/branchname...
Mark Ch

25

ดังที่ระบุไว้ในคำตอบก่อนหน้านี้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แสดงให้เห็นถึงจุดแยก มีปัญหาอะไร
ADTC

@ADTC ชำระเงินแล้ววิ่งbranch2 git merge-base --fork-point branch1
คิวเมนตัส

@ADTC ใช้ตัวแสดงการคอมมิชชันแบบกราฟิกgitkฯลฯ เพื่อดูว่าทรีมีลักษณะอย่างไร บางทีคุณอาจได้รับคำตอบ
คิวเมนตัส

ฉันไม่เห็นอะไรแปลก ๆ เกี่ยวกับต้นไม้ในขณะที่ฉันเห็นมันแบบกราฟิก git merge-base branch1 branch2ฉันสามารถติดตามเส้นทางและหาบรรพบุรุษร่วมกันซึ่งตรงกับผลการ แต่สิ่งที่แปลกคือ--fork-pointไม่ทำอะไรเลย คุณได้รับการยืนยันการทำงานสำหรับคุณตามที่ตั้งใจไว้?
ADTC

1
ฉันได้รับเหมือนกันที่ @ADTC คำสั่ง 'บันทึก git -1 $ (git merge-base --fork-point anotherBranch)' ไม่แสดงผลลัพธ์ใด ๆ โดยใช้ git version 2.16.2.windows.1
masinger

10

ด้วยgitkคุณสามารถดูสองสาขากราฟิก:

gitk branch1 branch2

แล้วมันก็ง่ายที่จะหาบรรพบุรุษร่วมกันในประวัติศาสตร์ของทั้งสองสาขา


6
ไม่ใช่ทุกสิ่งที่สามารถทำได้ด้วยสายตาในทุกกรณี มีเหตุผลว่าทำไมสิ่งต่าง ๆ จึงจำเป็นต้องมีการเขียนโปรแกรมแบบอัตโนมัติ
ADTC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.