สาขาการติดตามคืออะไร


173

บางคนสามารถอธิบาย "สาขาการติดตาม" ตามที่ใช้กับคอมไพล์ได้หรือไม่

นี่คือคำจำกัดความจากgit-scm.com :

'การติดตามสาขา' ใน Git เป็นสาขาท้องถิ่นที่เชื่อมต่อกับสาขาระยะไกล เมื่อคุณกดและดึงที่สาขานั้นมันจะผลักและดึงไปยังสาขาระยะไกลที่เชื่อมต่อโดยอัตโนมัติ

ใช้สิ่งนี้หากคุณดึงจากสาขาต้นน้ำเดียวกันไปยังสาขาใหม่เสมอและหากคุณไม่ต้องการใช้ "git pull" อย่างชัดเจน

น่าเสียดายที่การเป็นมือใหม่กับคอมไพล์และมาจาก SVN คำจำกัดความนั้นไม่สมเหตุสมผลเลยสำหรับฉัน

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

มีคนช่วยสอนฉันให้เป็นภาษาอังกฤษได้ไหม


6
หมายเหตุคำศัพท์หนึ่งคำ: คำว่าติดตามใน Git นั้นมีมากเกินไป ไฟล์บางไฟล์มีการติดตามและบางไฟล์ไม่ได้ติดตาม ชื่อสาขาบางชื่อเรียกว่าการติดตามระยะไกล และคุณสามารถใช้--trackตัวเลือกเพื่อสร้างสาขา (ภายใน) ที่มีหนึ่งในสาขาที่ติดตามระยะไกลเหล่านี้ตั้งค่าเป็นอัปสตรีม คำศัพท์มีการพัฒนาค่อนข้างระหว่างปีพ. ศ. 2549 และ 2562 ดังนั้นบางครั้งคนที่แตกต่างกันอาจหมายถึงบางสิ่งที่แตกต่างกันไปตามแต่ละคำ
torek

ผมเองขอแนะนำให้ใช้วลีระยะไกลติดตามชื่อในสถานที่ห่างไกลการติดตามสาขาในส่วนหนึ่งเพราะคำว่าสาขานอกจากนี้ยังมีมากเกินไปมากกว่า ชื่อระยะไกลติดตามเป็นคนที่มีลักษณะเหมือนorigin/masterพวกเขากำลังอยู่ในพื้นที่เก็บข้อมูลของคุณ แต่พวกเขามีวิธีที่ Git ของคุณในการจดจำชื่อสาขาเท่าที่เห็นในบางอื่น ๆที่เก็บ Git originมากกว่าที่ จากนั้นถ้าคุณใช้คำต้นน้ำซึ่งเป็นระยะที่ทันสมัยมากขึ้นที่จะบอกว่าคุณmasterได้origin/masterตั้งเป็นของต้นน้ำคุณสามารถหลีกเลี่ยงความสับสนศัพท์นี้
torek

คำตอบ:


141

หนังสือ ProGitมีคำอธิบายที่ดีมาก :

ติดตามสาขา

การตรวจสอบสาขาท้องถิ่นจากสาขาระยะไกลจะสร้างสิ่งที่เรียกว่าสาขาการติดตามโดยอัตโนมัติ การติดตามสาขาคือสาขาท้องถิ่นที่มีความสัมพันธ์โดยตรงกับสาขาระยะไกล หากคุณอยู่ในสาขาการติดตามและประเภทgit pushGit จะทราบเซิร์ฟเวอร์และสาขาที่จะผลักดันโดยอัตโนมัติ นอกจากนี้การทำงานgit pullในขณะที่อยู่ในหนึ่งในสาขาเหล่านี้จะดึงการอ้างอิงระยะไกลทั้งหมดแล้วรวมเข้าด้วยกันในสาขาระยะไกลที่เกี่ยวข้องโดยอัตโนมัติ

