Czy widelce Git faktycznie są klonami Git?

817

Ciągle słyszę, jak ludzie mówią, że rozwidlają kod w Git. „Widelec” Gita brzmi podejrzanie jak „klon” Gita plus pewna (bezsensowna) psychologiczna chęć rezygnacji z przyszłych połączeń. W Git nie ma polecenia rozwidlenia, prawda?

GitHub sprawia, że ​​widelce stają się bardziej realne poprzez zszywanie korespondencji. Oznacza to, że naciskasz przycisk rozwidlenia, a później, gdy naciśniesz przycisk żądania pociągnięcia, system jest wystarczająco inteligentny, aby wysłać e-maila do właściciela. Dlatego jest to trochę tańcem wokół posiadania i uprawnień repozytorium.

Tak nie? Jakiś niepokój związany z rozszerzeniem Git w tym kierunku przez GitHub? A może jakieś pogłoski o tym, że Git absorbuje funkcjonalność?

Brian
źródło
10
Tak, to tylko rodzaj klonu, który jest śledzony przez bazę danych github.
Paŭlo Ebermann
15
Czy GitHub nie robi czegoś specjalnego, aby uniknąć podwojenia wymagań dotyczących miejsca (na własnych serwerach GitHub)?
Keith Thompson
18
Nie wspomniano jeszcze: Usunięcie prywatnego repozytorium powoduje usunięcie wszystkich jego widelców. Usunięcie publicznego repo zachowuje widelce, ale promuje jedno rozwidlenie jako nowe repozytorium nadrzędne. Jeśli twój szef uczyni twoje publiczne repo prywatnym, psuje wszystkie istniejące forki i nie będziesz mógł wysyłać od nich żądań ściągania do prywatnego repo. help.github.com/articles/…
Platon,
Wierzę (bez dowodu, ponieważ GitHub nam tego nie pokazuje), że faktycznym mechanizmem są tutaj „alternatywy” Gita. Innymi słowy, widelec jest klonem lustrzanym z --referenceużywanym. Dokładnie sposób, w jaki obsługiwane są repozytorium publiczne i skreślenia, nie jest wcale jasne (przesuwanie alternatyw do losowo wybranego promowanego repo? Wskazuje wszystkie rozwidlenia na jakąś wspólną alternatywę, która nie jest częścią oryginalnego rozwidlenia?), Ale użycie alternatywy wyjaśnia różne obserwowalne zachowania.
torek

Odpowiedzi:

925

Fork w kontekście GitHub nie rozszerza Git.
Pozwala tylko na klonowanie po stronie serwera.

Po sklonowaniu repozytorium GitHub na lokalnej stacji roboczej nie można wnosić wkładu do repozytorium nadrzędnego, chyba że zostanie wyraźnie zadeklarowany jako „współautor”. To dlatego, że twój klon jest osobną instancją tego projektu. Jeśli chcesz przyczynić się do projektu, możesz użyć forking, aby to zrobić, w następujący sposób:

  • sklonuj to repozytorium GitHub na swoim koncie GitHub (to jest część „fork” , klon po stronie serwera)
  • przyczynia się do zatwierdzania tego repozytorium GitHub (znajduje się ono na twoim koncie GitHub, więc masz pełne prawo do pushowania)
  • zasygnalizować każdy interesujący wkład z powrotem do oryginalnego repozytorium GitHub (to jest część „żądanie ściągnięcia” poprzez zmiany dokonane we własnym repozytorium GitHub)

Zobacz także „ Collaborative GitHub Workflow ”.

Jeśli chcesz zachować link do oryginalnego repozytorium (zwanego również nadrzędnym), musisz dodać zdalne odniesienie do tego oryginalnego repozytorium.
Zobacz „ Jaka jest różnica między źródłem a wyższym poziomem w GitHub?

widelec i pod prąd

A dzięki Git 2.20 (IV kwartał 2018 r.) I więcej pobieranie danych z widelca jest bardziej wydajne dzięki wyspom delta .

