Apakah garpu Git sebenarnya adalah klon Git?

817

Saya terus mendengar orang mengatakan mereka mencari kode di Git. Git "fork" terdengar mencurigakan seperti Git "clone" ditambah beberapa kemauan psikologis (yang tidak berarti) untuk melupakan penggabungan di masa depan. Tidak ada perintah fork di Git, kan?

GitHub membuat garpu sedikit lebih nyata dengan menjepit korespondensi. Artinya, Anda menekan tombol garpu dan kemudian, ketika Anda menekan tombol tarik permintaan, sistem cukup pintar untuk mengirim email ke pemilik. Oleh karena itu, ini sedikit tarian di sekitar kepemilikan dan izin repositori.

Ya Tidak? Adakah kecemasan terhadap GitHub yang memperpanjang Git ke arah ini? Atau ada rumor Git menyerap fungsionalitas?

Brian
sumber
10
Ya, itu hanya jenis klon yang dilacak oleh database github.
Paŭlo Ebermann
15
Bukankah GitHub melakukan sesuatu yang istimewa untuk menghindari menggandakan persyaratan penyimpanan (pada server GitHub sendiri)?
Keith Thompson
18
Belum disebutkan: Menghapus repo pribadi akan menghapus semua forknya. Menghapus repo publik membuat garpu tetapi mempromosikan satu garpu menjadi repo induk baru. Jika bos Anda menjadikan repo publik Anda pribadi, itu merusak semua garpu yang ada dan Anda tidak akan dapat membuat permintaan tarik dari mereka ke repo pribadi. help.github.com/articles/…
Plato
Saya percaya (tanpa bukti karena GitHub tidak menunjukkan ini kepada kami) bahwa mekanisme sebenarnya di sini adalah "alternatif" Git. Dengan kata lain, garpu adalah klon cermin dengan --referencebekas. Bagaimana cara repo dan penghapusan publik ditangani sama sekali tidak jelas (pindah bergantian ke repo yang dipromosikan yang dipilih secara acak? Arahkan semua garpu ke beberapa alternatif umum yang bukan bagian dari garpu asli?) Tetapi penggunaan alternatif menjelaskan berbagai perilaku yang dapat diamati.
torek

Jawaban:

925

Fork , dalam konteks GitHub, tidak memperluas Git.
Ini hanya memungkinkan klon di sisi server.

Ketika Anda mengkloning repositori GitHub di workstation lokal Anda, Anda tidak dapat berkontribusi kembali ke repositori upstream kecuali jika Anda secara eksplisit dinyatakan sebagai "kontributor". Itu karena tiruan Anda adalah contoh terpisah dari proyek itu. Jika Anda ingin berkontribusi pada proyek, Anda dapat menggunakan forking untuk melakukannya, dengan cara berikut:

  • klon repositori GitHub pada akun GitHub Anda (itu adalah bagian "fork" , klon di sisi server)
  • berkontribusi komit ke repositori GitHub itu (itu ada di akun GitHub Anda sendiri, jadi Anda punya hak untuk mendorongnya)
  • sinyal setiap kontribusi menarik kembali ke repositori GitHub asli (yaitu bagian "tarik permintaan" melalui perubahan yang Anda buat pada repositori GitHub Anda sendiri)

Periksa juga " Alur Kerja GitHub Kolaboratif ".

Jika Anda ingin menyimpan tautan dengan repositori asli (juga disebut upstream), Anda perlu menambahkan remote merujuk repositori asli itu.
Lihat " Apa perbedaan antara asal dan hulu di GitHub? "

garpu dan hulu

Dan dengan Git 2.20 (Q4 2018) dan lebih banyak, mengambil dari garpu lebih efisien, dengan pulau delta .