เมื่อคุณโคลนที่เก็บโดยทั่วไปจะสร้างสาขาหลักที่ติดตามต้นทาง / ต้นแบบโดยอัตโนมัติ นั่นเป็นเหตุผลgit pushและgit pullทำงานนอกกรอบโดยไม่มีข้อโต้แย้งอื่น ๆ อย่างไรก็ตามคุณสามารถตั้งค่าสาขาการติดตามอื่นได้หากต้องการ - สาขาที่ไม่ได้ติดตามสาขาที่มาและไม่ติดตามสาขาหลัก git checkout -b [branch] [remotename]/[branch]กรณีที่เรียบง่ายเป็นตัวอย่างที่คุณเพิ่งเห็นวิ่ง หากคุณมี Git เวอร์ชัน 1.6.2 หรือใหม่กว่าคุณสามารถใช้--trackชวเลขได้:

$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "serverfix"

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

$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch refs/remotes/origin/serverfix.
Switched to a new branch "sf"

ตอนนี้สาขาในท้องถิ่นของคุณโดยอัตโนมัติจะผลักดันและดึงจากsforigin/serverfix

โบนัส: git statusข้อมูลเพิ่มเติม

ด้วยสาขาการติดตามgit statusจะบอกคุณว่าคุณติดตามสาขาของคุณไปไกลแค่ไหน - มีประโยชน์ที่จะเตือนคุณว่าคุณยังไม่ได้ผลักดันการเปลี่ยนแปลงของคุณ! ดูเหมือนว่านี้:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

หรือ

$ git status
On branch dev
Your branch and 'origin/dev' have diverged,
and have 3 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)


21
เพียงแค่ต้องการล้างข้อมูลนี้: "การตรวจสอบสาขาท้องถิ่นจากสาขาระยะไกลจะสร้างสิ่งที่เรียกว่าสาขาการติดตามโดยอัตโนมัติ" นั่นทำให้เข้าใจผิด สาขาที่คุณสร้างจะไม่มีการติดตามหากไม่มีตัวเลือก - แทร็ก
JohnO

@JohnO, อาจต้องการที่จะทำเช่นนั้นกับผู้ชาย Pro Git หนังสือทั้งเล่มเป็นผลมาจากความร่วมมือแก้ไขครั้งใหญ่ IIRC
Assaf Lavie

2
@ JohnO ตาม: sbf5.com/~cduan/technical/git/git-4.shtml --track จะเปิดใช้งานตามค่าเริ่มต้นดังนั้นจึงไม่จำเป็น
Hank Lin

50

ด้านล่างนี้เป็นบันทึกการเรียนรู้ส่วนบุคคลของฉันในสาขาการติดตาม GIT หวังว่าจะเป็นประโยชน์สำหรับผู้เข้าชมในอนาคต:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


การติดตามสาขาและ "เรียก git":

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


ขอบคุณสำหรับบันทึก! คุณจะแบ่งปันสิ่งเหล่านี้ถ้าเป็นไปได้ไหม? ขอบคุณ;
Aditya

@Aditya: คำถามนี้มีไว้สำหรับติดตามสาขาและฉันได้โพสต์บันทึกย่อทั้งหมดของฉันในหัวข้อนี้ หากฉันพบคำถามที่เกี่ยวข้องอื่น ๆ ที่ฉันสามารถโพสต์บันทึก GIT อื่น ๆ ของฉันได้ฉันก็ยินดีที่จะทำเช่นนั้น
hagrawal

ขอบคุณ! สิ่งที่ฉันหมายถึงคือการโพสต์ไว้ในบล็อกของคุณหรือบางสิ่งบางอย่าง :) ขอบคุณอีกครั้งสำหรับโน้ตที่ดี!
Aditya

@Aditya: อ่าฉันเข้าใจแล้ว ตอนนี้คุณชัดเจนในสิ่งที่คุณหมายถึง ฉันกำลังวิ่งเล่นอยู่บนเว็บไซต์ของฉัน แต่ก็ยังสร้างมันขึ้นมาเพื่อตัวฉันเอง
hagrawal

43

หนังสือ Pro Git กล่าวถึง :

สาขาการติดตามเป็นสาขาท้องถิ่นที่มีความสัมพันธ์โดยตรงกับสาขาระยะไกล

ไม่แน่นอน คำถาม SO " การมีความเข้าใจยากgit-fetch " รวมถึง:

ไม่มีแนวคิดดังกล่าวของสาขาการติดตามในท้องถิ่นเพียงสาขาการติดตามระยะไกล
ดังนั้นจึงorigin/masterเป็นสาขาการติดตามระยะไกลสำหรับmasterในoriginrepo

