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
ถูกตั้งค่าให้ติดตามสาขาติดตามระยะไกลR
Git จะเรียกR
มันว่า "อัปสตรีม" และบอกคุณว่าคุณ "อยู่ข้างหน้า" และ / หรือ "อยู่ด้านหลัง" ทางต้นน้ำ (ในแง่ของการกระทำ) เป็นเรื่องปกติ (แม้จะแนะนำได้) สำหรับสาขาในพื้นที่และสาขาการติดตามระยะไกลให้ใช้ชื่อเดียวกัน (ยกเว้นส่วนคำนำหน้าระยะไกล) เช่นsource
และorigin/source
แต่ไม่จำเป็นจริงๆ
และในกรณีนี้มันไม่ได้เกิดขึ้น คุณมีสาขาในประเทศติดตามระยะไกลติดตามสาขาsource
origin/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 branch
git pull origin source
--unset-upstream
source
จุดที่มีต้นน้ำคือการทำให้การดำเนินการต่างๆสะดวกยิ่งขึ้น ตัวอย่างเช่น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
บอกว่าคุณต้องการทำอะไรแทนที่จะทำให้ตัวคุณเองทำเองนั่นคือ "วิธีที่ดีกว่า"