Jaka jest różnica między ściąganiem a klonowaniem w git?


237

Jaka jest różnica między robieniem (po mkdir repoi cd repo):

git init
git remote add origin git://github.com/cmcculloh/repo.git
git fetch --all
git pull origin master

i

git clone git://github.com/cmcculloh/repo.git

To znaczy, oczywiście, że jeden jest krótszy, ale poza tym, czy w zasadzie robią to samo?

Odpowiedzi:


122

Są w zasadzie takie same, z tym wyjątkiem, że klon skonfiguruje dodatkowe gałęzie zdalnego śledzenia, a nie tylko master. Sprawdź stronę manuala :

Klonuje repozytorium w nowo utworzonym katalogu, tworzy zdalnie śledzące gałęzie dla każdej gałęzi w sklonowanym repozytorium (widoczne za pomocą git branch -r) oraz tworzy i sprawdza gałąź początkową, która jest rozwidlona z aktualnie aktywnej gałęzi sklonowanego repozytorium.


10
git fetch - wszystkie konfigurują dodatkowe gałęzie zdalnego śledzenia, więc w zasadzie są one takie same.
cmcculloh,

251

git clonejest sposobem uzyskania lokalnej kopii istniejącego repozytorium do pracy. Zwykle używa się go tylko raz dla danego repozytorium, chyba że chcesz mieć wiele jego roboczych kopii. (Lub chcesz uzyskać czystą kopię po zepsuciu lokalnego ...)

git pull(lub git fetch+ git merge) to sposób aktualizacji lokalnej kopii o nowe zatwierdzenia ze zdalnego repozytorium. Jeśli współpracujesz z innymi, będzie to polecenie, które będziesz często uruchamiać.

Jak pokazuje twój pierwszy przykład, można emulować git cloneza pomocą zestawu innych poleceń git, ale tak naprawdę nie jest tak, że git pullrobi się „zasadniczo to samo” co git clone(lub odwrotnie).


4
Co konkretnie robi klon git, czego nie osiąga sekwencja poleceń obejmująca „git pull”?
cmcculloh

21
@cmcculloh: Nic - opisana sekwencja skutecznie osiąga to, co robi „klon git”. Chodzi o to, że „git pull” służy do robienia różnych rzeczy poza tym, co tam zrobiłeś - nie wspominając o tym, że „git pull” jest w rzeczywistości dokładnie kombinacją „git fetch; git merge <bieżąca gałąź> <pochodzenie / obecny oddział> ”. IOW, możesz żyć bez klonowania i ciągnąć, jeśli naprawdę chcesz. Ponadto możesz pobierać z repozytoriów innych niż sklonowane. Lubię myśleć o „klonowaniu” jako „zrób mi lokalną kopię tego repozytorium”, a „ściągnij” jako „pobierz mi aktualizacje z określonego pilota”.
ebneter

120

W języku laików możemy powiedzieć:

  • Klon : pobierz kopię roboczą zdalnego repozytorium.
  • Pull : Pracuję nad tym, proszę o nowe zmiany, które mogą być aktualizowane przez innych.

3
Myślę, że twoją definicję Pull można również powiedzieć o Klonie
henrywright

10
Jak możesz pracować nad czymś, czego jeszcze nie sklonowałeś?
Jyoti Prakash

Nie rozumiem o co ci chodzi?
henrywright

@henrywright nadzieję, odpowiedź ebneter odpowie na twoje pytanie
Mr

41

git clone oznacza, że ​​tworzysz kopię repozytorium w swoim systemie.

git fork oznacza, że ​​kopiujesz repozytorium na swoje konto Github.

git pull oznacza, że ​​pobierasz ostatnie zmodyfikowane repozytorium.

git push oznacza, że ​​zwracasz repozytorium po modyfikacji.

W terminologii laika:

git clonepobiera i git pullodświeża.


9

klon : kopiowanie zdalnego repozytorium serwera na komputer lokalny.

pull : pobierz nowe zmiany, które inne zostały dodane do twojego komputera lokalnego.

To jest różnica.

Klonowanie jest zwykle używane do uzyskiwania zdalnej kopii repo.

Pull służy do wyświetlania kodu dodanego innym członkom zespołu, jeśli pracujesz w zespołach.


5

