เหตุใดจึงเรียก git branch --unset-upstream เพื่อ fixup


161

ฉันเป็นมือใหม่มากเมื่อพูดถึงการปฏิบัติการขั้นสูงในคอมไพล์ ฉันจะรักษาของฉันบล็อกโดยใช้กรอบบล็อกOctopress แม้ว่า Octopress จะไม่ได้รับการพัฒนาใด ๆ ตั้งแต่ปี 2011 แต่มันก็ตอบสนองวัตถุประสงค์ของฉันได้ดีดังนั้นฉันจึงไม่ได้คิดที่จะเปลี่ยนแปลงอะไรเลย

FYI บล็อกของฉันโฮสต์บน Github Pages

วันนี้ขณะที่ทำงานกับโพสต์ใหม่git statusแสดงข้อความต่อไปนี้:

On branch source
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

ข้อความเดียวกันซ้ำสำหรับทุกคำสั่งที่ตามมาเช่นgit add ., และ git commit -m 'message'git push origin source

  • ข้อความหมายถึงอะไร
  • มีบางสิ่งแตกหักหรือไม่
  • ถ้าใช่คืออะไร
  • ฉันจำเป็นต้องแก้ไขหรือไม่

ถ้าเป็นไปได้โปรดชี้ฉันไปที่บทความ pdf / web ที่ฉันสามารถอ่านบทความนี้และเข้าใจในอนาคต

รายละเอียดเพิ่มเติม:

bash-3.2$ git branch -a
* source
  remotes/octopress/2.1
  remotes/octopress/HEAD -> octopress/master
  remotes/octopress/gh-pages
  remotes/octopress/linklog
  remotes/octopress/master
  remotes/octopress/refactor_with_tests
  remotes/octopress/rubygemcli
  remotes/octopress/site
  remotes/origin/source

โปรดแจ้งให้เราทราบหากต้องการข้อมูลเพิ่มเติม ขอบคุณ

คำตอบ:


197

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บอกว่าคุณต้องการทำอะไรแทนที่จะทำให้ตัวคุณเองทำเองนั่นคือ "วิธีที่ดีกว่า"


3
+1 สำหรับ "หากคุณต้องการคุณสามารถใช้ --unset-upstream เพื่อทำเครื่องหมายสาขาในท้องถิ่นว่าไม่มีต้นน้ำเลย"
BeatriceThalo

157

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

ฉันได้สร้าง repo ที่ว่างเปล่า (ใหม่) โดยใช้git init --bareบนหนึ่งในเซิร์ฟเวอร์ของฉัน จากนั้นฉันgit cloneก็ไปที่พื้นที่ทำงานในเครื่องของฉัน

หลังจากก่อรุ่นเดียวใน repo git statusท้องถิ่นผมได้รับข้อผิดพลาดที่หลังจากเรียก

ตามคำตอบของ torek ฉันเข้าใจว่าสิ่งที่เกิดขึ้นคือการกระทำครั้งแรกใน repo ไดเรกทอรีทำงานท้องถิ่นสร้างสาขา "ต้นแบบ" แต่ใน repo ระยะไกล (บนเซิร์ฟเวอร์) ไม่มีอะไรเลยดังนั้นจึงไม่มีแม้แต่ "master" (remotes / origin / master) สาขา

หลังจากทำงานgit push origin masterจาก repo ในพื้นที่แล้ว repo ระยะไกลก็มีสาขาหลัก สิ่งนี้หยุดข้อผิดพลาดไม่ให้ปรากฏ

เพื่อสรุป - หนึ่งอาจได้รับข้อผิดพลาดดังกล่าวสำหรับ repo ใหม่ระยะไกลใหม่ที่มีศูนย์การกระทำเพราะมันไม่มีสาขารวมถึง "ต้นแบบ"


6
ขณะนี้นี่เป็นผลการ nr 1 สำหรับข้อความแสดงข้อผิดพลาดนี้On branch source Your branch is based on 'origin/master', but the upstream is gone. (use "git branch --unset-upstream" to fixup)และในขณะที่อัตนัยมีแนวโน้มที่จะเกิดจากการโคลนที่เก็บข้อมูลว่างเปล่าซึ่งดีมากที่จะมีคำตอบอื่นที่นี่
Bella

2
ฉันคิดว่านั่นเป็นสาเหตุที่เป็นความคิดที่ดีที่จะเริ่มต้นพื้นที่เก็บข้อมูลใหม่ของคุณด้วยไฟล์ README.md แม้ว่าจะเป็นไฟล์ว่างเปล่า
Ahmed Hussein

8

วิธีนี้อาจช่วยแก้ปัญหาของคุณได้

หลังจากทำการเปลี่ยนแปลงคุณสามารถกระทำได้แล้ว

