เหตุใด 'git branch' ของฉันจึงไม่มีหลัก


96

ฉันเป็นมือใหม่และอ่านเกี่ยวกับสาขา "หลัก" อยู่เรื่อย ๆ "ปรมาจารย์" เป็นเพียงชื่อสามัญที่ผู้คนใช้หรือมีความหมายพิเศษเช่นHEAD?

เมื่อฉันทำgit branchในโคลนที่ฉันมีฉันเห็นเพียง 1 สาขาเดียว - สาขาที่ฉันอยู่ ไม่มี "นาย" เลย ถ้าฉันพิมพ์git checkout master(ตามที่ฉันเห็นในบทเรียนหรือคำแนะนำมากมาย) ฉันจะได้รับ

error: pathspec 'master' did not match any file(s) known to git.

ฉันแค่สับสนว่าทำไมโคลนของฉันถึงไม่มีmasterที่ทุกคนดูเหมือนจะบอกเป็นนัยว่ามันมีอยู่จริง

คำตอบ:


76

ที่เก็บ Git ส่วนใหญ่ใช้masterเป็นสาขาหลัก (และค่าเริ่มต้น) - หากคุณเริ่มต้นที่เก็บ Git ใหม่ผ่านทางที่เก็บgit initจะmasterถูกเช็คเอาต์โดยค่าเริ่มต้น

อย่างไรก็ตามหากคุณโคลนที่เก็บสาขาเริ่มต้นที่คุณมีคืออะไรก็ตามที่รีโมตHEADชี้ไป ( HEADจริงๆแล้วคือการอ้างอิงเชิงสัญลักษณ์ที่ชี้ไปยังชื่อสาขา) ดังนั้นหากพื้นที่เก็บข้อมูลที่คุณโคลนมีHEADปลายแหลมให้พูดว่าfooโคลนของคุณก็จะมีfooสาขา

รีโมตที่คุณโคลนอาจยังคงมีmasterสาขาอยู่ (คุณสามารถตรวจสอบได้git ls-remote origin master) แต่คุณจะไม่ได้สร้างเวอร์ชันท้องถิ่นของสาขานั้นตามค่าเริ่มต้นเนื่องจากgit cloneตรวจสอบเฉพาะรีโมตHEADเท่านั้น


6
แล้วจะเช็คเอาต์ต้นแบบจากต้นทางได้อย่างไรถ้ามีอยู่?
Bunyk

คุณจะตั้งค่า HEAD ให้เชี่ยวชาญได้อย่างไร
Matt Smith

33
ฉันสร้าง repo ของฉันด้วย git init และไม่ได้สร้างสาขาหลัก ด้วย Github สาขาจะถูกสร้างขึ้นโดยอัตโนมัติ แต่ไม่ใช่กับ Bitbucket ขั้นตอน mising มีดังนี้git add ., แล้วgit commit -m "Test" git push -u origin master
Shailen

12
@Amber ฉันได้รับข้อผิดพลาดนี้ "fatal: master: not a valid SHA1"
KK_07k11A0585

1
@ แอมเบอร์git ls-remote origin masterไม่โชว์อะไรเลย
Parisa Khateri

86

ในการชำระเงินสาขาที่ไม่มีอยู่ในเครื่อง แต่อยู่ใน repo ระยะไกลคุณสามารถใช้คำสั่งนี้:

git checkout -t -b master origin/master

ขอบคุณที่พยายามช่วยแม้ว่าคำถามนี้จะค่อนข้างเก่า แต่คำตอบของคุณไม่ใช่สิ่งที่ฉันถาม
aberrant80

fatal: Cannot update paths and switch to branch 'master' at the same time.
Raphael Onofre


แก้ไขที่ github สร้างสาขาหลักและตั้งค่าเป็นค่าเริ่มต้น
Raphael Onofre

45

master เป็นเพียงชื่อของสาขาไม่มีความมหัศจรรย์ใด ๆ ยกเว้นมันถูกสร้างขึ้นโดยค่าเริ่มต้นเมื่อสร้างที่เก็บใหม่

คุณสามารถเพิ่มกลับด้วยgit checkout -b master.


git checkout -b masterเพิ่งเพิ่มสาขาใหม่จากสาขาปัจจุบันให้ฉัน
nnyby

1
@nnyby git checkout -b masterจะสร้างmasterสาขาจากอะไรก็ได้HEAD- ดังนั้นหากคุณอยู่ในสาขาอื่นมันจะสร้างmasterสาขาจากสิ่งนั้น ยกเว้นในกรณีที่คุณมีmasterสาขาอยู่แล้ว(ซึ่งคุณจะทำเว้นแต่ว่าคุณได้ลบไปแล้วหรือไม่เคยทำอะไรเลย) หากคุณมีmasterสาขาอยู่แล้วคำสั่งนี้จะทำให้คุณมีข้อผิดพลาด
Matt Curtis

2
คำถามของฉันคือฉันลบมาสเตอร์โดยไม่ได้ตั้งใจได้อย่างไร
Eric Walker

@EricWalker เป็นเพียงสาขาซึ่งสามารถลบได้ด้วยmaster git branch -d masterแม้ว่าคอมไพล์จะป้องกันคุณจากการลบสาขาที่คุณกำลังใช้งานอยู่ แต่ก็ไม่มีอะไรพิเศษในการปกป้องmasterสาขา ยิ่งไปกว่านั้นมันยากที่จะบอกว่าคุณทำได้อย่างไร บางทีคุณอาจใช้historyคำสั่งของเชลล์เพื่อดู?
Matt Curtis