Klon git służy do pobierania dokładnie tego, co aktualnie działa na zdalnym repozytorium serwera i zapisywania go w folderze komputera, na którym jest umieszczony ten projekt. Najczęściej jest używany tylko wtedy, gdy zamierzamy załadować projekt po raz pierwszy. Po tym pull jest lepszą opcją.

git pull jest w zasadzie operacją (klonowanie (pobieranie) + scalanie) i jest najczęściej używany, gdy pracujesz jako praca zespołowa. Innymi słowy, jeśli chcesz najnowsze zmiany w tym projekcie, możesz wyciągnąć.


3

Panna Clone: ​​Dostaję nową kopię do lokalnego.

Pan Pull: Mam już lokalnie, po prostu aktualizuję.


Panna Clone: ​​Mogę robić to, co robisz! Jesteś tylko moim podzbiorem.

Pan Pull: Ditto!


Miss Clone: ​​Nie, nie tworzysz. Tym się właśnie zajmuję:

  1. Utwórz puste nagie repozytorium
  2. Wypełniaj oddziały zdalnego śledzenia
  3. Uruchom git fetch bez argumentów

Robisz tylko # 3, a następnie łączysz się, czego nie muszę robić (moje jest świeże).

Pan Pull: Smarty spodnie, nic wielkiego, najpierw zrobię „git init”! Więc jesteśmy tacy sami. Dodatkowo mam dodatkową funkcję „scalania” w istniejących repozytoriach! Co czyni mnie najczęściej używanym poleceniem w Git;)


Twórcy Git: Trzymaj swoje konie Mr Pull, jeśli --bare lub --mirror zostanie użyte z klonem lub init, twoje połączenie się nie stanie. Pozostaje tylko do odczytu.


Niedoceniana odpowiedź.
sinekonata

2

Hmm, czego brakuje, aby zobaczyć zdalną gałąź „4.2”, kiedy ciągnę, tak jak robię to, gdy klonuję? Coś wyraźnie nie jest identyczne.

tmp$  mkdir some_repo

tmp$  cd some_repo

some_repo$  git init
Initialized empty Git repository in /tmp/some_repo/.git/

some_repo$  git pull https://github.ourplace.net/babelfish/some_repo.git
  :
From https://github.ourplace.net/babelfish/some_repo
 * branch            HEAD       -> FETCH_HEAD

some_repo$  git branch
* master

vs

tmp$  rm -rf some_repo

tmp$  git clone https://github.ourplace.net/babelfish/some_repo.git
Cloning into 'some_repo'...
  :
Checking connectivity... done.

tmp$  cd some_repo

some_repo$  git branch
* 4.2

Zauważyłem to również i podejrzewam, że problemem są zmiany ustawień domyślnych git w czasie. Mam 1.9.5.msysgit w systemie Windows i 2.3.2-applegit-55 na komputerze Mac.
AnneTheAgile,

2

git clone URL ---> Cały projekt lub repozytorium zostaną pobrane jako osobny katalog. a nie tylko zmiany git pull URL ---> fetch + merge -> Pobierze tylko zmiany, które zostały wykonane, a nie cały projekt


1

Chociaż git fetchpolecenie usunie wszystkie zmiany na serwerze, których jeszcze nie masz, w ogóle nie zmodyfikuje katalogu roboczego. Po prostu zbierze dane i pozwoli ci je scalić samodzielnie. Istnieje jednak wywołane polecenie, git pullktóre w większości przypadków git fetchnastępuje natychmiast po nim git merge.

Czytaj więcej: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Pulling


1
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie.
ekad

0

Klon -: stworzy dokładnie zduplikowaną kopię projektu zdalnego repozytorium na komputerze lokalnym.

Pull -: Załóżmy, że dwie lub więcej osób korzysta z tego samego repozytorium. (Przypuśćmy, że inna osoba nazywa się Syam) (Repozytorium to miejsce, w którym twój projekt istnieje w Github). Więc jeśli Syam dokona pewnych zmian w tym samym projekcie w swoim lokalnym i przekaże go do zdalnego repozytorium, więc bez względu na to, jakie zmiany zrobił Syam, zmiany te będą nie odzwierciedlaj w twoim lokalnym. Aby odzwierciedlić te nowe zmiany w twoim lokalnym, musisz użyć git pull. Ogólnie używamy git pull do aktualizacji projektu.

Zasadniczo używamy git clone tylko raz, podczas gdy używamy git pull wiele razy.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.