Forking vs. Branching di GitHub

278

Saya ingin tahu lebih banyak tentang kelebihan dan kekurangan dari forking proyek github vs membuat cabang proyek github.

Forking membuat versi proyek saya lebih terisolasi dari yang asli karena saya tidak harus berada dalam daftar kolaborator dari proyek asli. Karena kami sedang mengembangkan proyek sendiri, tidak ada masalah dalam menambahkan orang sebagai kolaborator. Tapi, kami ingin memahami jika mengarang proyek akan membuat perubahan penggabungan kembali ke proyek utama lebih sulit. Yaitu, saya bertanya-tanya apakah percabangan membuat kedua proyek tersinkronisasi lebih mudah. Dengan kata lain, apakah lebih mudah untuk menggabungkan dan mendorong perubahan antara versi saya dari proyek utama dan proyek utama ketika saya bercabang?

pemrogram ulang
sumber

Jawaban:

280

Anda tidak dapat selalu membuat cabang atau menarik cabang yang ada dan mendorongnya ke belakang, karena Anda tidak terdaftar sebagai kolaborator untuk proyek spesifik itu.

Forking tidak lebih dari sebuah klon di sisi server GitHub :

  • tanpa kemungkinan untuk langsung mendorong kembali
  • dengan fitur antrian fork ditambahkan untuk mengelola permintaan penggabungan

Anda tetap menyelaraskan garpu dengan proyek asli dengan:

  • menambahkan proyek asli sebagai remote
  • mengambil secara teratur dari proyek asli itu
  • rebase perkembangan Anda saat ini di atas cabang minat yang Anda perbarui dari pengambilan itu.

Rebase memungkinkan Anda untuk memastikan bahwa perubahan Anda mudah (tidak ada konflik penggabungan yang harus ditangani), membuat permintaan penarikan Anda menjadi lebih mudah ketika Anda ingin pengelola proyek asli menyertakan patch Anda di proyeknya.

Tujuannya adalah untuk memungkinkan kolaborasi meskipun partisipasi langsung tidak selalu memungkinkan.


