Git - วิธีค้นหาการกระทำครั้งแรกของสาขาเฉพาะ


93

ในแผนภูมิตัวอย่างต่อไปนี้:

A-B-C-D-E (master branch)
    \
     F-G-H (xxx branch)

ฉันกำลังมองหา F - คอมมิตแรกในสาขา xxx ฉันคิดว่าเป็นไปได้ด้วย:

git log xxx --not master

และการกระทำที่ระบุไว้สุดท้ายควรเป็น F เป็นวิธีการแก้ปัญหาที่ถูกต้องหรืออาจมีข้อเสียอยู่บ้าง?

ฉันรู้ว่ามีคำถามที่คล้ายกันใน stackoverflow แต่ไม่มีใครเสนอวิธีแก้ปัญหาดังกล่าวและฉันไม่แน่ใจว่าฉันทำถูกต้องหรือไม่


เป็นไปได้ที่จะซ้ำกันของstackoverflow.com/questions/6058308/…
nyzm

คำตอบ:


111
git log master..branch --oneline | tail -1

โดยที่ "สาขา" คือชื่อสาขาเฉพาะของคุณ ดอท - ดอทช่วยให้คุณได้รับค่าคอมมิชชั่นทั้งหมดที่สาขามีต้นแบบนั้นไม่มี tail -1ส่งกลับบรรทัดสุดท้ายจากเอาต์พุตก่อนหน้า


3
จะใช้ได้เฉพาะเมื่อมี `` branch '' อยู่ คุณจะทำอย่างไรถ้าสาขาถูกลบ?
Oz123

2
@ Oz123 branch สามารถแทนที่ด้วย ref ใดก็ได้เช่น HEAD หรือ sha1 หรือ tag แต่เห็นได้ชัดว่าคุณต้องการข้อมูลอ้างอิงบางอย่าง
Zitrax

3
ไม่ให้สิ่งที่ฉันคาดหวัง สาขาของฉัน (สาขาเก่า) ถูกรวมกลับไปที่มาสเตอร์แล้วซึ่งหมายความว่าคอมมิตทั้งหมดใน xxx อยู่ในมาสเตอร์แล้ว ยังคง - ฉันจำเป็นต้องรู้ว่าสิ่งใดเป็นคนแรกในสาขานั้น - หรือที่จริงแล้ว - ฉันต้องตรวจสอบประวัติการกระทำของสาขานั้นเพียงอย่างเดียว - ฉันไม่สนใจว่าพวกเขาจะเชี่ยวชาญหรือไม่
Motti Shneor

1
@MottiShneor ขึ้นอยู่กับว่าคุณรวมเข้าด้วยกันอย่างไรอาจเป็นเรื่องยุ่งยาก หากคุณทำการกรอไปข้างหน้าก็เหมือนกับว่าสาขานั้นไม่เคยมีอยู่จริง มิฉะนั้นคุณอาจสนใจคำตอบนี้ซึ่งแสดงวิธีต่างๆในการค้นหาจุดสาขา เมื่อคุณมีสาขาของคุณแล้ว SHA สามารถแทนที่masterได้และตราบใดที่สาขาของคุณยังไม่ถูกลบออกgit log <sha>..branch --oneline | tail -1ก็ยังควรให้ผลลัพธ์ที่คุณต้องการ
ND Geek

1
คุณสามารถใช้--reverseเพื่ออ่านบันทึกย้อนหลังด้วยสี ฯลฯ
Dominik

9

คุณควรใช้merge-baseฟังก์ชันที่ออกแบบมาเพื่อแก้ปัญหานี้:

git merge-base remotes/origin/<branch> develop 

ฉันไม่คิดว่าจะได้ผลถ้าคุณต้องการกลับไปที่จุดแยกเดิม หากคุณรวมการพัฒนาเป็น <branch> ฐานการผสานจะใหม่กว่าจุดแยกเดิม
Alexander Mills

5
นอกจากนี้สิ่งนี้จะไม่ชี้ไปที่ F แต่เป็นการกระทำในสาขาหลัก (แม้ว่าจะดูยากในรูปวาดของ OP แต่ดูเหมือนว่าจะเป็น B หรือ C)
RomainValeri


1

หากสาขาของคุณ (สาขาเก่า) รวมกลับไปที่ master อีกครั้งไม่ได้ให้ผลลัพธ์ที่คาดหวังฉันใช้สคริปต์ python เพื่อค้นหารหัสการคอมมิตสาขาเริ่มต้น

git rev-list - ชุดการเปลี่ยนแปลงแม่ลูกแรก

- ผู้ปกครองคนแรกติดตามเฉพาะผู้ปกครองคนแรกที่กระทำเมื่อเห็นการรวมคอมมิต

ทำซ้ำชุดการเปลี่ยนแปลงจากคำสั่งด้านบนจนกว่าจะพบสาขาแม่

def status_check(exec_command, exec_dir=None, background=False):
    if exec_dir:
        os.chdir(exec_dir)
    res = subprocess.Popen(exec_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if not background:
        result = res.communicate()
    return result



def findNewBranchCommits(changeset=None):
    cmd = "git rev-list --first-parent "+ changeset
    rev_list = status_check(cmd,self.module_dir)
    rev_list = str(rev_list[0]).split('\n')
    rev_list = list(filter(None, rev_list))
    for x in rev_list:                      # Iterate until branch base point
        rev_cmd = "git branch --contains " + x
        rev_cmd = status_check(rev_cmd,self.module_dir)
        rev_cmd = str(rev_cmd[0]).split('\n')
        if(len(rev_cmd) > 2): 
            print "First Commit in xxx branch",x
            break

findNewBranchCommits(changeset)

0
git cherry master -v | tail -1   

อย่างไรก็ตามสิ่งนี้จะให้การคอมมิตครั้งแรกกับสาขา xxx ที่ไม่ได้อยู่ในมาสเตอร์ไม่ใช่การคอมมิตครั้งแรกในสาขา xxx เลยทีเดียว อย่างหลังจะเป็นเรื่องยากหากสาขา xxx ถูกลบและ / หรือสร้างขึ้นใหม่อย่างน้อยหนึ่งครั้ง ในกรณีนี้คุณสามารถลองทำสิ่งต่อไปนี้:

git reflog | grep checkout | grep xxx | tail -1   

3
คุณหมายถึงเขียนhead -n 1แทนtail -1? tail -1ส่งคืนการกระทำล่าสุดแทนที่จะเป็นครั้งแรก
Nelu


-1

git rev-list --ancestry-path $(git merge-base master xxx)..xxx | tail -1


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