Чим відрізняється тяга та клон у git?


237

Яка різниця між тим, що робити (після mkdir repoта після cd repo):

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

і

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

Я маю на увазі, очевидно, один коротший, але крім цього вони в основному роблять те саме?

Відповіді:


122

Вони в основному однакові, за винятком того, що клон буде встановлювати додаткові гілки дистанційного відстеження, а не лише майстер. Перегляньте сторінку чоловіка :

Клонує сховище в новоствореному каталозі, створює гілки віддаленого відстеження для кожної гілки в клонованому сховищі (видно за допомогою гілки git -r) та створює та перевіряє початкову гілку, яка розщелена з поточної активної гілки клонованого репозиторію.


10
git fetch - всі встановлюють додаткові гілки віддаленого відстеження, тому в основному вони однакові.
cmcculloh

251

git cloneтак ви отримуєте локальну копію наявного сховища для роботи. Зазвичай використовується лише один раз для даного сховища, якщо ви не хочете мати кілька робочих копій. (Або хочете отримати чисту копію після того, як зіпсуєте місцеву локальну ...)

git pull(або git fetch+ git merge) - це те, як ви оновлюєте локальну копію новими комісіями з віддаленого сховища. Якщо ви співпрацюєте з іншими, це команда, яку ви будете часто виконувати.

Як показує ваш перший приклад, можна емулювати git cloneза допомогою ряду інших команд git, але насправді це не так git pull"в основному те саме", що git clone(або навпаки).


4
Що конкретно, що робить git-клон, що не виконується послідовністю команд, що передбачають "git pull"?
cmcculloh

21
@cmcculloh: Нічого - послідовність, яку ви описуєте, ефективно виконує те, що робить "git clone". Справа в тому, що "git pull" використовується для того, щоб робити різні речі поза тим, що ви там робили, - не кажучи вже про те, що "git pull" насправді є саме комбінацією "git fetch; git merge <current branch> <origin / поточна гілка> ". IOW, ви могли б жити без клону та тягнути, якби дуже хотіли. Крім того, ви можете витягнути з сховищ, крім тих, з яких ви клонувались. Мені подобається думати про "клонування" як "зробіть мені локальну копію цього репо" та "потягніть" як "отримати мені оновлення з певного віддаленого".
ebneter

120

Мовою мирян ми можемо сказати:

  • Клон : Отримайте робочу копію віддаленого сховища.
  • Витягніть : я працюю над цим, будь ласка, повідомте мені про нові зміни, які можуть бути оновлені іншими.

3
Я думаю, що ваш визначення Pull можна сказати і для Clone
henrywright

10
Як ти можеш працювати над тим, що ти не клонував?
Джоті Пракаш

Я не розумію, що ти маєш на увазі?
henrywright

@henrywright сподіваюся, що відповідь ebneter відповість на ваше запитання
Mrk

41

git clone означає, що ви робите копію сховища у вашій системі.

git fork означає, що ви копіюєте сховище у свій обліковий запис Github.

git pull означає, що ви отримуєте останній змінений сховище.

git push означає, що ви повертаєте сховище після його зміни.

Поняття мирянина:

git cloneзавантажується і git pullоновлює.


9

клон : копіювання віддаленого сховища сервера на локальну машину.

тягнути : отримати нові зміни, які інші додали до вашої локальної машини.

Це різниця.

Клон зазвичай використовується для отримання віддаленої копії репо.

Потяг використовується для перегляду доданого коду товаришів по команді, якщо ви працюєте в командах.


5

git-клон використовується для завантаження саме того, що зараз працює у сховищі віддаленого сервера, та збереження його у папці вашої машини, де розміщений цей проект. Здебільшого він використовується лише тоді, коли ми збираємось завантажувати проект вперше. Після цього тягнути - кращий варіант.

git pull - це в основному (клонування (завантаження) + злиття) операція, і в основному використовується, коли ви працюєте як командна робота. Іншими словами, коли ви хочете останніх змін у цьому проекті, ви можете витягнути.


3

Міс Клон: Я отримую свіжий примірник для місцевих.

Містер Пулл: У мене він вже є локально, я просто його оновлюю.


Міс Клон: Я можу робити те, що ви робите! Ви просто моя підмножина.

Містер Пулл: Дітто!


Міс Клон: Ні, ви не створюєте. Це те, що я роблю:

  1. Створіть порожнє оголене сховище
  2. Населення гілок віддаленого відстеження
  3. Запустити git fetch без аргументів

Ви робите лише №3, а потім ви зливаєтесь, що мені не потрібно робити (моє свіже).

Містер Потяг: Штани-Smarty, нічого страшного, спочатку я зроблю "git init"! Тоді ми такі самі. Плюс у мене є додаткова можливість «злиття» на існуючому репо! Що робить мене найбільш використовуваною командою в Git;)


Творці Git: Тримайте коней, містер Пул, якщо з клоном або інітом використовується --bare або --mirror, ваше злиття не відбудеться. Він залишається лише для читання.


Занижена відповідь.
sinekonata

2

Хм, чого не вистачає, щоб побачити віддалену гілку "4.2", коли я тягну, як це роблю, коли клоную? Щось явно не тотожне.

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

проти

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

Я також повідомив про це, і підозрюю, що зміни в налаштуваннях git з часом є проблемою. У мене 1.9.5.msysgit на windows і 2.3.2-applegit-55 на mac.
AnneTheAgile

2

git clone URL ---> Повний проект або сховище буде завантажено як окремий каталог. а не лише зміни URL-адреси git pull ---> fetch + merge -> Він отримає лише ті зміни, які були зроблені, а не весь проект


1

Хоча git fetchкоманда вибере всі зміни на сервері, яких у вас ще немає, вона взагалі не змінить ваш робочий каталог. Він просто отримає дані для вас і дозволить вам об’єднати їх самі. Однак є команда, git pullяка називається, по суті, git fetchнегайно слідує git mergeв більшості випадків.

Детальніше: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Pulling


1
Хоча це посилання може відповісти на питання, краще включити сюди суттєві частини відповіді та надати посилання для довідки. Відповіді лише на посилання можуть стати недійсними, якщо пов’язана сторінка зміниться.
екад

0

Клон -: це створить точно повторювану копію проекту віддаленого сховища у вашій локальній машині.

Потягніть -: Припустимо, що двоє чи більше двох людей діляться одним сховищем. (Припустимо, інша особа звуть Syam) (Репозиторій - це місце, де існує ваш проект у Github) Тож якщо Syam вносить якісь зміни в тому самому проекті у своєму локальному і переміщує його у віддалене сховище. Отже, що б зміни не змінили Syam, ці зміни будуть не відображається у ваших місцевих. Отже, щоб відобразити ці нові зміни у вашому локальному регіоні, ви повинні використовувати git pull. Загалом ми використовуємо git pull для оновлення проекту.

Таким чином, ми використовуємо клони Git лише один раз, тоді як ми використовуємо git pull багато разів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.