git remote add origin https://(address of your repo) it can be https or ssh
then
git push -u origin master

หวังว่ามันจะเหมาะกับคุณ

ขอบคุณ


1
สิ่งนี้จะช่วยได้จริง - เหตุผลมีรายละเอียดในคำตอบของฉัน (ในระยะสั้น - นี่จะสร้างสาขาหลักที่ขาดหายไปใน repo ระยะไกล)
ElazarR

7

สำหรับฉัน.git/refs/origin/masterได้รับความเสียหาย

ฉันทำสิ่งต่อไปนี้ซึ่งแก้ไขปัญหาให้ฉัน

rm .git/refs/remotes/origin/master
git fetch
git branch --set-upstream-to=origin/master

0

ในความเป็นจริงแล้วคุณจะบอกวิธีการใช้เครื่องมือได้ดีกว่าที่ฉันทำได้ อย่างไรก็ตามในกรณีนี้ผมคิดว่ามันเป็นสิ่งสำคัญที่จะชี้ให้เห็นบางสิ่งบางอย่างที่แปลกประหลาดถ้าคุณทำตามคำแนะนำที่http://octopress.org/docs/deploying/github/ กล่าวคือคุณจะมีที่เก็บ Github หลายแห่งในการตั้งค่าของคุณ แรกของทุกคนที่มีทั้งหมดซอร์สโค้ดสำหรับเว็บไซต์ของคุณในพูดไดเรกทอรีและจากนั้นมีเพียงหนึ่งคงที่สร้างไฟล์ที่อาศัยอยู่ใน$WEBSITE $WEBSITE/_deployสิ่งที่ตลกของการตั้งค่าคือมี.gitignoreไฟล์ใน$WEBSITEไดเรกทอรีเพื่อให้การตั้งค่านี้ใช้งานได้จริง

แนะนำให้รู้จักพอ ในกรณีนี้ข้อผิดพลาดอาจมาจากที่เก็บ_deployมา

cd _deploy

git branch -a
* master
remotes/origin/master
remotes/origin/source

ใน.git/configปกติคุณจะต้องพบอะไรเช่นนี้

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

แต่ในกรณีของคุณอาจารย์สาขาไม่มีรีโมท

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@github.com:yourname/yourname.github.io.git
    fetch = +refs/heads/*:refs/remotes/origin/*

ซึ่งคุณสามารถแก้ปัญหาโดย:

cd _deploy
git branch --set-upstream-to=origin/master

ดังนั้นทุกอย่างก็เป็นไปตามที่คุณบอก แต่สิ่งสำคัญคือต้องชี้ให้เห็นว่าสิ่งนี้อาจเกี่ยวข้องกับ_deployไดเรกทอรีมากกว่ารากของเว็บไซต์ของคุณ

PS: มันอาจจะคุ้มค่าที่จะใช้เชลล์เช่นzshกับgitปลั๊กอินที่จะไม่ถูกกัดโดยสิ่งนี้ในอนาคต มันจะแสดงให้เห็นทันทีว่า_deployเกี่ยวข้องกับพื้นที่เก็บข้อมูลที่แตกต่างกัน


0

ฉันมีคำถามนี้สองครั้งและมักเกิดจากความเสียหายของไฟล์แคช git ที่สาขาในพื้นที่ของฉัน ฉันแก้ไขมันโดยการเขียนแฮชคอมมิตที่หายไปลงในไฟล์นั้น ฉันได้รับสิทธิ์แฮชจากเซิร์ฟเวอร์และรันคำสั่งต่อไปนี้ในเครื่อง:

cat .git/refs/remotes/origin/feature/mybranch \
echo 1edf9668426de67ab764af138a98342787dc87fe \
>> .git/refs/remotes/origin/feature/mybranch

0

ปัญหา: สาขาของคุณขึ้นอยู่กับ 'ต้นทาง / หลัก' แต่ต้นน้ำหายไป

วิธีการแก้ไข: สาขา git --unset-upstream


3
ยินดีต้อนรับสู่ stackoverflow คำถามไม่ได้เกี่ยวกับวิธีการแก้ไขข้อผิดพลาดเขาต้องการที่จะรู้ว่าทำไมข้อผิดพลาดนี้เกิดขึ้นและถ้าเขาควรจะทำอะไรกับมัน โปรดระบุที่อยู่นี้ในคำตอบของคุณ
cronoik

0

ลบสาขาท้องถิ่นของคุณโดยคำสั่งดังต่อไปนี้

git branch -d branch_name

คุณสามารถทำได้

git branch -D branch_name 

ซึ่งโดยทั่วไปบังคับให้ลบ (แม้ว่าโลคอลไม่รวมกับแหล่งที่มา)

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