คอมไพล์ล่วงหน้า / หลังข้อมูลระหว่างอาจารย์และสาขา?


201

ผมได้สร้างสาขาสำหรับการทดสอบใน repo ท้องถิ่นของฉัน ( test-branch) Githubซึ่งผมผลักดันให้

ถ้าฉันไปที่Githubบัญชีของฉันและเลือกtest-branchมันมันจะแสดงข้อมูล:

This branch is 1 commit ahead and 2 commits behind master

คำถามของฉันคือ:

  1. ฉันจะแสดงข้อมูลนี้แบบโลคัลได้อย่างไร (เช่น: คำสั่งที่แสดงข้อมูลนี้บนเทอร์มินัลแทนที่จะต้องเปิดGithubดู)
  2. ฉันรู้ว่าฉันเห็นความแตกต่างระหว่างกิ่งไม้โดยใช้:

    git diff master..test-branch
    

    หรือใช้Meld(ซึ่งฉันชอบ):

    git difftool master..test-branch
    

    แต่ฉันสงสัยว่ามีวิธีการดูข้างหน้าและข้างหลังมุ่งมั่นแยกกันหรือไม่ IE: มีวิธีที่จะแสดงให้เห็นว่า1 มุ่งมั่นไปข้างหน้าด้วยตัวเองและจากนั้นทั้งสองมุ่งมั่นด้วยตัวเอง?



1
Git 2.5+ (Q2 2015) git for-each-ref --format="%(push:track)" refs/headsจะแนะนำ ดูคำตอบของฉันด้านล่าง
VonC

1
เนื่องจากฉันไม่พบคำถามนี้โดยใช้คำหลักที่ฉันกำลังจะเขียนฉันแค่ต้องการทราบว่าจำนวนนี้จะใช้ส่วนประกอบที่สัมพันธ์กัน (หรือ "ความแตกต่างของชุด")ระหว่างชุดของการคอมมิชชันที่ประกอบเป็นสาขาเหล่านั้น (และ จากนั้นนับองค์ประกอบ) หวังว่านี่จะทำให้มันเป็นดัชนีของเครื่องมือค้นหา
pmos

คำตอบ:


309

นี่เป็นเคล็ดลับที่ฉันพบว่าเปรียบเทียบสองสาขาและแสดงจำนวนการคอมมิตแต่ละสาขาที่อยู่ข้างหน้าของอีกฝ่าย (คำตอบทั่วไปสำหรับคำถามของคุณ 1):

สำหรับสาขาท้องถิ่น : git rev-list --left-right --count master...test-branch

สำหรับสาขาระยะไกล : git rev-list --left-right --count origin/master...origin/test-branch

สิ่งนี้ให้ผลลัพธ์ดังนี้:

1 7

ผลลัพธ์นี้หมายความว่า "เมื่อเทียบกับmaster, test-branchคือ 7 กระทำข้างหน้าและ 1 กระทำที่อยู่เบื้องหลัง."

นอกจากนี้คุณยังสามารถเปรียบเทียบสาขาท้องถิ่นกับสาขาระยะไกลได้เช่นorigin/master...masterเพื่อดูว่ามีจำนวนmasterสาขาที่ให้บริการสาขาอยู่ข้างหน้า / หลังสาขาระยะไกล


1
นี่เป็นทางออกที่ยอดเยี่ยมสำหรับฉันในการค้นหาว่าฉันสามารถลบสาขาหรือถ้ามันยังอยู่ข้างหน้าของการพัฒนา
Maverick1st

1
@ Maverick1st ใช่คำสั่งนี้มีประโยชน์อย่างยิ่งเมื่อคุณติดตามเวิร์กโฟลว์ gitflow (ซึ่งฉันเป็น)
user1834095

2
นี่เป็นกรณีที่ดีที่สุดสำหรับการใช้งานของฉันในการค้นหาว่าสาขาคุณลักษณะปัจจุบันของคุณอยู่หลังต้นแบบระยะไกล ( git rev-list --left-right --count origin/master...@) - หากผู้ใช้ทำgit fetchก่อน มีประโยชน์ในการป้องกันคำขอดึงจากสาขาที่ล้าสมัย
jakub.g

9
เพื่อตรวจสอบจำนวนมากเพียงแค่วิธีการกระทำที่อยู่เบื้องหลังเป็นสาขาปัจจุบัน:git rev-list --left-right --count origin/master...@ | cut -f1
jakub.g

8
@ jakub.g คุณไม่จำเป็นต้องตัดถ้าคุณใช้--left-onlyหรือ--right-only
jasonkarns

39

ก่อนอื่นเพื่อดูจำนวนการแก้ไขที่อยู่หลังเครื่องคุณควรทำgit fetchเพื่อให้แน่ใจว่าคุณมีข้อมูลล่าสุดจากระยะไกล