VONC
sumber
6
"Ketika Anda mengkloning repo GitHub di workstation lokal Anda, Anda tidak dapat berkontribusi kembali ke repo hulu kecuali Anda secara eksplisit dinyatakan sebagai" kontributor "." --- Apakah ini tidak benar dengan "forking"? Tolong jelaskan.
chharvey
61
@ TestSubject528491 tidak, dengan garpu, itu berarti Anda mengkloning repo hulu sebagai repo Anda sendiri di sisi server GitHub. Kemudian Anda dapat secara lokal mengklon repo "garpu" baru itu di komputer Anda dan dengan bebas mendorongnya, karena Anda adalah pencipta dan pemilik garpu itu.
VonC
9
Bagi saya, intinya adalah Anda tidak bisa mengirimkan PR dari salinan lokal Anda kecuali Anda dinyatakan sebagai kontributor . Saya sudah terbiasa mengajukan PR dari repo lokal saya, tetapi itu karena saya selalu ditandai sebagai kontributor. Jika Anda memikirkannya, untuk mengirim PR, Anda harus mendorong cabang ke repo jarak jauh dan kemudian membuat PR. Saya kira masuk akal jika Anda tidak ingin orang acak membuat cabang di repo Anda. Dan Anda lebih suka mereka memotongnya dan mengirimkan PR dengan cara itu.
Adam Zerner
Saya telah melihat pendekatan jarak jauh "hulu" kedua di tempat lain, tetapi bukankah lebih mudah untuk menarik langsung dari "GitHub - Asli" ke "GitHub - Fork"? Pendekatan jarak jauh kedua tampaknya tidak berfungsi di Eclipse dan pengaturan eGit saya, gagal mendorong ke repo "GitHub - Fork" saya (tidak ada yang mendorong).
William T. Mallard
Sudahlah, info di sini link yang memberi saya beberapa wawasan. Sebagai kontributor, masuk akal untuk menarik dari "GitHub - Asli" ke "GitHub - Fork", lalu dari "- Fork" ke mesin lokal, tetapi jika Anda pemiliknya, Anda mungkin ingin menarik langsung dari "- Fork" saya pertama yang mengulas, menjalankan tes, dll. sebelum mendorong ke "- Asli".
William T. Mallard
135

Saya terus mendengar orang mengatakan kode forking di git. Git "fork" terdengar mencurigakan seperti git "clone" ditambah beberapa kemauan psikologis (yang tidak berarti) untuk melupakan penggabungan di masa depan. Tidak ada perintah fork di git, kan?

"Forking" adalah sebuah konsep, bukan perintah yang secara khusus didukung oleh sistem kontrol versi apa pun.

Jenis forking yang paling sederhana adalah identik dengan percabangan. Setiap kali Anda membuat cabang, terlepas dari VCS Anda, Anda telah "bercabang". Garpu-garpu ini biasanya cukup mudah untuk digabungkan kembali.

Jenis garpu yang Anda bicarakan, di mana pihak yang terpisah mengambil salinan lengkap kode dan pergi, tentu saja terjadi di luar VCS dalam sistem terpusat seperti Subversion. VCS terdistribusi seperti Git memiliki dukungan yang jauh lebih baik untuk forking seluruh basis kode dan secara efektif memulai proyek baru.

Git (bukan GitHub) secara native mendukung "forking" seluruh repo (yaitu, mengkloningnya) dalam beberapa cara:

  • ketika Anda mengkloning, sebuah remote disebut origin dibuat untuk Anda
  • secara default semua cabang di klon akan melacak originpadanannya
  • mengambil dan menggabungkan perubahan dari proyek asli yang Anda lakukan tidak mudah

Git membuat kontribusi perubahan kembali ke sumber garpu semudah meminta seseorang dari proyek asli untuk menarik dari Anda, atau meminta akses tulis untuk mendorong perubahan kembali sendiri. Ini adalah bagian yang membuat GitHub lebih mudah, dan terstandarisasi.

Adakah kecemasan terhadap Github yang memperluas git ke arah ini? Atau ada git yang menyerap fungsionalitas?

