ความแตกต่างระหว่าง Forking และ Cloning on GitHub คืออะไร


187

ฉันต้องการทราบความแตกต่างระหว่างการทำ Fork ของโครงการและทำcloneมัน

ฉันสามารถส่งคำขอดึงผ่าน GitHub ได้เฉพาะเมื่อฉันแยกโครงการหรือไม่


2
มีความเป็นไปได้ที่ซ้ำกันของส้อม git
j08691

2
สำหรับผู้ที่มาที่นี่เพื่อค้นหาคำอธิบายของ "fork" กับ Git (ไม่ใช่ GitHub) ไม่มีคำสั่ง "fork" บน Git มันเป็นแนวคิดมากกว่า GitHub (ไม่ใช่ Git) ความแตกต่างที่ลืมได้ง่าย
ambassallo

คำตอบ:


113

โดยทั่วไปแล้วใช่ เป็นเพียงการขอ GitHub โคลนโครงการและลงทะเบียนภายใต้ชื่อผู้ใช้ของคุณ ; GitHub ยังติดตามความสัมพันธ์ระหว่างที่เก็บสองแห่งดังนั้นคุณสามารถเห็นภาพการคอมมิทและดึงระหว่างโครงการทั้งสอง (และส้อมอื่น ๆ )fork

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


4
ทางแยกใช้การปรับปรุงมากกว่าโคลนอย่างมาก git pullโคลนสามารถปรับปรุงด้วยง่าย ทางแยกใช้หลายคำสั่ง และไม่น่าแปลกใจที่เกือบทุกส้อมที่ฉันดูจะล้าสมัย ส้อมเป็นเหมือนปัญหาที่เก็บ Maven บนเตียรอยด์ แทนที่จะเป็นหนึ่ง repo ที่ล้าสมัย (Maven) มีหลายพันรายการ (Git)
jww

@ jww ฟังดูดีที่สุดที่จะติดกับโคลน - ทำไมต้องใช้ fork แล้วทำไมล่ะ?
serup

@serup - สาเหตุที่เป็นสำเนาที่แยกสามารถแก้ไขได้git pullดังนั้นจึงยังมีความสัมพันธ์บางอย่างที่มีอยู่ หากคุณคัดลอกสำเนาทั้งหมดนั่งบนเครื่องของคุณเองและตัดการเชื่อมต่อจาก repo เดิม
JonH

134

เมื่อคุณบอกว่าคุณมีการฟอร์กที่เก็บคุณมีพื้นการสร้างสำเนาของพื้นที่เก็บข้อมูลภายใต้ GitHub ID ของคุณ จุดสำคัญที่ควรทราบที่นี่คือการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับที่เก็บต้นฉบับจะสะท้อนกลับไปยังที่เก็บแบบแยกของคุณ(คุณต้องดึงข้อมูลและรีบูต) อย่างไรก็ตามหากคุณทำการเปลี่ยนแปลงใด ๆ กับที่เก็บแบบแยกของคุณคุณจะต้องสร้างคำขอดึงไปยังที่เก็บต้นฉบับอย่างชัดเจน หากคำขอการดึงของคุณได้รับการอนุมัติโดยผู้ดูแลระบบของที่เก็บต้นฉบับการเปลี่ยนแปลงของคุณจะถูกคอมมิต / ผสานกับรหัสฐานเดิมที่มีอยู่ ก่อนหน้านั้นการเปลี่ยนแปลงของคุณจะปรากฏเฉพาะในสำเนาที่คุณแยกเท่านั้น

ในระยะสั้น:

โมเดล Fork & Pull ช่วยให้ทุกคนสามารถแยกที่เก็บข้อมูลที่มีอยู่และผลักดันการเปลี่ยนแปลงไปยังทางแยกส่วนบุคคลของพวกเขาโดยไม่ต้องมีการอนุญาตให้เข้าถึงที่เก็บข้อมูลต้นทาง การเปลี่ยนแปลงนั้นจะต้องถูกดึงเข้าสู่แหล่งเก็บข้อมูลโดยผู้ดูแลโครงการ

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

คู่สนทนาที่น่าสนใจอื่น ๆ -

ส้อมของคอมไพล์จริงหรือไม่

ฉันจะอัปเดตที่เก็บแบบแยก GitHub ได้อย่างไร


24
"ประเด็นหลักที่ควรทราบที่นี่คือการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับที่เก็บต้นฉบับจะสะท้อนกลับไปยังที่เก็บแบบแยกของคุณ" ฉันคิดว่าเป็นเพียงเล็กน้อยที่ทำให้เข้าใจผิด AFAIK การเปลี่ยนแปลงที่เกิดขึ้นกับที่เก็บต้นฉบับหลังจากที่ fork ไม่ได้สะท้อนให้เห็นโดยอัตโนมัติใน fork; คุณต้องย้ายการเปลี่ยนแปลงเหล่านั้นด้วยตนเอง การเปลี่ยนแปลงที่เกิดขึ้นก่อนที่ fork จะถูกคัดลอกไปยัง fork ใหม่เมื่อคุณคลิกปุ่ม fork
Ajedi32

"การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับที่เก็บต้นฉบับจะถูกสะท้อนกลับไปยังที่เก็บที่แยกของคุณ" .. จริง ๆ ?? ไม่ใช่อัตโนมัติฉันหวังว่า
KansaiRobot

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