VonC
źródło
6
„Podczas klonowania repozytorium GitHub na lokalnej stacji roboczej nie można wnosić wkładu do repozytorium poprzedzającego, chyba że zostanie się wyraźnie zadeklarowanym jako„ współautor ”. --- Czy to nie jest prawda w przypadku „rozwidlenia”? Proszę wytłumacz.
chharvey
61
@ TestSubject528491 nie, z rozwidleniem, co oznacza, że ​​klonujesz repozytorium upstream jako własne repozytorium po stronie serwera GitHub. Następnie możesz lokalnie sklonować to nowe repozytorium „fork” na swoim komputerze i swobodnie odpychać je, ponieważ jesteś twórcą i właścicielem tego widelca.
VCC
9
Dla mnie kluczową kwestią jest to, że nie możesz przesłać dokumentu PR z lokalnej kopii, chyba że zostaniesz uznany za współpracownika . Jestem przyzwyczajony do przesyłania PR z mojego lokalnego repozytorium, ale to dlatego, że zawsze jestem oznaczony jako współpracownik. Jeśli się nad tym zastanowisz, aby przesłać PR, musisz wypchnąć gałąź do zdalnego repozytorium, a następnie utworzyć PR. Myślę, że ma to sens, jeśli nie chcesz, aby przypadkowi ludzie tworzyli gałęzie na Twoim repozytorium. I wolisz, żeby rozwidlili go i przesłali w ten sposób PR.
Adam Zerner
Widziałem drugie zdalne podejście „upstream” gdzie indziej, ale czy nie jest łatwiejsze przejście bezpośrednio z „GitHub - Original” do „GitHub - Fork”? Drugie zdalne podejście nie działało w mojej konfiguracji Eclipse i eGit, ponieważ nie udało mi się wypchnąć repozytorium „GitHub - Fork” (nic do popchnięcia).
William T. Mallard
Nieważne, link do informacji tutaj dał mi wgląd. Jako współpracownik sensowne jest przejście z „GitHub - Original” do „GitHub - Fork”, a następnie z „- Fork” na lokalną maszynę, ale jeśli jesteś właścicielem, prawdopodobnie chcesz pobrać bezpośrednio z mojego „- Fork” najpierw przejrzyj, uruchom testy itp., zanim przejdziesz do „- Original”.
William T. Mallard
135

Ciągle słyszę, jak ludzie mówią, że rozwidlają kod w git. Git „fork” brzmi podejrzanie jak git „clone” plus pewna (bezsensowna) psychologiczna gotowość do rezygnacji z przyszłych połączeń. W git nie ma polecenia rozwidlenia, prawda?

„Forking” to koncepcja, a nie polecenie obsługiwane przez jakikolwiek system kontroli wersji.

Najprostszy rodzaj rozwidlenia jest równoznaczny z rozgałęzianiem. Za każdym razem, gdy tworzysz oddział, niezależnie od VCS, „rozwidlasz”. Widelce te są zazwyczaj dość łatwe do scalenia.

Rodzaj rozwidlenia, o którym mówisz, w którym oddzielna strona bierze pełną kopię kodu i odchodzi, koniecznie dzieje się poza VCS w scentralizowanym systemie, takim jak Subversion. Rozproszony system VCS, taki jak Git, ma znacznie lepsze wsparcie dla tworzenia całej bazy kodu i skutecznego rozpoczynania nowego projektu.

Git (nie GitHub) natywnie obsługuje „rozwidlanie” całego repozytorium (tj. Klonowanie go) na kilka sposobów:

  • podczas klonowania origintworzony jest pilot o nazwie
  • domyślnie wszystkie gałęzie w klonie będą śledzić ich originodpowiedniki
  • pobieranie i scalanie zmian z oryginalnego projektu, z którego wykonałeś rozwidlenie, jest banalnie proste

Git sprawia, że ​​wkładanie zmian z powrotem do źródła rozwidlenia jest tak proste, jak proszenie kogoś z oryginalnego projektu, aby cię odciągnął, lub prośba o dostęp do zapisu, aby samodzielnie cofnąć zmiany. Jest to część, którą GitHub ułatwia i standaryzuje.