1
สวัสดี @MattCurtis คำตอบของคุณกำลังทำให้เข้าใจผิด git checkout -b masterจะใช้ได้เฉพาะเมื่อ HEAD ถูกตั้งค่าเป็นจุดเริ่มต้น / ต้นแบบ ในกรณีอื่น ๆ (เช่นคุณกำลัง 'พัฒนา') git checkout -b masterจะสร้างสาขาที่ชื่อ 'master' ซึ่งอิงจากตำแหน่ง HEAD ปัจจุบัน (เช่นจาก 'พัฒนา') คุณต้องระบุด้วยว่าสาขาใดจะเป็นตัวการสำหรับสาขาใหม่ @Bunyk มีคำตอบที่ถูกต้องในหัวข้อนี้: stackoverflow.com/a/21330943/287109
AVIDeveloper

24

จริงๆแล้วฉันมีปัญหาเดียวกันกับที่เก็บใหม่ทั้งหมด ฉันเคยลองสร้างด้วยgit checkout -b masterแต่มันจะไม่สร้างสาขา จากนั้นฉันก็รู้ว่าถ้าฉันทำการเปลี่ยนแปลงบางอย่างและยอมรับมันคอมไพล์สร้างสาขาหลัก


1
ส่วนที่ทำให้เข้าใจผิดคือมีคนบอกว่าฉันมีนาย แต่ไม่ว่าฉันจะพยายามทำอะไรก็ตามฉันจะได้รับข้อความแสดงข้อผิดพลาดว่าฉันไม่มีนาย (ฉันกำลังพยายามสร้างสาขา dev ในขณะที่ repo ของฉันยังว่างอยู่) โดยการส่งอะไรบางอย่าง (ไฟล์ใด ๆ ) ตอนนี้มาสเตอร์เข้ามามีบทบาทและฉันสามารถไปทำอย่างอื่น ฉันลองทำตามคำตอบอื่น ๆ แล้ว แต่ไม่มีอะไรช่วยได้ คำตอบเดียวที่นี่อาจใช้ได้กับหลาย ๆ คนที่นั่น (ฉันอ่านเกี่ยวกับการแฮชใน Git มากฉันเดาว่าถ้าไม่มีอะไรในตอนแรกก็ไม่มีอะไรจะแฮช)
Fai Ng

16

ในกรณีของฉันมีสาขาการพัฒนาแต่ไม่มีสาขาหลัก ดังนั้นฉันจึงโคลนที่เก็บโดยชี้ HEAD ที่สร้างขึ้นใหม่ไปยังสาขาที่มีอยู่ จากนั้นฉันสร้างสาขาหลักที่หายไปและอัปเดต HEAD เพื่อชี้ไปที่สาขาหลักใหม่

git clone git:repositoryname --branch otherbranch
git checkout -b master
git update-ref HEAD master
git push --set-upstream origin master

เราไปกันเถอะ .. ฉันไม่มีนายหรืออะไรเลย ก่อนอื่นฉันเพิ่มไฟล์ใหม่และคอมมิตเริ่มต้น - จากนั้นทำสิ่งนี้ ทำงานอย่างมีเสน่ห์
Dustin Silk

12

หากเป็น repo ใหม่ที่คุณได้โคลนไว้อาจยังคงว่างเปล่าซึ่งในกรณีนี้:

git push -u origin master

น่าจะแยกแยะออก

(ในกรณีของฉันไม่แน่ใจว่านี่เป็นปัญหาเดียวกันคิดว่าฉันควรโพสต์ในกรณีนี้อาจช่วยคนอื่นได้)


8

ฉันพบปัญหาเดียวกันและพบปัญหา เมื่อคุณเริ่มต้นที่เก็บจริงจะไม่มีสาขาใด ๆ เมื่อคุณเริ่มดำเนินโครงการgit add .จากนั้นgit commitและสาขาหลักจะถูกสร้างขึ้น

โดยไม่ต้องตรวจสอบอะไรในคุณไม่มีสาขาหลัก ในกรณีนี้คุณต้องทำตามขั้นตอนที่คนอื่นแนะนำไว้ในที่นี้


2
จริง. ทำ "git init" ตามด้วย "git checkout -b somebranchname" แล้วคุณจะไม่มีสาขาหลัก
koem

สิ่งนี้อาจไม่เพียงพอหากโฟลเดอร์ว่างเปล่า ดังนั้นเพื่อให้ใช้งานได้คุณควรเพิ่มไฟล์บางไฟล์ ความอึดอัดนี้เป็นเรื่องที่น่าผิดหวังจริงๆ
alehro

0

ดูเหมือนว่าต้องมีอย่างน้อยหนึ่งข้อผูกพันในท้องถิ่นในสาขาหลักที่ต้องทำ:

git push -u origin master

ดังนั้นหากคุณทำgit init .แล้วgit remote add origin ...คุณยังต้องทำ:

git add ...
git commit -m "..."

0

หากคุณสร้างที่เก็บใหม่จาก Github web GUI บางครั้งคุณจะได้รับชื่อ 'main' แทน 'master' โดยใช้คำสั่งgit statusจากเทอร์มินัลของคุณคุณจะเห็นตำแหน่งที่คุณอยู่ ในบางกรณีคุณจะเห็นorigin/mainในบางกรณีคุณจะเห็น

หากคุณพยายามผลักดันแอปของคุณไปยังบริการคลาวด์ผ่าน CLI ให้ใช้ "main" ไม่ใช่ "master"

ตัวอย่าง: git push heroku main

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