การเปลี่ยนแปลงที่เกิดขึ้นกับที่เก็บต้นฉบับหลังจากที่ส้อมไม่ปรากฏขึ้นโดยอัตโนมัติในทางแยก แต่ในการดำเนินการดังกล่าวให้ตรวจสอบขั้นตอนที่ 3 ของบล็อกนี้: - help.github.com/articles/fork-a-repo
Suhas Chikkanna

"การเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับที่เก็บข้อมูลดั้งเดิมจะถูกส่งกลับไปยังที่เก็บข้อมูลแยกของคุณ" - คุณหมายถึงสิ่งนี้เป็นไปไม่ได้หลังจากที่เราโคลน?
ตัวแปร

26
  • โครงการแยกเป็นของคุณบนที่เก็บออนไลน์ของคุณ (repo)
  • โครงการที่โคลนอยู่บนเครื่องของคุณ (ฉันมักจะโคลนหลังจากการซื้อคืน repo)

คุณสามารถคอมมิชชัน repo ออนไลน์ของคุณ (หรือคอมมิชชัน repo ท้องถิ่นของคุณและจากนั้นกดไป repo ออนไลน์ของคุณ), จากนั้นส่งคำขอ pull

ผู้จัดการโครงการสามารถยอมรับเพื่อรับการเปลี่ยนแปลงในเวอร์ชันออนไลน์หลักของเขา


13

โคลนคือที่ที่คุณมีการทำซ้ำที่เหมาะสมและแยกระหว่างสองรุ่น (อาจแตกต่างกัน) ของที่เก็บ เมื่อมีการแก้ไข repo หนึ่งเนื้อหาใหม่ต้องถูกคัดลอกไปยัง repo อื่นอย่างแข็งขันโดยใช้คำสั่ง push และการเปลี่ยนแปลงในการซื้อคืนอื่น ๆ

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

ในระดับที่ต่ำกว่า git ทำสิ่งเดียวกันภายใน หากคุณมีสามไฟล์ที่แตกต่างกันแต่ละไฟล์มีHello Worldแล้วคอมไพล์เพียง 'คัดลอก' สำเนาของ Hello World หยดเดียวและเสนอในสามแห่งตามที่ต้องการ

ความสามารถในการแยกเซิร์ฟเวอร์หมายความว่าค่าเผื่อการจัดเก็บข้อมูลขนาดใหญ่ของ Github นั้นไม่ใหญ่มากนักเนื่องจากทุก ๆ หน่วยงานจะใช้ repo พื้นฐานเดียวร่วมกัน


5

โดยสรุปการแยกอาจเหมือนกับ "การโคลนภายใต้ GitHub ID / โปรไฟล์" ของคุณ ส้อมจะดีกว่าโคลนทุกเวลาโดยมีข้อยกเว้นบางอย่างชัดเจน ที่เก็บที่ถูกแยกจะถูกมอนิเตอร์ / เปรียบเทียบกับที่เก็บดั้งเดิมเสมอซึ่งแตกต่างจากที่เก็บที่โคลน ที่ช่วยให้คุณติดตามการเปลี่ยนแปลงเริ่มต้นคำขอการดึงและยังซิงค์การเปลี่ยนแปลงที่เกิดขึ้นในที่เก็บต้นฉบับด้วยตนเองโดยใช้ทางแยก


5

ในขณะที่คำตอบของ @ AniketThakur นั้นดีมาก ยังไม่มีใครตอบคำถามต่อไปนี้

ฉันสามารถส่งคำขอดึงผ่าน GitHub ได้เฉพาะเมื่อฉันแยกโครงการหรือไม่

ไม่หากคุณเป็นผู้มีส่วนร่วมในที่เก็บคุณสามารถ: สร้างโคลนในเครื่อง ทำสาขาท้องถิ่น เพิ่มความมุ่งมั่นในสาขานั้น ผลักสาขาในท้องถิ่นกลับไปที่ GitHub (สร้างสาขาระยะไกลในกระบวนการ) สร้างคำขอดึงเพื่อขอให้สาขานั้นรวมเข้ากับสาขาหลัก (หรือสาขาใดก็ได้ที่คุณต้องการ)


3

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

  1. แยก repo ที่คุณต้องการส่งคำขอดึง
  2. ผลักดันการเปลี่ยนแปลงในท้องถิ่นของคุณไปยังระยะไกลของคุณ
  3. คำขอดึงปัญหา

2

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

จากสาเหตุที่ฉันบริจาคไม่แสดง :

กระทำถูกสร้างขึ้นในทางแยก

ความมุ่งมั่นที่ทำในทางแยกจะไม่นับรวมกับเงินบริจาคของคุณ เพื่อให้นับคุณต้องทำอย่างใดอย่างหนึ่งต่อไปนี้:

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


2

สรุป "fork" สร้างสำเนาของโครงการที่โฮสต์ในบัญชี GitHub ของคุณเอง

"Clone" ใช้ซอฟต์แวร์ git บนคอมพิวเตอร์ของคุณเพื่อดาวน์โหลดซอร์สโค้ดและมันเป็นประวัติรุ่นทั้งหมดของคอมพิวเตอร์นั้น

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