ใช้งานครั้งแรกgit remote update
เพื่อนำการอ้างอิงระยะไกลของคุณให้ทันสมัย จากนั้นคุณสามารถทำสิ่งหนึ่งในหลาย ๆ อย่างเช่น:
git status -uno
จะบอกคุณว่าสาขาที่คุณกำลังติดตามอยู่ข้างหน้าข้างหลังหรือแยกจากกัน ถ้ามันไม่พูดอะไรเลยโลคอลและรีโมตก็เหมือนกัน
git show-branch *master
จะแสดงการกระทำในสาขาทั้งหมดที่มีชื่อลงท้ายด้วย 'master' (เช่นmasterและorigin / master )
หากคุณใช้-v
กับgit remote update
( git remote -v update
) คุณจะเห็นว่าสาขาใดได้รับการอัปเดตดังนั้นคุณไม่จำเป็นต้องมีคำสั่งเพิ่มเติมอีก
อย่างไรก็ตามดูเหมือนว่าคุณต้องการทำสิ่งนี้ในสคริปต์หรือโปรแกรมและจบลงด้วยค่าจริง / เท็จ ถ้าเป็นเช่นนั้นมีหลายวิธีในการตรวจสอบความสัมพันธ์ระหว่างHEADปัจจุบันที่คุณมอบหมายกับหัวหน้าสาขาที่คุณกำลังติดตามแม้ว่าจะมีผลลัพธ์ที่เป็นไปได้สี่ประการคุณจึงไม่สามารถลดความมันลงไปเป็นคำตอบใช่ / ไม่ใช่ อย่างไรก็ตามหากคุณพร้อมที่จะทำpull --rebase
คุณสามารถรักษา "local is behind" และ "local is diverged" เป็น "need to pull" และอีกสองคนเป็น "ไม่จำเป็นต้องดึง"
คุณสามารถรับรหัสการกระทำของการอ้างอิงใด ๆ ที่ใช้git rev-parse <ref>
ดังนั้นคุณสามารถทำเช่นนี้กับต้นแบบและที่มา / ต้นแบบและเปรียบเทียบได้ ถ้าพวกมันเท่ากันกิ่งก็เหมือนกัน หากพวกเขาไม่เท่ากันคุณต้องการรู้ว่าใครอยู่ข้างหน้า การใช้git merge-base master origin/master
จะบอกบรรพบุรุษของทั้งสองสาขาและหากพวกเขาไม่ได้แยกสิ่งนี้จะเป็นสิ่งเดียวกับที่อื่น หากคุณได้รับรหัสที่แตกต่างกันสามรหัสสาขาจะแตกต่างกันไป
ในการดำเนินการอย่างถูกต้องเช่นในสคริปต์คุณต้องสามารถอ้างถึงสาขาปัจจุบันและสาขาระยะไกลที่ติดตามอยู่ ฟังก์ชันการตั้งค่าพรอมต์ bash /etc/bash_completion.d
มีรหัสที่เป็นประโยชน์บางอย่างสำหรับรับชื่อสาขา อย่างไรก็ตามคุณอาจไม่จำเป็นต้องได้รับชื่อจริง Git มีการจดชวเลขอย่างเป็นระเบียบเพื่ออ้างถึงกิ่งก้านและความมุ่งมั่น (ดังที่บันทึกไว้ในgit rev-parse --help
) โดยเฉพาะอย่างยิ่งคุณสามารถใช้@
สำหรับสาขาปัจจุบัน (สมมติว่าคุณไม่ได้อยู่ในสถานะแยกหัว) และ@{u}
สำหรับสาขาต้นน้ำ (เช่นorigin/master
) ดังนั้นgit merge-base @ @{u}
จะส่งคืน (แฮชของ) กระทำที่สาขาปัจจุบันและความแตกต่างของต้นน้ำgit rev-parse @
และgit rev-parse @{u}
จะให้แฮชของทั้งสองเคล็ดลับ สามารถสรุปได้ในสคริปต์ต่อไปนี้:
#!/bin/sh
UPSTREAM=${1:-'@{u}'}
LOCAL=$(git rev-parse @)
REMOTE=$(git rev-parse "$UPSTREAM")
BASE=$(git merge-base @ "$UPSTREAM")
if [ $LOCAL = $REMOTE ]; then
echo "Up-to-date"
elif [ $LOCAL = $BASE ]; then
echo "Need to pull"
elif [ $REMOTE = $BASE ]; then
echo "Need to push"
else
echo "Diverged"
fi
หมายเหตุ:คอมไพล์รุ่นเก่ากว่าไม่อนุญาต@
ด้วยตัวเองดังนั้นคุณอาจต้องใช้@{0}
แทน
บรรทัดUPSTREAM=${1:-'@{u}'}
ช่วยให้คุณเลือกที่จะส่งผ่านสาขาต้นน้ำอย่างชัดเจนในกรณีที่คุณต้องการตรวจสอบกับสาขาระยะไกลที่แตกต่างจากสาขาระยะไกลที่กำหนดไว้สำหรับสาขาปัจจุบัน นี้มักจะเป็นในรูปแบบremotename / BRANCHNAME หากไม่ได้ระบุพารามิเตอร์ไว้ค่าดีฟอลต์จะ@{u}
เป็น
สคริปต์จะถือว่าคุณได้ทำgit fetch
หรือgit remote update
ก่อนเพื่อทำให้สาขาการติดตามเป็นปัจจุบัน ฉันไม่ได้สร้างสิ่งนี้ลงในสคริปต์เพราะมีความยืดหยุ่นมากกว่าที่จะสามารถทำการดึงข้อมูลและการเปรียบเทียบเป็นการดำเนินการแยกตัวอย่างเช่นถ้าคุณต้องการเปรียบเทียบโดยไม่ดึงข้อมูลเพราะคุณดึงข้อมูลมาแล้วเมื่อเร็ว ๆ นี้