TL; DR เวอร์ชัน: สาขาการติดตามระยะไกลorigin/masterเคยมีอยู่ แต่ไม่ได้อยู่ในขณะนี้ดังนั้นสาขาในท้องถิ่นsourceกำลังติดตามสิ่งที่ไม่มีอยู่ซึ่งน่าสงสัยที่สุด - หมายถึงฟีเจอร์ Git ที่แตกต่างไม่สามารถทำอะไรให้คุณได้ - และ Git เตือนคุณเกี่ยวกับเรื่องนี้ คุณเข้ากันได้ดีโดยไม่ต้องมีคุณลักษณะ "การติดตามอัปสตรีม" ตามที่ตั้งใจดังนั้นจึงขึ้นอยู่กับคุณว่าจะเปลี่ยนแปลงอะไร
สำหรับการตั้งค่าอัปสตรีมอื่นให้ดูที่เหตุใดฉันจึงต้อง "คอมไพล์พุช - เซ็ตอัพสตรีมต้นกำเนิด <branch>"
คำเตือนนี้เป็นสิ่งใหม่ใน Git ปรากฏตัวครั้งแรกใน Git 1.8.5 บันทึกย่อประจำรุ่นมีหัวข้อย่อยสั้น ๆ เกี่ยวกับมัน
- "git branch -v -v" (และ "git status") ไม่ได้แยกความแตกต่างระหว่างสาขาที่ไม่ได้ขึ้นอยู่กับสาขาอื่นสาขาที่ซิงค์กับสาขาอัปสตรีมและสาขาที่กำหนดค่าด้วยอัปสตรีม สาขาที่ไม่มีอยู่อีกต่อไป
ในการอธิบายความหมายคุณต้องทราบเกี่ยวกับ "รีโมต", "สาขาการติดตามระยะไกล" และวิธีที่ Git จัดการ "ติดตามอัพสตรีม" ( สาขาการติดตามระยะไกลเป็นคำที่มีข้อบกพร่องมาก - ฉันเริ่มใช้ชื่อการติดตามระยะไกลแทนซึ่งฉันคิดว่าเป็นการปรับปรุงเล็กน้อยด้านล่างแม้ว่าฉันจะใช้ "สาขาการติดตามระยะไกล" เพื่อความสอดคล้องกับเอกสาร Git )
"รีโมท" แต่ละรายการเป็นเพียงชื่อเหมือนoriginหรือoctopressในกรณีนี้ วัตถุประสงค์ของพวกเขาคือการบันทึกสิ่งต่างๆเช่น URL แบบเต็มของสถานที่ที่คุณgit fetchหรือgit pullอัปเดต เมื่อคุณใช้1 Git ไปที่รีโมตนั้น (โดยใช้ URL ที่บันทึกไว้) และนำเสนอชุดการอัปเดตที่เหมาะสม นอกจากนี้ยังบันทึกการอัพเดตโดยใช้ "กิ่งติดตามระยะไกล"git fetch remote,
"การติดตามระยะไกลสาขา" (หรือชื่อการติดตามระยะไกล) เป็นเพียงการบันทึกชื่อสาขาที่เห็นครั้งสุดท้ายใน "ระยะไกล" บางส่วน รีโมตแต่ละตัวเป็นที่เก็บ Git ดังนั้นจึงมีสาขา สาขาในระยะไกล "ต้นกำเนิด" remotes/origin/จะถูกบันทึกไว้ในภายใต้พื้นที่เก็บข้อมูลในพื้นที่ของคุณ ข้อความที่คุณแสดงให้เห็นบอกว่ามีสาขาที่มีชื่อsourceบนoriginและสาขาชื่อ2.1, linklogและอื่น ๆ octopressบน
(แน่นอนว่าเป็นสาขา "ปกติ" หรือ "ท้องถิ่น" เป็นเพียงชื่อสาขาที่คุณสร้างขึ้นในพื้นที่เก็บข้อมูลของคุณเอง)
สุดท้ายคุณสามารถตั้งค่าสาขา (ท้องถิ่น) เป็น "ติดตาม" เป็น "สาขาติดตามระยะไกล" เมื่อสาขาในพื้นที่Lถูกตั้งค่าให้ติดตามสาขาติดตามระยะไกลRGit จะเรียกRมันว่า "อัปสตรีม" และบอกคุณว่าคุณ "อยู่ข้างหน้า" และ / หรือ "อยู่ด้านหลัง" ทางต้นน้ำ (ในแง่ของการกระทำ) เป็นเรื่องปกติ (แม้จะแนะนำได้) สำหรับสาขาในพื้นที่และสาขาการติดตามระยะไกลให้ใช้ชื่อเดียวกัน (ยกเว้นส่วนคำนำหน้าระยะไกล) เช่นsourceและorigin/sourceแต่ไม่จำเป็นจริงๆ
และในกรณีนี้มันไม่ได้เกิดขึ้น คุณมีสาขาในประเทศติดตามระยะไกลติดตามสาขาsourceorigin/master
คุณไม่ควรจะต้องรู้กลไกที่แน่นอนของวิธีการที่ Git จัดตั้งสาขาในพื้นที่เพื่อติดตามรีโมต แต่พวกมันเกี่ยวข้องกันด้านล่างดังนั้นฉันจะแสดงวิธีการทำงานของมัน sourceเราเริ่มต้นด้วยชื่อสาขาในประเทศของคุณ มีรายการกำหนดค่าสองใช้ชื่อนี้สะกดและbranch.source.remote branch.source.mergeจากผลลัพธ์ที่คุณแสดงเป็นที่ชัดเจนว่าทั้งสองชุดนี้ดังนั้นคุณจะเห็นสิ่งต่อไปนี้หากคุณเรียกใช้คำสั่งที่กำหนด:
$ git config --get branch.source.remote
origin
$ git config --get branch.source.merge
refs/heads/master
ร่วมกันวางเหล่านี้2นี้จะบอก Git ที่สาขาที่ท่านsourceติดตามของคุณ origin/master"สาขาที่ห่างไกลการติดตาม"
แต่ตอนนี้ดูผลลัพธ์ของgit branch -aซึ่งแสดงชื่อสาขาท้องถิ่นและการติดตามระยะไกลในที่เก็บของคุณ ชื่อการติดตามระยะไกลอยู่ภายใต้remotes/... และไม่มีremotes/origin/masterไม่มีคงมีครั้งเดียว แต่ตอนนี้มันหายไปแล้ว
Git จะบอกคุณว่าคุณสามารถลบ--unset-upstreamข้อมูลการติดตามที่มี นี่จะเป็นการล้างทั้งbranch.source.originและbranch.source.mergeและหยุดคำเตือน
ดูเหมือนว่าค่อนข้างเป็นไปได้ว่าสิ่งที่คุณต้องการคือเปลี่ยนจากการติดตามorigin/masterเป็นการติดตามอย่างอื่น: อาจเป็นorigin/sourceแต่อาจเป็นหนึ่งในoctopress/ชื่อ
คุณสามารถทำเช่นนี้กับgit branch --set-upstream-to, 3เช่น:
$ git branch --set-upstream-to=origin/source
(สมมติว่าคุณยังอยู่ในสาขา "แหล่งที่มา" และนั่นorigin/sourceคือต้นน้ำที่คุณต้องการ - ไม่มีทางที่ฉันจะบอกได้ว่าคุณต้องการจริงๆอันไหนถ้ามี
(ดูเพิ่มเติมคุณจะทำให้สาขา Git ที่มีอยู่ติดตามสาขาระยะไกลได้อย่างไร )
ผมคิดว่าวิธีการที่คุณมาถึงที่นี่ก็คือว่าเมื่อคุณได้แรกสิ่งที่คุณโคลนจากมีสาขาgit clone masterคุณมีสาขาmasterซึ่งตั้งค่าให้ติดตามorigin/master(นี่เป็นการตั้งค่ามาตรฐานปกติสำหรับคอมไพล์) นั่นหมายความว่าคุณมีbranch.master.remoteและbranch.master.mergeชุดการและorigin refs/heads/masterแต่แล้วคุณoriginระยะไกลเปลี่ยนชื่อจากไปmaster sourceเพื่อให้ตรงกับผมเชื่อว่าคุณยังมีการเปลี่ยนแปลงชื่อท้องถิ่นของคุณจากไปmaster sourceสิ่งนี้เปลี่ยนชื่อการตั้งค่าของคุณจากbranch.master.remoteเป็นbranch.source.remoteและจากbranch.master.mergeเป็นbranch.source.merge... แต่เปลี่ยนไปเป็นค่าเก่าดังนั้นbranch.source.mergeตอนนี้ผิด
เมื่อมาถึงจุดนี้การเชื่อมโยง "อัพสตรีม" ก็หยุดลง แต่ใน Git เวอร์ชั่นที่เก่ากว่า 1.8.5 Git ไม่เคยสังเกตเห็นการตั้งค่าที่ขาด ตอนนี้คุณมี 1.8.5 มันกำลังชี้ให้เห็น
ที่ครอบคลุมคำถามส่วนใหญ่ แต่ไม่ใช่ "ฉันจำเป็นต้องแก้ไข" หรือไม่ เป็นไปได้ว่าคุณได้ทำงานกับสิ่งที่ขาดไปหลายปีแล้วโดยทำ(เช่น) หากคุณทำเช่นนั้นมันจะแก้ไขปัญหาต่อไปเรื่อย ๆไม่คุณไม่จำเป็นต้องแก้ไข ถ้าคุณชอบคุณสามารถใช้เพื่อลบต้นน้ำและหยุดการร้องเรียนและไม่ได้มีสาขาในประเทศทำเครื่องหมายว่ามีใด ๆต้นน้ำที่ทั้งหมดgit pull remote branchgit pull origin source--unset-upstreamsource
จุดที่มีต้นน้ำคือการทำให้การดำเนินการต่างๆสะดวกยิ่งขึ้น ตัวอย่างเช่นgit fetchตามด้วยโดยgit mergeทั่วไปจะ "ทำสิ่งที่ถูกต้อง" หากอัปสตรีมถูกตั้งค่าอย่างถูกต้องและgit statusหลังจากนั้นgit fetchจะบอกคุณว่า repo ของคุณตรงกับอัปสตรีมสำหรับสาขานั้นหรือไม่
หากคุณต้องการความสะดวกสบายให้ตั้งค่าอัปสตรีมอีกครั้ง
1 การgit pullใช้git fetchงานและในฐานะของ Git 1.8.4 ข้อมูลนี้ (ในที่สุด!) จะอัปเดตข้อมูล "สาขาการติดตามระยะไกล" ด้วย ในรุ่นเก่าของ Git, การปรับปรุงไม่ได้รับการบันทึกไว้ในระยะไกลติดตามสาขาเท่านั้นที่มีgit pull git fetchเนื่องจาก Git ของคุณต้องเป็นรุ่น 1.8.5 เป็นอย่างน้อยนี่ไม่ใช่ปัญหาสำหรับคุณ
2remote.origin.fetchอย่างนี้บวกกับสายการกำหนดค่าฉันจงใจละเลยที่พบภายใต้ Git ต้องแมปชื่อ "ผสาน" เพื่อหาว่าชื่อท้องถิ่นแบบเต็มสำหรับสาขาระยะไกลคือrefs/remotes/origin/masterอะไร แม้ว่าการแมปจะใช้งานได้เช่นนี้ตลอดเวลาดังนั้นจึงสามารถคาดการณ์ได้ว่าmasterจะเป็นorigin/masterเช่นไร
3git configหรือกับ หากคุณต้องการตั้งค่าอัปสตรีมorigin/sourceเป็นส่วนเดียวที่ต้องเปลี่ยนคือbranch.source.mergeและgit config branch.source.merge refs/heads/source
จะทำ แต่--set-upstream-toบอกว่าคุณต้องการทำอะไรแทนที่จะทำให้ตัวคุณเองทำเองนั่นคือ "วิธีที่ดีกว่า"