ความแตกต่างระหว่าง fork และ branch บน github


127

ถ้าฉันแยกโปรเจ็กต์ที่โฮสต์บน github ฉันคีบกิ่งทั้งหมดหรือไม่ ฉันจะรู้ได้อย่างไรว่าส้อมของฉันอิงกับสาขาใด? กล่าวอีกนัยหนึ่งว่าสาขาใดจะถูกดาวน์โหลดไปยังพีซีของฉัน


1
คำอธิบายภาษาอังกฤษง่ายๆ: กิ่งก้านก็เหมือนส้อมซึ่งมาจากส้อมแม่ ส้อมก็เหมือนกิ่งไม้ที่ไม่มีกิ่งแม่
— Ken Kin

คำตอบ:


41

ทุกสาขาใน GitHub จะถูกคัดลอกด้วยส้อม (เห็นได้ชัดว่านี่ไม่รวมถึงสาขาที่ไม่เคยถูกผลักไปที่ GitHub ตั้งแต่แรก)

แต่ส้อมคือการดำเนินการ GitHub-to-GitHub ไม่มีการคัดลอกไปยังพีซีของคุณ มันไม่มากเช่นเดียวกับ Git โคลน ถ้าคุณหมายถึงการถามว่า“สิ่งที่คัดลอกเมื่อฉันโคลนโครงการ?” git-clone(1)ดูคู่มือสำหรับ


153

คิดแบบนี้:

repo [ไซต์]สอดคล้องกับการทำงานร่วมกันของทีมในสาขาเดียวหรือหลายสาขา ผู้ร่วมให้ข้อมูลทุกคนมีสำเนาของตนเอง

แต่ละส้อมของสอดคล้อง repo หลักในการทำงานของผู้มีส่วนร่วมของ ส้อมเป็นโครงสร้าง Github (ไม่ใช่ Git) เพื่อเก็บโคลนของ repo ไว้ในบัญชีผู้ใช้ของคุณ ในฐานะที่เป็นโคลนจะมีสาขาทั้งหมดใน repo หลักในเวลาที่คุณสร้างส้อม

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

คำขอดึง (ในระบบนิเวศ GitHub) สอดคล้องกับงาน ทุกครั้งที่ฉันต้องการมีส่วนร่วมในงานที่แยกเสร็จแล้วให้กับ repo หลักฉันจะสร้างคำขอดึงที่สอดคล้องกับการคอมมิตที่ทำในงานนั้น กระทำเหล่านี้จะถูกดึงออกมาจากทั้งของฉันส้อมหรือฉันสาขาไปrepo หลัก

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


4
ชอบวิธีที่คุณอธิบายบิตที่เกี่ยวข้องทั้งหมดเช่นการแมปคำขอดึงไปยังส้อม / สาขา "คุณไม่โอนไฟล์คุณถ่ายโอนบันทึกการเปลี่ยนแปลง" ... ฉันรู้อยู่แล้ว แต่วลีนี้สมบูรณ์แบบ!
— roughvchawla

2
plus-one สำหรับชี้แจงว่า fork นั้นเป็น github ไม่ใช่ git ขอบคุณ!
— Emery.noel

10

Fork เป็นโคลนที่ฝั่ง GitHub (โคลนทุกอย่าง)
เมื่อคุณโคลน repo คุณจะได้รับประวัติทั้งหมดของ repo ดังกล่าวพร้อมด้วยสาขาทั้งหมด

แม้ว่าในทางทฤษฎีคุณสามารถเปลี่ยนสาขาเริ่มต้นของ repo ระยะไกลได้แต่โคลนจากที่เก็บ GitHub จะมองหาสาขาหลักเป็นหลัก ความหมายในการเปลี่ยนสาขา "เริ่มต้น" ที่โคลน GitHub จะได้รับคุณจะต้องเปลี่ยนชื่อสาขาหลัก


ดังนั้นเมื่อฉันโคลน repo ที่แยกออกจากกัน (ดาวน์โหลดไปยังพีซีของฉันอย่างมีประสิทธิภาพ) สาขาต่างๆอยู่ในพีซีของฉันหรือไม่ แต่มีการเพิ่มไฟล์พิเศษในสาขาเดียว พีซีของฉันจะมีไฟล์เหล่านั้นหรือไม่?
— โจนาธาน

1
@ โจนาธาน: พีซีของคุณจะได้รับทุกสาขาพร้อมไฟล์ทั้งหมด แต่ไดเร็กทอรีการทำงานของคุณ(พื้นที่ที่คุณชำระเงินหนึ่งในสาขาเหล่านั้น) จะเป็นพื้นที่เดียวที่คุณจะเห็นไฟล์เหล่านั้น
— VonC

ดังนั้นไฟล์อื่น ๆ จะถูกเก็บไว้ในโฟลเดอร์. git หรือไม่?
— โจนาธาน

@ โจนาธาน: เป็นวัตถุที่หลวมหรืออัดแน่นดูbook.git-scm.com/7_how_git_stores_objects.html (วัตถุที่เป็นหยด ("ไฟล์" ของคุณ) ต้นไม้การคอมมิตหรือแท็ก: book.git-scm.com/ 1_the_git_object_model.html )
— VonC

