สาขา Git ทำงานอย่างไร ฉันสามารถลบสาขาหลักได้หรือไม่


22

ฉันมีโครงการที่มี 2 สาขาคือการพัฒนาและการผลิต ฉันไม่ได้ใช้สาขาหลักและทุกครั้งที่ฉันเขียนgit statusมันจะบอกฉันว่าสาขาของฉันไปไกลแค่ไหนจากต้นแบบ

เมื่อฉันพยายามที่จะลบสาขาหลักgit branch -d masterมันจะลบเฉพาะในพื้นที่เก็บข้อมูลท้องถิ่นของฉันและไม่ได้อยู่ในเซิร์ฟเวอร์ git ระยะไกล ความคิดใด ๆ

คำตอบ:


34

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

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

ดังนั้นกลับไปที่คำถามของคุณ ... พื้นที่เก็บข้อมูล "canonical" ที่คุณโคลนเมื่อคุณเริ่มต้นสำเนาโลคัลมีสาขา "ต้นแบบ" เป็นค่าเริ่มต้น และมันติดอยู่รอบ ๆ ตอนนี้ถ้าคุณมีคอมพิวเตอร์ที่มีที่เก็บข้อมูลหลักคุณสามารถเข้าสู่ระบบและเรียกใช้:

git branch -d master

อย่างไรก็ตามหากคุณไม่สามารถทำได้คุณยังสามารถทำได้จากเครื่องท้องถิ่นของคุณ git branchคำสั่งมี-rตัวเลือกที่มีผลต่อพื้นที่เก็บข้อมูลระยะไกล กล่าวอีกนัยหนึ่งการรันคำสั่งต่อไปนี้ควรใช้งานได้:

git branch -d -r master

โปรดทราบว่าในทั้งสองกรณี ฉันสมมติว่าmasterได้รับการผสานอย่างสมบูรณ์ในประวัติการพัฒนาที่สำเนาในเครื่องของคุณกำลังนั่งอยู่ หากคุณไม่เคยใช้มาmasterก่อน (เช่น: คุณเคยเช็คอินdevelopmentหรือproduction) คุณไม่ต้องกังวล อย่างไรก็ตามหากคุณ (หรือคนอื่น) ตรวจสอบสิ่งต่าง ๆ ในmasterแล้วคุณอาจมีปัญหา คุณสามารถบังคับให้ลบโดยการเปลี่ยน-dไป-Dในคำสั่งดังกล่าว; แต่ฉันขอแนะนำให้ตรวจสอบเพื่อดูว่ามีอะไรอยู่masterก่อน! หากคุณไม่สามารถเข้าถึงคอมพิวเตอร์ระยะไกลคุณอาจไม่สามารถกู้คืนได้!


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


3
บางครั้งตั้งแต่ฉันเขียนความคิดเห็นเดิมของฉันพฤติกรรมของคอมไพล์ก็เปลี่ยนไปเล็กน้อย ในฐานะของคอมไพล์ 1.7.12 จะgit branch -d -r masterไม่ลบสาขาระยะไกลอีกต่อไป แต่จะลบความรู้เกี่ยวกับสาขาระยะไกลของสำเนาในเครื่องของคุณ ครั้งต่อไปคุณgit fetchสาขาจะกลับมา! คุณจะต้องวิ่งgit push origin :masterแทน โดยพื้นฐานแล้วสิ่งที่คุณกำลังทำอยู่ที่นี่คือการผลักสาขาที่ไม่มีค่า (ชื่อสาขาที่ว่างเปล่าไปทางซ้าย:) เหนือส่วนบนของรีโมตสาขา (ชื่อสาขาทางด้านขวาของ:) ลบอย่างมีประสิทธิภาพ
mparker17

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

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

หรือผู้ทำแผนที่: นั่นคือข้อความที่ฉันอ้างถึง: ขอบคุณสำหรับลิงค์ใหม่! ฉันได้อัพเดทลิงค์ในคำตอบแล้ว
mparker17

4

masterเป็นสาขาเริ่มต้นสำหรับคอมไพล์ ฉันไม่รู้ว่าทำไมมันช่างแย่เหลือเกินสำหรับคุณเมื่อ git บอกคุณว่าคุณอยู่ห่างจากอาจารย์มากแค่ไหน แต่ถ้าคุณต้องการที่จะลบสาขาในที่เก็บระยะไกลของคุณการลบมันในเครื่องนั้นไม่เพียงพอ ลองใช้สิ่งนี้แทน:

git push origin :master

สิ่งนี้จะไม่ส่งอะไรเลย (ตอนก่อนโคลอน) ไปยังเซิร์ฟเวอร์ต้นทางของคุณและเขียนทับต้นแบบ กล่าวอีกนัยหนึ่งก็ควรลบสาขาหลักจากระยะไกล


ฉันได้รับ: remote: ข้อผิดพลาด: ปฏิเสธที่จะลบสาขาปัจจุบัน: refs / heads / master ถึงgithub.com ***. git! ข้อผิดพลาด [ปฏิเสธจากระยะไกล] ต้นแบบ (การลบสาขาปัจจุบัน) ข้อผิดพลาด: ล้มเหลวในการผลักดันผู้อ้างอิงบางคนไปที่ ' github.com ***. git'
Totty.js

1
@Totty บางทีนี่อาจช่วยได้: matthew-brett.github.io/pydagogue/gh_delete_master.html
MEM
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.