ความแตกต่างระหว่าง 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.