4

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

ในการทำสำเนาในพีซีของคุณคุณต้องโคลนและดึงข้อมูลทั้งหมดและคุณจะได้รับสาขาและรหัสทั้งหมดของโครงการนั้น


2

หากคุณสร้างส่วนแยกของโครงการจากเว็บไซต์ Github คุณจะได้รับสาขาทั้งหมดจากโครงการต้นน้ำ

หากคุณโคลนจากส้อมที่สร้างใหม่ไปยังพีซีในพื้นที่ของคุณคุณจะมีoriginรีโมทบนพีซีของคุณชี้ไปที่สาขาหลักของส้อมของคุณบน Github


ตามหน้า Help.GitHub ฟอร์กโครงการสร้างupstreamสาขาคือสิ่งที่คุณต้องทำ; และพวกเขาบอกคุณว่าต้องทำอย่างไร
— JC Salomon

2
นั่นคือรีโมทไม่ใช่สาขา
— Arrowmaster

1

สิ่งนี้สามารถอธิบายได้เป็นอย่างดี คุณมีที่เก็บส่วนกลางที่ GitHub เมื่อใดก็ตามที่คุณทำการโคลนบนคอมพิวเตอร์ส่วนบุคคลของคุณเพื่อทำการเปลี่ยนแปลงบางอย่างการโคลนภายในของที่เก็บหลักนี้เรียกว่าส้อม

สาขาเป็นสิ่งที่แตกต่างและรวมอยู่ใน fork / repo จริงๆแล้วสาขาคืองานของคุณในขั้นตอนต่างๆของการพัฒนา พวกเขาถูกสร้างขึ้นตามและเมื่อจำเป็นในการบันทึกชุดฟังก์ชันเพื่อให้การเข้าถึงแก่ผู้ใช้ที่แตกต่างกันเพื่อสาธิตไซต์ให้กับลูกค้าเป็นต้น


1

ฉันต้องการแบ่งปันตัวอย่างชีวิตจริงเมื่อเราใช้ Branches และเมื่อเราใช้ Forks

เรามี GitLab ที่ร้านของเราและบางครั้งเราต้องทำงานกับแพ็คเกจจากโครงการ Laravel โดยปกติเราจะสร้างสาขาและผลักดันการเปลี่ยนแปลงไปยังสาขาที่เราได้ทำการทดสอบในสภาพแวดล้อม VM dev ในพื้นที่ของเราเมื่อทำงานกับโครงการ Laravel จริง

สมมติว่าโครงการของเราตั้งอยู่ที่

https://github.com/yardpenalty/mainproject.git

การใช้งานสาขา:

มาบอกว่าเรียกสาขา It_doesnt_matter

เมื่อเรามีสาขาตามที่เราต้องการสำหรับการผลิตแล้วเราก็ทำการผลักดันครั้งสุดท้ายไปที่สาขานี้และสร้างคำขอรวมซึ่งจะเข้าสู่ UAT เพื่อทำการทดสอบเมื่อการทดสอบผ่าน QC แล้วการเปลี่ยนแปลงจะรวมเข้ากับการผลิต

ตอนนี้การรวมจากIt_doesnt_matter สาขาจะถูกผลักไปยังโปรเจ็กต์หลัก

ที่ https://github.com/yardpenalty/mainproject.git

สมมติว่าโครงการแพ็คเกจตั้งอยู่ที่

https://github.com/yardpenalty/mypackage.git

โปรดทราบว่าโครงการหลักใช้แพ็กเกจนี้ในการผลิตดังนั้นเราจึงไม่สามารถทำการเปลี่ยนแปลงได้โดยเพียงแค่ผลักดันไปที่แพ็คเกจนี้ (ด้วยเหตุผลอื่น ๆ ) สมมติว่านักพัฒนาเว็บต้องแก้ไขแพ็คเกจนี้เพื่อทำการเปลี่ยนแปลงในการผลิต

สาขาที่เรียบง่ายจะไม่สามารถใช้งานได้เนื่องจากเราไม่สามารถเห็นการเปลี่ยนแปลงของเราได้โดยไม่ต้องเผยแพร่แพ็คเกจเป็นต้น

การใช้ส้อม: ตอนนี้เป็นตอนที่เราต้องใช้กลอุบายเล็กน้อยกับแพ็คเกจของเราดังนั้นเราจึงสร้างโคลนของแพ็คเกจการผลิตด้วยส้อม ไฟล์ composer.json สามารถอัปเดตให้ชี้ไปที่ทางแยกซึ่งตอนนี้อยู่ที่เส้นทางผู้ใช้หรือกลุ่ม

ดังนั้นเราจะสร้างส้อมใน https://github.com/yardpenalty/mypackage.git

และเรียกมันว่า https://github.com/yardpenalty/yards/mypackage.git

ตอนนี้เราสามารถอัปเดตไฟล์composer.jsonของเราให้ชี้ไปที่แพ็กเกจนี้ใน "ที่เก็บ" ของเรา: [อาร์เรย์เช่นนี้แล้วเราจะไป!

 {
            "type": "github",
            "url": "https://github.com/yardpenalty/yard/mypackage.git"
 }

]

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