Tidak ada kegelisahan karena anggapan Anda salah. GitHub "memperluas" fungsi forking dari Git dengan GUI yang bagus dan cara standar mengeluarkan permintaan tarik, tetapi itu tidak menambah fungsionalitas ke Git. Konsep full-repo-forking dimasukkan ke dalam kontrol versi terdistribusi pada level fundamental. Anda dapat meninggalkan GitHub kapan saja dan masih terus mendorong / menarik proyek yang telah "bercabang".

meagar
sumber
6
Terima kasih atas jawaban Anda yang luar biasa. Saya hanya ingin menjelaskan, ini berarti, di luar konteks github saya bisa mengkloning beberapa X projectdi mesin saya. Jika saya membuat perubahan di lokal saya dan tidak memiliki akses tulis ke asal, saya akan mengirim email kepada penulis proyek untuk meminta penarikan. Dia akan membuat gideon bernama remote yang akan menjadi url ke klon lokal saya, dan dia bisa menarik, kan?
gideon
1
Jika Anda ingin berkontribusi perubahan Anda ke proyek Anda dapat menyimpannya ke file misalnya menggunakan git format-patch dan melampirkannya ke email ke seseorang yang memiliki akses tulis itu, atau Anda dapat memperoleh hosting Anda sendiri, mendorong pekerjaan Anda ke sana dan mengirim URL dalam email misalnya menggunakan perintah tarik-permintaan git. Repos pada workstation biasanya tidak dapat diakses secara online.
bdsl
Tapi ya, jika workstation Anda dapat diakses melalui internet ke pembuat proyek maka Anda cukup mengirim URL kepada mereka dan mereka dapat menambahkannya sebagai remote dan menariknya.
bdsl
1
Re: angst, satu-satunya bagi saya adalah bahwa tidak ada tautan atau tombol untuk mengklik untuk membuat tombol pull-from-my-repo-angle di mana GitHub memberi tahu Anda bahwa Anda 50 komitmen di belakang. Bukan masalah besar sekarang karena saya tahu mereka menggunakan istilah "Tarik Permintaan" untuk juga menyertakan permintaan untuk menarik dari hulu ke garpu GitHub Anda. Git itu sulit.
William T. Mallard
80

Ya, garpu adalah tiruan. Itu muncul karena, Anda tidak dapat mendorong ke salinan orang lain tanpa izin mereka . Mereka membuat salinannya untuk Anda ( garpu ), di mana Anda juga akan memiliki izin menulis.

Di masa depan jika pemilik sebenarnya atau pengguna lain dengan garpu menyukai perubahan Anda, mereka dapat menariknya kembali ke repositori mereka sendiri. Atau Anda dapat mengirim mereka "permintaan-tarik".

ssapkota
sumber
Bisakah saya mengkloning repositori ke mesin lokal saya, membuat cabang, lalu mengirimkan permintaan tarik ke pemilik asli? Tampaknya berlebihan untuk memiliki beberapa salinan repo yang di-host di seluruh GitHub, hanya untuk memfasilitasi pembaruan kode.
Casey
4
@Casey Anda hanya dapat mengirim permintaan tarik melalui GitHub dari GitHub sendiri dan Anda hanya dapat mengirim permintaan tarik GitHub dari cabang yang ada di GitHub. Jika Anda bukan kolaborator di Repositori yang bersangkutan, tidak ada cara bagi Anda untuk membuat cabang tempat Anda dapat memulai permintaan tarik GitHub. Tidak ada yang menghentikan Anda dari melakukannya melalui email dengan cara lama, tetapi GitHub tidak berperan dalam hal itu.
Beau Simensen
2
@Casey, alasannya adalah karena biasanya orang lain tidak memiliki akses URL ke workstation Anda. GitHub forkberarti ada salinan pekerjaan Anda di server GitHub, yang Anda bisa pushdan yang orang lain punya akses URL sehingga mereka bisa pull. Ini pull requesthanyalah cara standar untuk mendapatkan URL untuk salinan Anda (di GitHub) kepada mereka sehingga mereka dapat dengan mudah menariknya ke dalam repositori mereka.
Jesse Chisholm
Saya yakin ini adalah jawaban yang benar / diterima. Bayangkan kekacauan di adegan di mana tim 15-20 pengembang membuat cabang dan mendorong ke asal versus 15-20 pengembang memiliki salinan repositori yang sama dan membuat cabang sebanyak mungkin dan melakukan perubahan serta mendorongnya kembali. Kemudian Penulis repositori asli hanya dapat menarik perubahan yang diinginkannya.
Kishor Pawar
37

