ฟอร์คกิ้งกับการแตกกิ่งใน GitHub


278

ฉันต้องการทราบเพิ่มเติมเกี่ยวกับข้อดีและข้อเสียของการตีโครงการ github กับการสร้างสาขาของโครงการ github

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

คำตอบ:


279

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

Forking ไม่มีอะไรมากไปกว่าโคลนบนฝั่งเซิร์ฟเวอร์ GitHub :

  • ไม่มีความเป็นไปได้ที่จะผลักดันโดยตรง
  • ด้วยคุณสมบัติfork queue ที่เพิ่มเข้ามาเพื่อจัดการคำขอรวม

คุณแยกการซิงค์กับโปรเจ็กต์ดั้งเดิมไว้โดย:

  • การเพิ่มโครงการต้นฉบับเป็นรีโมท
  • ดึงเป็นประจำจากโครงการเดิม
  • รีบูตการพัฒนาปัจจุบันของคุณบนสาขาที่คุณสนใจที่ได้รับการอัปเดตจากการดึงข้อมูลนั้น

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

เป้าหมายคือการอนุญาตให้มีการทำงานร่วมกันแม้ว่าจะไม่สามารถมีส่วนร่วมโดยตรงได้ก็ตาม


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

แยก GitHub

ประสบการณ์การผสานจะเหมือนกัน แต่ด้วยการเพิ่มระดับทางอ้อม (ดันก่อนจากนั้นจึงค่อยดึงเพื่อดึงความเสี่ยงจากวิวัฒนาการของ repo ดั้งเดิมทำให้การรวมไปข้างหน้าอย่างรวดเร็วไม่ใช่การส่งต่ออย่างรวดเร็วอีกต่อไป) .
นั่นหมายถึงเวิร์กโฟลว์ที่ถูกต้องคือgit pull --rebase upstream(รีบูตงานของคุณที่อยู่ด้านบนของคอมมิทใหม่จากต้นน้ำ) และจากนั้นgit push --force originเพื่อเขียนประวัติในลักษณะที่การคอมมิชชันของคุณเองจะอยู่ด้านบนของคอมมิชชันจาก repo ดั้งเดิม (อัปสตรีม) .

ดูสิ่งนี้ด้วย:


3
เรากำลังพัฒนาโครงการในบ้านและไม่มีปัญหาในการเพิ่มผู้คนเป็นผู้ทำงานร่วมกัน แต่เราต้องการทราบว่าการฟอร์กโครงการจะทำการผสานการเปลี่ยนแปลงกลับไปยังโครงการหลักยากขึ้นหรือไม่
reprogrammer

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

14
สุจริตแม้ว่าคุณจะได้ไม่ต้องมันเป็นความคิดที่ดีที่จะมีการซื้อคืนอันศักดิ์สิทธิ์ที่สามารถเขียนได้เท่านั้นสำหรับนักพัฒนาอาวุโสนำทีมหรืออื่น ๆ "เชื่อถือได้" คน สมาชิกทีมอื่น ๆ ทั้งหมดควรทำงานใน forks ของพวกเขา (~ sandbox) และมีส่วนร่วมในการเปลี่ยนแปลงในรูปแบบของคำขอดึง ตั้งแต่ DVCS ทำให้มันเป็นไปได้เราดัดแปลงเป็น "การปฏิบัติที่ดีที่สุด" และประสบความสำเร็จใช้นี้แม้จะอยู่ในโครงการที่มีขนาดเล็กที่สุด ...
intland

1
@intland ดังนั้นคุณจึงชื่นชอบ "Integration-manager เวิร์กโฟลว์" ตามที่อธิบายไว้ในstackoverflow.com/users/6309/vonc?tab=responses ? สำหรับการแนะนำ Git ในองค์กรขนาดใหญ่ฉันมักจะใช้เวิร์กโฟลว์แบบรวมศูนย์ก่อน (คุ้นเคยกับทุกคน) ก่อนที่จะเปลี่ยนไปเป็น "Integration-manager"
VonC

15
เราควรเรียกส้อม "กิ่งไม้" เพราะมันแตกกิ่งก้านและใช้ในการเริ่มต้นต้นไม้ใหม่ทั้งหมด แค่สองเซ็นต์ของฉัน - ฉันชอบสำนวนที่ใช้ต้นไม้
Eric

66

นี่คือความแตกต่างระดับสูง:

ฟอร์ก