Jakiś niepokój z powodu Githuba, który rozszerza gita w tym kierunku? Lub jakieś pogłoski o tym, że git absorbuje funkcjonalność?

Nie ma niepokoju, ponieważ twoje założenie jest błędne. GitHub „rozszerza” funkcjonalność rozwidlania Gita o ładny GUI i znormalizowany sposób wysyłania żądań ściągania, ale nie dodaje tej funkcjonalności do Git. Koncepcja pełnego repo-forkingu została wprowadzona do rozproszonej kontroli wersji na podstawowym poziomie. Możesz zrezygnować z GitHub w dowolnym momencie i nadal kontynuować push / pull projektów, które „rozwidliłeś”.

Meagar
źródło
6
Dziękuję za twoją doskonałą odpowiedź. Chcę tylko wyjaśnić, co oznacza, że poza kontekstem github mógłbym sklonować trochę X projectna mojej maszynie. Jeśli dokonam zmian w moim lokalnym i nie mam dostępu do zapisu pochodzenia, wyślę e-mail do autora projektu z prośbą o ściągnięcie. Zrobi pilota zwanego gideon, który będzie adresem URL mojego lokalnego klona, ​​i będzie mógł ciągnąć, prawda?
gideon
1
Jeśli chcesz wnieść swój wkład do projektu, możesz albo zapisać go w plikach, np. Za pomocą git format-patch i dołączyć do wiadomości e-mail do osoby, która ma dostęp do zapisu, lub możesz uzyskać własny hosting, popchnij swoją pracę do tego i wyślij adres URL w wiadomości e-mail, np. za pomocą polecenia git request-pull. Repozytoria na stacjach roboczych zwykle nie są dostępne bezpośrednio w Internecie.
bdsl
Ale tak, jeśli twoja stacja robocza jest dostępna przez Internet dla autora projektu, możesz po prostu wysłać do nich adres URL, a on może dodać go jako zdalny i wyciągnąć z niego.
bdsl
1
Re: angst, jedyne takie dla mnie jest to, że nie ma linku ani przycisku do kliknięcia, aby utworzyć przycisk perspektywiczny pull-from-my-repo, w którym GitHub mówi, że masz 50 zobowiązań za sobą. Nie ma teraz biggie, skoro wiem, że używają terminu „Pull Request”, aby uwzględnić również prośby o pobranie z upstream do widelca GitHub. Git jest trudny.
William T. Mallard
80

Tak, widelec jest klonem. Okazało się, ponieważ nie można naciskać na kopie innych osób bez ich zgody . Robią dla ciebie kopię ( widelec ), gdzie również będziesz mieć uprawnienia do zapisu.

W przyszłości, jeśli faktyczny właściciel lub inni użytkownicy z widelcem takim jak twoje zmiany, mogą pobrać go z powrotem do własnego repozytorium. Możesz też wysłać im „żądanie ściągnięcia”.

ssapkota
źródło
Czy mogę po prostu sklonować repozytorium na komputerze lokalnym, utworzyć oddział, a następnie przesłać żądanie ściągnięcia do pierwotnego właściciela? Wydaje się zbędne, aby wiele kopii repozytoriów było hostowanych w całym GitHubie, tylko w celu ułatwienia aktualizacji kodu.
Casey
4
@Casey Możesz wysłać żądanie ściągnięcia za pośrednictwem GitHub z samego GitHub i możesz wysłać tylko żądanie ściągnięcia z gałęzi, która istnieje w GitHub. Jeśli nie jesteś współpracownikiem w danym repozytorium, nie możesz utworzyć oddziału, z którego można zainicjować żądanie ściągnięcia GitHub. Nic nie stoi na przeszkodzie, abyś zrobił to pocztą elektroniczną w tradycyjny sposób, ale GitHub nie odgrywa w tym żadnej roli.
Beau Simensen,
2
@Casey, powodem jest to, że normalnie inni nie mają dostępu do adresu URL Twojej stacji roboczej. GitHub forkoznacza, że ​​na serwerze GitHub znajduje się kopia twojej pracy, do której możesz pushi do której inni mają dostęp URL, aby mogli pull. Jest pull requestto tylko standardowy sposób na uzyskanie adresu URL kopii (na GitHub), aby mogli łatwo pobrać go do swojego repozytorium.
Jesse Chisholm,
Uważam, że powinna to być poprawna / zaakceptowana odpowiedź. Wyobraź sobie bałagan w scenie, w której zespół 15-20 programistów tworzących gałęzie i wypychających do źródła w porównaniu z 15-20 programistami posiadającymi własną kopię tego samego repozytorium i tworzącą tyle gałęzi oraz wprowadzającą zmiany i wypychającą ją z powrotem. Następnie autor oryginalnego repozytorium może pobierać tylko te zmiany, których chce.
Kishor Pawar
37