แต่ที่จริงแล้วเมื่อคุณสร้างความสัมพันธ์สาขาต้นน้ำระหว่าง:

  • สาขาท้องถิ่นเช่น master
  • และสาขาติดตามระยะไกลเช่น origin/master

จากนั้นคุณสามารถพิจารณาmasterเป็นสาขาการติดตามท้องถิ่น : มันติดตามสาขาการติดตามระยะไกล origin/masterซึ่งในที่สุดก็ติดตามสาขาต้นแบบของrepo ต้นน้ำ origin

ข้อความแสดงแทน


ภาพชัดเจน: คอมพิวเตอร์ของฉันคือ 2 มุ่งมั่นก่อนที่จะกำเนิด นั่นคือสิ่งที่ทั้งสองหลุดจากการเป็นเจ้านาย รูปภาพ: progit.org/book/ch3-5.html
idbrii

ฉันกำลังตีความอย่างถูกต้อง: หากฉันตั้งค่ารีโมตในเครื่องสำหรับต้นทางและอัปสตรีมสาขาหลักของฉันในพื้นที่จะติดตามต้นทางโดยตรงและอัปสตรีมทางอ้อม เช่น: เมื่อใดฉันgit statusจะได้รับข้อความยืนยันการคอมมิชชันด้วยความเคารพทั้งที่มาและต้นน้ำ repos (การตั้งค่า: ฉันลอกแบบ repo ของใครบางคนในพื้นที่ผลักโคลนของฉันไปที่ repo ใหม่ในบัญชี GitHub ของฉันและตั้งค่าเริ่มต้นและรีโมตสตรีมไปที่ repo github ของฉันและ repo cloned ตามลำดับ)
SherylHohman

3
@SherylHohman No: สาขาในท้องที่จะไม่ติดตามสิ่งที่ "โดยตรง" หรือ "ทางอ้อม" มันจะติดตามสาขาการติดตามระยะไกลที่คุณจะกำหนดให้มัน ในกรณีของส้อมวิธีปฏิบัติที่ดีที่สุดคือการติดตามอัปสตรีม (repo ดั้งเดิม) สำหรับสาขาทั่วไป (เช่นมาสเตอร์) และแทร็กต้นทาง (รีโมตแยกของคุณ) สำหรับสาขาใหม่ (PR ของคุณหรือสาขาฟีเจอร์): ดูstackoverflow.com/ a / 21847690/6309
VonC

2
@VonC - คำสั่ง "ไม่มีแนวคิดดังกล่าวของสาขาการติดตามในท้องถิ่นเพียงสาขาการติดตามระยะไกล" น่าสนใจ b / c มีคำศัพท์ที่ขัดแย้งกันอยู่รอบ ๆ กิ่งไม้ ลิงค์นี้มักจะอ้างอิงweb.archive.org/web/20130419172453/http://www.gitguys.com/…แยกแยะระหว่าง "การติดตามสาขา" และ "สาขาการติดตามระยะไกล" พวกเขาเรียกต้นกำเนิด / มาสเตอร์ว่า "สาขาการติดตามระยะไกล" - ฉันเห็นด้วย - แต่พวกเขาก็เรียก "มาสเตอร์" เป็น "สาขาการติดตาม" ด้วย การติดตามหลักคืออะไร พวกเขาผิดหรือเป็นปัญหาคำศัพท์?
Howiecamp

2
@Howiecamp สิ่งที่พวกเขาเรียกว่า "การติดตามสาขาที่เรียกว่า master" นั้นเป็นเพียงผู้เชี่ยวชาญสาขาท้องถิ่นที่มีต้นกำเนิด / ต้นแบบการติดตามระยะไกลที่เกี่ยวข้องที่นี่เพื่อจดจำ SHA1 ล่าสุดที่ดึงมาจากแหล่งกำเนิดเกี่ยวกับสาขาต้นแบบระยะไกล ดังนั้นจึงเป็น "ทางลัด" สำหรับการกำหนด "สาขาท้องถิ่นที่มีสาขาอัป
สตรีม

7

นี่คือวิธีที่ฉันเพิ่มสาขาการติดตามเพื่อให้ฉันสามารถดึงมันจากสาขาใหม่ของฉัน:

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