ข้อดี

  • แยกสาขาออกจากกันโดยผู้ใช้
  • ลดความยุ่งเหยิงในที่เก็บหลัก
  • กระบวนการทีมของคุณสะท้อนถึงกระบวนการผู้มีส่วนร่วมภายนอก

จุดด้อย

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

การแตกแขนง

ข้อดี

  • เก็บงานทั้งหมดที่ทำเสร็จในโครงการไว้ในที่เดียว
  • ผู้ทำงานร่วมกันทั้งหมดสามารถกดไปที่สาขาเดียวกันเพื่อทำงานร่วมกัน
  • มีรีโมท Git เพียงอันเดียวที่จะจัดการได้

จุดด้อย

  • สาขาที่ถูกทอดทิ้งสามารถกองพะเนินได้ง่ายขึ้น
  • กระบวนการสนับสนุนทีมของคุณไม่ตรงกับกระบวนการผู้มีส่วนร่วมภายนอก
  • คุณต้องเพิ่มสมาชิกในทีมเป็นผู้มีส่วนร่วมก่อนจึงจะสามารถแยกสาขาได้

"กระบวนการผู้ช่วยเหลือภายนอก" มีความหมายอย่างไร
Kars Barendrecht

1
@KarsBarendrecht อัปเดตเพื่อใช้คำว่า "external contributor" คนที่ไม่มีwriteสิทธิ์ในที่เก็บ
Aidan Feldman

45

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

รูปแบบทั่วไปมีดังนี้:

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

หากปราศจากสิ่งนี้มันเป็นเรื่องที่ค่อนข้างผิดปกติสำหรับโครงการสาธารณะที่จะให้ใครก็ตามผลักภาระของตนเองโดยตรง


@RecoJohnson ก็ดี ... ฉันไม่ได้ใช้คำว่า "pull" ในคำตอบของฉัน (แต่ "pull" นั้นเป็น "fetch" + "merge" อย่างมีประสิทธิภาพในเงื่อนไข Git) คุณคิดว่าการใช้ "พุช" แบบใดที่ผิด?
Bruno

2
@RecoJohnson คุณเป็นผู้มีส่วนร่วมผลัก GitHub ของคุณ ผู้ดูแลโครงการจะดึงการมีส่วนร่วมของคุณจากทางแยกของคุณ
mljrg

1
ฉันคิดว่าการสันนิษฐานว่าคุณไม่น่าจะได้รับมอบหมายให้ทำงานร่วมกันนั้นเป็นเรื่องจริงในโลกโอเพ่นซอร์สมากกว่าในหลาย ๆ องค์กรที่มีทีมพัฒนาตอนนี้ใช้ git ซึ่งทีมพัฒนาได้กำหนดไว้อย่างดี ฉันคิดว่านี่เป็นความแตกต่างที่สำคัญในการสร้างและที่ไม่เพียงพออาจเป็นเหตุผลว่าทำไม บริษัท เช่น gitlab กำลังเฟื่องฟูเพราะพวกเขาเข้าใจความต้องการขององค์กรและต้องการการควบคุม
รหัส 4 สาเหตุที่

8

Forking สร้างพื้นที่เก็บข้อมูลใหม่ทั้งหมดจากพื้นที่เก็บข้อมูลที่มีอยู่ (เพียงทำ git clone บน gitHub / bitbucket)

Forks ใช้งานได้ดีที่สุด: เมื่อความตั้งใจในการ 'แยก' คือการสร้างโครงการที่เป็นอิสระตามหลักเหตุผลซึ่งอาจไม่รวมตัวกับผู้ปกครอง

กลยุทธ์สาขาสร้างสาขาใหม่บนพื้นที่เก็บข้อมูลเดิม / ที่ใช้งานได้

สาขาถูกนำมาใช้อย่างดีที่สุด: เมื่อสร้างเป็นสถานที่ชั่วคราวเพื่อทำงานผ่านฟีเจอร์โดยมีเจตนาที่จะรวมสาขากับต้นกำเนิด

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

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

ที่การฟอร์กหลักของมันคล้ายกับการแยกสาขาของฟีเจอร์ แต่แทนที่จะสร้างสาขาจะมีการแยกที่เก็บและแทนที่การรวมคำร้องคุณสร้างคำขอดึง

ลิงค์ด้านล่างมีความแตกต่างในลักษณะที่อธิบายได้ดี:

https://blog.gitprime.com/the-definitive-guide-to-forks-and-branches-in-git/

https://buddy.works/blog/5-types-of-git-workflows

http://www.continuousagile.com/unblock/branching.html


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