„Rozwidlenie” w tym kontekście oznacza „Zrób kopię ich kodu, aby móc dodawać własne modyfikacje”. Nie ma nic więcej do powiedzenia. Każdy klon jest w zasadzie widelcem i decyzja o tym, czy wyciągnąć zmiany z widelca, zależy od oryginału.

Daenyth
źródło
2
W szczególności: „Utwórz kopię ich kodu, on the GitHub serveraby móc dodawać własne modyfikacje and others can have URL access to my version”. Większość lokalnych stacji roboczych nie oferuje dostępu do adresu URL, aby ktokolwiek mógł je pobrać. Ale jeśli prześlesz do swojego rozwidlenia na serwerze, może on mieć adres URL ściągnięcia.
Jesse Chisholm,
Pytanie nie dotyczy ogólnie rozwidlenia, ale konkretnie rozwidlenia GitHub.
reinierpost
26

Klonowanie polega na utworzeniu kopii repozytorium git na maszynie lokalnej, podczas gdy rozwidlenie klonuje repozytorium do innego repozytorium. Klonowanie jest wyłącznie do użytku osobistego (chociaż mogą wystąpić przyszłe połączenia), ale przy rozwidleniu kopiujesz i otwierasz nową możliwą ścieżkę projektu

Sam Johnson
źródło
11

Rozwidlenie odbywa się, gdy zdecydujesz się wnieść wkład w jakiś projekt. Zrobiłbyś kopię całego projektu wraz z dziennikami historii. Ta kopia jest tworzona całkowicie w twoim repozytorium, a po dokonaniu tych zmian wydajesz polecenie ściągnięcia. Teraz to do właściciela źródła należy zaakceptowanie żądania ściągnięcia i włączenie zmian do oryginalnego kodu.

Klon Git to rzeczywiste polecenie, które pozwala użytkownikom uzyskać kopię źródła. git clone [URL] To powinno utworzyć kopię [URL] we własnym lokalnym repozytorium.

aliasav
źródło
10

Myślę, że fork jest kopią innego repozytorium, ale z modyfikacją twojego konta. na przykład, jeśli bezpośrednio klonujesz inne repozytorium lokalnie, źródło zdalnego obiektu nadal korzysta z konta, z którego klonujesz. Nie możesz zatwierdzić i przekazać swojego kodu. To tylko czysta kopia kodów. W przeciwnym razie, jeśli rozwidlisz repozytorium, sklonuje ono repozytorium z aktualizacją ustawienia twojego konta na twoim koncie github. A następnie klonowanie repozytorium w kontekście konta, możesz zatwierdzić swoje kody.

Daniel Shen
źródło
10

Istnieje nieporozumienie w odniesieniu do tego, czym jest „widelec”. Widelec jest w rzeczywistości niczym więcej niż zestawem oddziałów na użytkownika. Kiedy pchasz do rozwidlenia, w rzeczywistości robisz push do oryginalnego repozytorium, ponieważ jest to TYLKO repozytorium.

Możesz to wypróbować, pchając do rozwidlenia, odnotowując zatwierdzenie, a następnie przechodząc do oryginalnego repozytorium i używając identyfikatora zatwierdzenia, zobaczysz, że zatwierdzenie znajduje się „w” oryginalnym repozytorium.

Ma to wiele sensu, ale nie jest to wcale oczywiste (odkryłem to przypadkowo niedawno).

