В чем разница между pull и clone в 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 branch -r), а также создает и извлекает начальную ветвь, которая разветвляется из текущей активной ветви клонированного репозитория.


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

251

git cloneэто то, как вы получаете локальную копию существующего хранилища для работы. Обычно он используется только один раз для данного репозитория, если только вы не хотите иметь несколько его рабочих копий. (Или хотите получить чистую копию после того, как испортили вашу местную копию ...)

git pull(или git fetch+ git merge) - как вы обновляете эту локальную копию новыми коммитами из удаленного репозитория. Если вы сотрудничаете с другими, это команда, которую вы будете часто выполнять.

Как показывает ваш первый пример, можно эмулировать git cloneс набором других команд git, но на самом деле это не тот случай, когда git pullвыполняется «в основном то же самое», что и git clone(или наоборот).


4
Что конкретно делает этот git clone, который не выполняется последовательностью команд, включающих git pull?
cmcculloh

21
@cmcculloh: Ничего - последовательность, которую вы описываете, эффективно выполняет то, что делает "git clone". Дело в том, что «git pull» используется для того, чтобы делать множество вещей помимо того, что вы там делали - не говоря уже о том, что «git pull» на самом деле является именно комбинацией «git fetch; git merge <текущая ветвь> <origin / текущая ветка> ". Я могу жить без клона и тянуть, если действительно хочешь. Кроме того, вы можете извлечь из репозиториев, отличных от того, из которого вы клонировали. Мне нравится думать о «клоне» как о «сделать мне локальную копию этого репо», а о «тянуть» - как «получить мне обновления с какого-то указанного пульта».
Ebneter

120

На языке мирян мы можем сказать:

  • Клон : получить рабочую копию удаленного хранилища.
  • Потяните : я работаю над этим, пожалуйста, дайте мне новые изменения, которые могут быть обновлены другими.

3
Я думаю, что ваше определение Pull также может быть сказано для Клона
Генрирайт

10
Как вы можете работать с чем-то, что вы не клонировали?
Джиоти Пракаш

Я не понимаю, что вы имеете в виду?
Генрирайт

@henrywright надеюсь, ответ Ebneter ответит на ваш вопрос
Мрк

42

git clone означает, что вы делаете копию хранилища в вашей системе.

git fork означает, что вы копируете репозиторий в свою учетную запись Github.

git pull означает, что вы получаете последний измененный репозиторий.

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

В терминах непрофессионала:

git cloneзагружается и git pullобновляется.


9

клон : копирование репозитория удаленного сервера на локальный компьютер.

pull : получать новые изменения, добавленные на локальный компьютер.

Это разница.

Клон обычно используется для удаленного копирования репо.

Pull используется для просмотра кода других партнеров, если вы работаете в команде.


5

git clone используется для того, чтобы просто загрузить именно то, что в данный момент работает в репозитории удаленного сервера, и сохранить его в папке вашего компьютера, где находится этот проект. В основном это используется только тогда, когда мы собираемся загрузить проект в первый раз. После этого тянуть - лучший вариант.

git pull - это, по сути, операция (клонирование (загрузка) + слияние), и в основном она используется, когда вы работаете в команде. Другими словами, когда вы хотите последние изменения в этом проекте, вы можете тянуть.


3

Мисс Клон: я получаю свежую копию для местных.

Мистер Пулл: У меня это уже есть на месте, я просто обновляю его.


Мисс Клон: я могу делать то, что вы делаете! Вы просто мое подмножество.

Мистер Пулл: То же самое!


Мисс Клон: Нет, вы не создаете. Вот что я делаю:

  1. Создать пустой голый репозиторий
  2. Заполните удаленное отслеживание ветвей
  3. Запустите git fetch без аргументов

Вы только делаете # 3, и затем вы сливаетесь, что мне не нужно делать (мое свежее).

Мистер Пулл: Умные штаны, ничего страшного, сначала я сделаю "git init"! Тогда мы одинаковы. Плюс у меня есть дополнительная возможность «слияния» в существующем репо! Что делает меня самой используемой командой в Git;)


Создатели Git: удерживайте своих лошадей, мистер Пулл, если --bare или --mirror используются с клоном или init, ваше слияние не произойдет. Это остается только для чтения.


Недооцененный ответ.
синеконата

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

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


1

Хотя git fetchкоманда извлечет все изменения на сервере, которых у вас еще нет, она вообще не изменит ваш рабочий каталог. Он просто получит данные для вас и позволит вам объединить их самостоятельно. Тем не менее, есть команда с именем, git pullкоторая в большинстве случаев git fetchсразу следует за a git merge.

Подробнее: https://git-scm.com/book/en/v2/Git-Branching-Remote-Branches#Pulling


1
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится.
ekad

0

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

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

Так что в основном мы используем git clone только один раз, тогда как мы используем git pull много раз.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.