"Fork" dalam konteks ini berarti "Buat salinan kode mereka sehingga saya dapat menambahkan modifikasi saya sendiri". Tidak banyak lagi yang bisa dikatakan. Setiap klon pada dasarnya adalah garpu, dan tergantung pada yang asli untuk memutuskan apakah akan menarik perubahan dari garpu.

Daenyth
sumber
2
Secara khusus: "Buat salinan kode mereka on the GitHub serversehingga saya dapat menambahkan modifikasi saya sendiri and others can have URL access to my version". Sebagian besar stasiun kerja lokal tidak menawarkan akses URL bagi siapa pun untuk dapat menarik. Tetapi jika Anda menekan garpu Anda di server, maka mereka dapat memiliki URL untuk menariknya.
Jesse Chisholm
Pertanyaannya bukan tentang forking secara umum, tetapi tentang forking GitHub secara khusus.
reinierpost
26

Kloning melibatkan membuat salinan repositori git ke mesin lokal, sementara forking mengkloning repositori ke repositori lain. Kloning hanya untuk penggunaan pribadi (meskipun penggabungan di masa depan mungkin terjadi), tetapi dengan forking Anda menyalin dan membuka jalur proyek baru yang mungkin

Sam Johnson
sumber
11

Forking dilakukan ketika Anda memutuskan untuk berkontribusi pada suatu proyek. Anda akan membuat salinan seluruh proyek bersama dengan log sejarahnya. Salinan ini dibuat seluruhnya di repositori Anda dan setelah Anda melakukan perubahan ini, Anda mengeluarkan permintaan tarik. Sekarang terserah pemilik sumber untuk menerima permintaan tarik Anda dan memasukkan perubahan ke dalam kode asli.

Git clone adalah perintah aktual yang memungkinkan pengguna untuk mendapatkan salinan sumbernya. git clone [URL] Ini harus membuat salinan [URL] di repositori lokal Anda sendiri.

aliasav
sumber
10

Saya pikir garpu adalah salinan dari repositori lain tetapi dengan modifikasi akun Anda. misalnya, jika Anda mengkloning repositori lain secara lokal, asal objek jauh masih menggunakan akun dari siapa Anda mengkloning. Anda tidak dapat melakukan dan berkontribusi kode Anda. Ini hanya salinan kode murni. Jika tidak, Jika Anda membayar repositori, itu akan mengkloning repo dengan pembaruan pengaturan akun Anda di akun github Anda. Dan kemudian kloning repo dalam konteks akun Anda, Anda dapat melakukan kode Anda.

Daniel Shen
sumber
10

Ada kesalahpahaman di sini sehubungan dengan apa "garpu" itu. Garpu sebenarnya tidak lebih dari satu set cabang per-pengguna. Ketika Anda mendorong ke sebuah garpu, Anda benar-benar mendorong ke repositori asli, karena itu adalah repositori ONLY.

Anda dapat mencoba ini dengan mendorong ke suatu fork, mencatat komit dan kemudian pergi ke repositori asli dan menggunakan ID komit, Anda akan melihat bahwa komit tersebut "di" repositori asli.

Ini masuk akal, tetapi itu jauh dari jelas (saya hanya menemukan ini secara tidak sengaja baru-baru ini).

Ketika John forks repositori SuperProject apa yang tampaknya benar-benar terjadi adalah bahwa semua cabang di repositori sumber direplikasi dengan nama seperti "John.master", "John.new_gui_project", dll.