Fakta bahwa Anda mengkloning di sisi GitHub berarti Anda sekarang memiliki dua repositori "sentral" ("sentral" sebagai "terlihat dari beberapa kolaborator).
Jika Anda dapat menambahkannya secara langsung sebagai kolaborator untuk satu proyek, Anda tidak perlu mengelola yang lain satu dengan garpu.

bercabang di GitHub

Pengalaman penggabungan akan hampir sama, tetapi dengan tingkat tipuan ekstra (dorong terlebih dahulu pada garpu, lalu minta tarikan, dengan risiko evolusi pada repo asli membuat penggabungan maju Anda tidak maju cepat lagi) .
Itu berarti alur kerja yang benar adalah git pull --rebase upstream(rebase pekerjaan Anda di atas komit baru dari hulu), dan kemudian git push --force origin, untuk menulis ulang sejarah sedemikian rupa, komit Anda sendiri selalu di atas komit dari repo asli (hulu) .

Lihat juga:

VONC
sumber
3
Kami sedang mengembangkan proyek di rumah dan tidak ada masalah dalam menambahkan orang sebagai kolaborator. Tapi, kami ingin memahami jika mengarang proyek akan membuat perubahan penggabungan kembali ke proyek utama lebih sulit.
Pemrogram ulang
7
@reprogrammer: jika Anda dapat menambahkan kolaborator, maka forking tidak diperlukan. mereka dapat rebase secara lokal kemudian bergabung pada cabang target, dan kemudian mendorong langsung ke satu repo pusat, daripada harus mengelola dua repo pusat (yang asli dan garpu). Rebase akan hampir sama, tetapi dengan tipuan ekstra ketika garpu terlibat. Sekali lagi: tidak diperlukan di sini. Saya telah memperbarui jawaban saya.
VonC
14
Jujur, bahkan jika Anda tidak harus melakukannya, itu selalu merupakan ide yang baik untuk memiliki repo suci yang hanya dapat ditulis untuk pengembang senior, pemimpin tim atau orang "tepercaya" lainnya . Semua anggota tim lainnya harus bekerja di garpu mereka (~ kotak pasir) dan berkontribusi perubahan mereka dalam bentuk permintaan tarik. Karena DVCS memungkinkan, kami mengadaptasikannya sebagai "praktik terbaik" dan berhasil menggunakannya bahkan dalam proyek-proyek terkecil ...
intland
1
@intland sehingga Anda lebih menyukai "Alur kerja manajer-integrasi" seperti yang dijelaskan dalam stackoverflow.com/users/6309/vonc?tab=responses ? Karena telah memperkenalkan Git di perusahaan besar, saya cenderung mengadopsi alur kerja yang terpusat terlebih dahulu (lebih akrab bagi semua orang), sebelum beralih ke yang "Manajer-Integrasi".
VonC
15
Kita harus memanggil garpu "ranting" karena mereka patah cabang dan digunakan untuk memulai pohon baru. Hanya dua sen saya - saya suka idiom arboreal.
Eric
67

Inilah perbedaan tingkat tinggi:

Forking

Pro

  • Membuat cabang dipisahkan oleh pengguna
  • Mengurangi kekacauan dalam repositori utama
  • Proses tim Anda mencerminkan proses kontributor eksternal

Cons

  • Membuatnya lebih sulit untuk melihat semua cabang yang aktif (atau tidak aktif, dalam hal ini)
  • Berkolaborasi pada cabang lebih rumit (pemilik garpu perlu menambahkan orang tersebut sebagai kolaborator)
  • Anda perlu memahami konsep beberapa remote di Git
    • Membutuhkan pembukuan mental tambahan
    • Ini akan membuat alur kerja lebih sulit bagi orang yang tidak super nyaman dengan Git

Percabangan

Pro

  • Menyimpan semua pekerjaan yang dilakukan di sekitar proyek di satu tempat
  • Semua kolaborator dapat mendorong ke cabang yang sama untuk berkolaborasi di dalamnya
  • Hanya ada satu remote Git untuk berurusan dengan

Cons

  • Cabang yang ditinggalkan bisa menumpuk dengan lebih mudah
  • Proses kontribusi tim Anda tidak sesuai dengan proses kontributor eksternal
  • Anda perlu menambahkan anggota tim sebagai kontributor sebelum mereka dapat bercabang
Aidan Feldman
sumber
Apa yang dimaksud dengan "proses kontributor luar"?
Kars Barendrecht
1
@KarsBarendrecht Diperbarui untuk menggunakan istilah "kontributor eksternal". Seseorang yang tidak memiliki writeizin di repositori.
Aidan Feldman
45

Ini ada hubungannya dengan alur kerja umum Git. Anda tidak mungkin dapat mendorong langsung ke repositori proyek utama. Saya tidak yakin apakah repositori mendukung kontrol akses berbasis cabang proyek GitHub, karena Anda tidak ingin memberikan izin kepada siapa pun untuk mendorong ke cabang master misalnya.

Pola umum adalah sebagai berikut:

  • Fork repositori proyek asli untuk memiliki salinan GitHub Anda sendiri, yang kemudian akan diizinkan untuk mendorong perubahan.
  • Kloning repositori GitHub Anda ke mesin lokal Anda
  • Secara opsional, tambahkan repositori asli sebagai repositori jarak jauh tambahan pada repositori lokal Anda. Anda kemudian dapat mengambil perubahan yang dipublikasikan di repositori itu secara langsung.
  • Buat modifikasi dan komitmen Anda sendiri secara lokal.
  • Dorong perubahan Anda ke repositori GitHub Anda (karena Anda biasanya tidak akan memiliki izin menulis di repositori proyek secara langsung).
  • Hubungi pengelola proyek dan minta mereka untuk mengambil perubahan Anda dan meninjau / menggabungkan, dan biarkan mereka mendorong kembali ke repositori proyek (jika Anda dan mereka ingin).

Tanpa ini, sangat umum bagi proyek publik untuk membiarkan siapa pun mendorong komitmen mereka sendiri secara langsung.

Bruno
sumber
@RecoJohnson, yah ... Saya belum menggunakan kata "tarik" dalam jawaban saya (tapi "tarik" secara efektif "mengambil" + "menggabungkan" dalam istilah Git). Penggunaan "push" manakah yang menurut Anda salah?
Bruno
2
@RecoJohnson Anda sebagai pendorong kontributor ke garpu GitHub Anda; pengelola proyek menarik kontribusi Anda dari garpu Anda.
mljrg
1
Saya pikir asumsi bahwa Anda tidak mungkin ditugaskan kolaborator lebih benar di dunia open source daripada di banyak organisasi dengan tim pengembangan sekarang menggunakan git di mana tim pengembangan didefinisikan dengan baik. Saya pikir ini adalah perbedaan penting untuk dibuat dan yang tidak cukup dibuat, mungkin mengapa perusahaan seperti gitlab berkembang karena mereka memahami kebutuhan perusahaan dan kebutuhan untuk kontrol.
code4cause
9

Forking membuat repositori yang sama sekali baru dari repositori yang ada (cukup melakukan git clone di gitHub / bitbucket)

Garpu paling baik digunakan: ketika maksud 'split' adalah untuk membuat proyek yang independen secara logis, yang mungkin tidak akan pernah bersatu kembali dengan induknya.

Strategi cabang membuat cabang baru di repositori yang ada / berfungsi

Cabang paling baik digunakan: ketika mereka dibuat sebagai tempat sementara untuk bekerja melalui fitur, dengan maksud untuk menggabungkan cabang dengan asal.

Lebih spesifik: - Dalam proyek open source, pemilik repositori yang memutuskan siapa yang bisa mendorong ke repositori. Namun, gagasan open source adalah bahwa setiap orang dapat berkontribusi pada proyek.

Masalah ini diselesaikan dengan garpu: setiap kali pengembang ingin mengubah sesuatu dalam proyek open source, mereka tidak mengkloning repositori resmi secara langsung. Sebagai gantinya, mereka garpu untuk membuat salinan. Ketika pekerjaan selesai, mereka membuat permintaan tarik sehingga pemilik repositori dapat meninjau perubahan dan memutuskan apakah akan menggabungkannya ke proyeknya.

Pada intinya forking mirip dengan percabangan fitur, tetapi alih-alih membuat cabang, garpu repositori dibuat, dan alih-alih melakukan permintaan penggabungan, Anda membuat permintaan tarik.

Tautan di bawah ini memberikan perbedaan dengan cara yang dijelaskan dengan baik:

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

siapa saya
sumber
Pernyataan "terbaik digunakan" dalam jawaban ini tampaknya mengabaikan banyak masalah yang mencegah percabangan bekerja untuk hal-hal seperti proyek sumber terbuka, serta kenyataan bagaimana garpu digunakan di dunia nyata. Sangat umum untuk melihat garpu yang digunakan bersamaan dengan permintaan tarik untuk memungkinkan orang berkolaborasi pada proyek yang tidak semuanya memiliki izin untuk mengubah repositori yang diberikan secara langsung.
StriplingWarrior