ผลลัพธ์เริ่มต้นของgit statusบอกคุณถึงจำนวนการแก้ไขที่คุณอยู่ข้างหน้าหรือข้างหลัง แต่โดยปกติฉันจะพบว่า verbose มากเกินไป:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

ฉันชอบgit status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

ในความเป็นจริงฉันนามแฝงสิ่งนี้เพียงเพื่อgit sและนี่คือคำสั่งหลักที่ฉันใช้สำหรับตรวจสอบสถานะ

หากต้องการดูความแตกต่างใน "การแก้ไขข้างหน้า" ของmasterฉันสามารถยกเว้น "เบื้องหลังการแก้ไข" จากorigin/master:

git diff master..origin/master^

หากต้องการดูความแตกต่างใน "เบื้องหลังการแก้ไข" ของorigin/masterฉันสามารถยกเว้น "การแก้ไขล่วงหน้า" จากmaster:

git diff origin/master..master^^

หากมีการแก้ไข 5 ครั้งข้างหน้าหรือข้างหลังอาจเป็นการง่ายกว่าที่จะเขียนดังนี้

git diff master..origin/master~5
git diff origin/master..master~5

UPDATE

หากต้องการดูการแก้ไขล่วงหน้า / หลังจะต้องกำหนดค่าสาขาเพื่อติดตามสาขาอื่น git push -u remotename branchnameสำหรับฉันนี้เป็นพฤติกรรมเริ่มต้นเมื่อฉันโคลนพื้นที่เก็บข้อมูลระยะไกลและหลังจากที่ผมผลักดันกิ่ง เวอร์ชั่นของฉันคือ 1.8.4.3 แต่มันก็ใช้งานได้นานเท่าที่ฉันจำได้

ในฐานะรุ่น 1.8 คุณสามารถตั้งค่าสาขาการติดตามดังนี้:

git branch --track test-branch

ตั้งแต่ 1.7 รุ่น, ไวยากรณ์แตกต่างกัน:

git branch --set-upstream test-branch

คุณใช้เวอร์ชั่นgitอะไร ฉันไม่สามารถทำซ้ำสิ่งที่คุณได้รับด้วยgit statusหรือgit status -sbไม่ ถ้าฉันลองคำสั่งอย่างใดอย่างหนึ่ง (หลังจากทำgit fetch) ฉันจะไม่ได้รับข้อมูลใด ๆ ในการกระทำข้างหน้า / หลัง
กาเบรียล

8
วิธีการของคุณเพื่อดูกระทำข้างหน้าและด้านหลังถูกนำไปใช้masterและorigin/masterและผมต้องการที่จะเห็น diffs เหล่านั้นและสาขาอื่นmaster test-branchคุณสามารถฟอร์แมตใหม่ตอบที่อยู่ปัญหานี้ได้หรือไม่?
กาเบรียล

ความแตกต่างของการ "แก้ไข" และ "ล่วงหน้า" จะใช้งานได้ก็ต่อเมื่อฉันใช้ 3 จุดระหว่างชื่อสาขา (ไม่ใช่ 2) และ ^ และ ^^ ดูเหมือนจะไม่สำคัญที่นี่เช่น: git diff master ... ต้นกำเนิด / หลัก git diff ต้นกำเนิด / ต้นแบบ ... หลักยังไงก็ตาม "สถานะ git -sb" นั้นมีประโยชน์มาก
Vituel

10

ด้วย Git 2.5+ ตอนนี้คุณมีตัวเลือกอื่นให้ดูล่วงหน้า / หลังสำหรับสาขาทั้งหมดที่กำหนดค่าให้กดไปที่สาขา

git for-each-ref --format="%(push:track)" refs/heads

ดูเพิ่มเติมได้ที่ "การดูความมุ่งมั่นของ Git ที่ไม่ได้ชำระ "


คุณสามารถทำสิ่งนี้กับสาขาปัจจุบันและสาขาติดตามระยะไกลได้หรือไม่
spex

@spex ใช่: สมบูรณ์refs/headsด้วยชื่อสาขาปัจจุบัน ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC

3

คุณยังสามารถใช้awkเพื่อทำให้สวยกว่าเดิมได้อีกเล็กน้อย:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

คุณสามารถสร้างนามแฝงที่ดึงต้นกำเนิดมาก่อนเสมอแล้วเปรียบเทียบกิ่ง

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"

1

หลังจากทำการดึงข้อมูล git แล้วคุณสามารถเรียกใช้สถานะ git เพื่อแสดงจำนวนการกระทำของสาขาในพื้นที่ที่อยู่ข้างหน้าหรือข้างหลังของเวอร์ชันระยะไกลของสาขา

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

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