GitHub "menyembunyikan" si "John." dari kami dan memberi kami ilusi bahwa kami memiliki "salinan" sendiri dari repositori di GitHub, tetapi kami tidak dan tidak satu pun dibutuhkan.

Jadi cabang "master" cabang garpu saya sebenarnya bernama "Korporal.master", tetapi GitHub UI tidak pernah mengungkapkan ini, hanya menunjukkan kepada saya "master".

Ini cukup banyak apa yang saya pikir berjalan di bawah tenda tetap berdasarkan pada hal-hal yang telah saya lakukan baru-baru ini dan ketika Anda merenungkannya, desain yang sangat bagus.

Untuk alasan ini saya pikir akan sangat mudah bagi Microsoft untuk mengimplementasikan garpu Git dalam penawaran Layanan Tim Visual Studio mereka.

Hugh
sumber
Dear Hugh, setengah dari respons Anda sebenarnya salah - garpu adalah tiruan dari seluruh repositori dari satu akun pengguna ke akun pengguna lain, bersama dengan semua cabang dan riwayat. Saat Anda berkomitmen pada fork, tidak ada perubahan di repositori asli tempat Anda bercabang. Tapi selain beberapa kesalahpahaman di pihak Anda tentang apa itu "garpu", sekarang ada beberapa kabar baik: layanan Visual Studio Team sekarang termasuk fungsi "Fork". ;)
Sorin Postelnicu
1
@SorinPostelnicu sumber? Saya cenderung percaya Hugh di sini karena pengalaman pribadi dari garpu berperilaku dengan cara yang tidak konsisten dengan mereka menjadi klon sederhana dari repositori. Misalnya, ketika upstream dihapus, garpu dihapus (seperti yang disebutkan dalam komentar pada pertanyaan OP) dan kadang-kadang upstream akhirnya menggabungkan berbagai hal menjadi cabang-cabang garpu saya ketika menerima permintaan tarik, tanpa saya melakukan apa pun.
kentang
Memang ini tampaknya menjadi masalahnya. Lagipula itu akan sangat bodoh bagi GitHub untuk benar git clone- benar repositori baru (bahkan yang "telanjang") setiap kali seseorang menekan tombol "garpu" - itu akan menjadi pemborosan penyimpanan yang luar biasa, dan kemungkinan juga vektor serangan .
Greg A. Woods
7

Terlepas dari kenyataan bahwa kloning adalah dari server ke mesin Anda dan forking membuat salinan pada server itu sendiri, perbedaan penting adalah bahwa ketika kami mengkloning, kami benar-benar mendapatkan semua cabang, label, dll.

Tetapi ketika kita bercabang, kita sebenarnya hanya mendapatkan file saat ini di cabang master, tidak lain dari itu. Ini berarti kami tidak mendapatkan cabang lain, dll.

Karenanya jika Anda harus menggabungkan sesuatu kembali ke repositori asli, itu adalah gabungan antar-repositori dan pasti akan membutuhkan hak istimewa yang lebih tinggi.

Fork bukan perintah di Git; itu hanya konsep yang diimplementasikan GitHub. Remember Git dirancang untuk bekerja di lingkungan peer-to-peer tanpa perlu menyinkronkan hal-hal dengan salinan master apa pun. Server hanyalah rekan lain, tetapi kami melihatnya sebagai salinan utama.

Deepak GM
sumber
7
Hah? Garpu mengambil semua cabang, meskipun Anda harus tahu ke mana harus mencari (petunjuk:) git branch -a.
tripleee
3

Secara sederhana,

Ketika Anda mengatakan Anda forking -repositori, pada dasarnya Anda membuat salinan repositori asli di bawah ID GitHub Anda di akun GitHub Anda.

dan

Ketika Anda mengatakan sedang mengkloning repositori, Anda sedang membuat salinan lokal dari repositori asli di sistem Anda (PC / laptop) secara langsung tanpa memiliki salinan di akun GitHub Anda.

anoNewb
sumber