Gdy John rozwidla repozytorium SuperProject, wydaje się, że tak naprawdę dzieje się tak, że wszystkie gałęzie w repozytorium źródłowym są replikowane z nazwą taką jak „John.master”, „John.new_gui_project” itp.

GitHub „ukrywa” „Johna”. od nas i daje nam złudzenie, że mamy własną „kopię” repozytorium na GitHub, ale nie jesteśmy ani nie jesteśmy nawet potrzebni.

Więc gałąź „master” mojego widelca nosi nazwę „Korporal.master”, ale interfejs użytkownika GitHub nigdy tego nie ujawnia, pokazując mi tylko „master”.

Myślę, że tak właściwie dzieje się pod maską na podstawie rzeczy, które ostatnio robiłem, a kiedy się nad tym zastanowić, jest to bardzo dobry projekt.

Z tego powodu uważam, że Microsoft będzie bardzo łatwo wdrożyć widelce Git w swojej ofercie Visual Studio Team Services.

Hugh
źródło
Drogi Hugh, połowa twojej odpowiedzi jest w rzeczywistości nieprawidłowa - widelec to klon całego repozytorium od jednego konta użytkownika do innego konta użytkownika, wraz ze wszystkimi gałęziami i historią. Po zatwierdzeniu do rozwidlenia nic nie zmienia się w oryginalnym repozytorium, z którego rozwidlono. Ale oprócz tych kilku nieporozumień z twojej strony dotyczących tego, czym jest „widelec”, jest teraz dobra wiadomość: usługi Visual Studio Team obejmują teraz funkcję „widelca”. ;)
Sorin Postelnicu,
1
@SorinPostelnicu source? Mam skłonność wierzyć tutaj Hugh z powodu osobistego doświadczenia, że ​​widelce zachowują się w sposób niekonsekwentny, ponieważ są one prostym klonem repozytorium. Na przykład, kiedy upstream jest usuwany, widelce są usuwane (jak wspomniano w komentarzu do pytania OP), a czasami upstream kończy się łączeniem rzeczy w gałęziach moich widelców, gdy akceptuję żądanie pull, bez robienia czegokolwiek.
ziemniak
Rzeczywiście wydaje się, że tak jest. W końcu GitHub byłby niesamowicie głupi, gdyby dosłownie git clonecałkiem nowe repozytorium (nawet „nagie”) za każdym razem, gdy ktoś naciska przycisk „widelec” - byłoby to niewiarygodne marnotrawstwo pamięci, a prawdopodobnie również wektor ataku .
Greg A. Woods
7

Oprócz tego, że klonowanie odbywa się z serwera na komputer, a rozwidlenie polega na wykonaniu kopii na samym serwerze, istotną różnicą jest to, że podczas klonowania otrzymujemy wszystkie gałęzie, etykiety itp.

Ale kiedy rozwidlamy, w rzeczywistości otrzymujemy tylko bieżące pliki w gałęzi master, nic poza tym. Oznacza to, że nie otrzymujemy innych oddziałów itp.

Dlatego jeśli musisz scalić coś z powrotem do oryginalnego repozytorium, jest to scalanie między repozytoriami i na pewno będzie wymagać wyższych uprawnień.

Fork nie jest poleceniem w Git; to tylko koncepcja implementowana przez GitHub. Pamiętaj, że Git został zaprojektowany do pracy w środowisku peer-to-peer bez potrzeby synchronizowania elementów z dowolną kopią wzorcową. Serwer jest tylko kolejnym peerem, ale patrzymy na to jak na kopię główną.

Deepak GM
źródło
7
Co? Widelec dostaje wszystkie gałęzie, choć musisz wiedzieć, gdzie szukać (wskazówka:) git branch -a.
tripleee
3

Mówiąc najprościej

Kiedy mówisz, że rozwidlasz repozytorium, w zasadzie tworzysz kopię oryginalnego repozytorium pod swoim identyfikatorem GitHub na swoim koncie GitHub.

i

Kiedy mówisz, że klonujesz repozytorium, tworzysz lokalną kopię oryginalnego repozytorium w twoim systemie (PC / laptop) bezpośrednio, bez kopii na koncie GitHub.

anoNewb
źródło