В чем разница между «git pull» и «git fetch»? - PullRequest
11016 голосов
/ 15 ноября 2008

Примечание модератора: Учитывая, что на этот вопрос уже отправлено шестьдесят семь ответов (некоторые из них удалены), подумайте, действительно ли вы добавив что-нибудь новое перед публикацией другого.

В чем различия между git pull и git fetch?

Ответы [ 40 ]

28 голосов
/ 28 июля 2014

С Pro Git & sect; 2.5 Основы Git - Работа с Remotes: извлечение и извлечение из ваших Remotes :

Важно отметить, что команда fetch извлекает данные в ваш локальный репозиторий - она ​​не автоматически объединить его с любой вашей работой или изменить то, что вы в данный момент работаю над. Вы должны объединить это вручную в свою работу когда будешь готов.

Если у вас настроена ветка для отслеживания удаленной ветки, вы можете использовать git pull команда для автоматического извлечения, а затем объединения удаленного перейти в вашу текущую ветку. Это может быть проще или больше удобный рабочий процесс для вас; и по умолчанию команда git clone автоматически настраивает вашу локальную главную ветку для отслеживания удаленного основная ветвь на сервере, с которого вы клонировали (при условии, что удаленный мастер ветка). Запуск git pull обычно извлекает данные из сервер, с которого вы изначально клонировали, и автоматически пытается объединить его в код, над которым вы сейчас работаете.

22 голосов
/ 12 июля 2015

git pull

Он выполняет две функции, используя одну команду.

Он выбирает все изменения, внесенные в удаленную ветвь, а затем объединяет эти изменения с вашей локальной ветвью. Вы также можете изменить поведение pull, передав --rebase. Разницу между слиянием и перебазированием можно прочитать здесь

git fetch

Git fetch выполняет только половину работы git pull. Он просто вносит удаленные изменения в локальный репозиторий, но не применяет их к вашим филиалам. Вы должны явно применить эти изменения. Это можно сделать следующим образом:

git fetch
git rebase origin/master
22 голосов
/ 25 сентября 2015

Нужно иметь в виду природу мерзавца. У вас есть пульты и ваши местные филиалы (не обязательно одинаковые). По сравнению с другими системами контроля источников это может немного озадачивать.

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

git fetch будет работать с удаленной веткой и обновлять вашу информацию.

На самом деле это тот случай, когда другие SWE работают в одной и той же ветке, и редко бывает в небольших сценариях с одним разработчиком - одной веткой - одним проектом.

Ваша работа в местном отделении все еще не повреждена. Чтобы внести изменения в вашу локальную ветку, вы должны объединить / перебазировать изменения из удаленной ветки.

git pull делает именно эти два шага (то есть - rebase для перебазирования вместо слияния)

Если ваша локальная история и удаленная история имеют конфликты, вы будете вынуждены выполнить слияние во время git push, чтобы опубликовать ваши изменения.

Таким образом, это действительно зависит от характера вашей рабочей среды и опыта, что использовать.

20 голосов
/ 17 августа 2015

С шпаргалка :

git fetch <remote> // Download all changes from <remote>, but don't integrate into HEAD
git pull <remote> <branch> // Download changes and directly merge/integrate into HEAD
15 голосов
/ 02 апреля 2016

Из того, что я понял,

Git pull - Снимает с указанного пульта (указанного пользователем) и мгновенно объединяет его в филиал, в котором мы сейчас находимся. Это в основном смесь команд Fetch и Merge.

Git Fetch - Это то же самое, что и Pull , но оно не будет объединяться. Таким образом, вы можете внимательно следить за файлами, прежде чем объединять их.

Этот URL должен быть полезен для дальнейшего понимания: Разница между git pull, git fetch и git clone (и git rebase).

13 голосов
/ 12 февраля 2019

Проще говоря, если вы собирались сесть на самолет без интернета ... перед отъездом вы можете просто сделать git fetch origin <master>. Он будет загружать все изменения на ваш компьютер, но держать его отдельно от вашей локальной разработки / рабочей области.

В самолете вы можете вносить изменения в локальное рабочее пространство, а затем объединять его с тем, что вы получили, и разрешать потенциальные конфликты объединения без Интернета. И если кто-то не сделал новые конфликтующие изменения в удаленном репо, то, как только вы прибудете в пункт назначения, вы сделаете git push origin <branch> и отправитесь за кофе


Из этого классного учебника Attlassian :

Команда git fetch загружает коммиты, файлы и ссылки из удаленный репозиторий в вашем локальном репо.

Извлечение - это то, что вы делаете, когда хотите увидеть, что есть у всех еще работал над. Это похоже на обновление SVN в том, что он позволяет вам видеть как развивалась центральная история, но это не заставляет вас на самом деле объединить изменения в вашем хранилище. Git изоляты загружен контент из существующего локального контента , он имеет абсолютно не влияет на вашу местную работу по развитию . Извлеченное содержимое должно быть явно извлечено с помощью команды git checkout. Это делает выбор безопасного способа просмотра коммитов перед их интеграцией с ваш локальный репозиторий.

При загрузке контента из удаленного репозитория доступны команды git pull и git fetch для выполнения задачи. Вы можете рассмотреть git fetch «безопасная» версия двух команд. Это будет скачать удаленный контент, но не обновлять рабочее состояние вашего локального репо, оставляя вашу текущую работу нетронутой. git pull более агрессивный Альтернативно, он будет загружать удаленный контент для активного локального ветвь и немедленно выполните git merge, чтобы создать коммит слияния для нового удаленного контента. Если у вас есть ожидающие изменения в процессе это вызовет конфликты и положит начало разрешению конфликтов слиянием поток.


С git pull:

  • Вы не получаете никакой изоляции.
  • Влияет на ваше местное развитие.
  • Его не нужно явно проверять. Потому что это неявно делает git merge.
  • Это в основном НЕ безопасно. Это агрессивно.
  • В отличие от git fetch, где он влияет только на .git/refs/remotes, git pull будет влиять как на .git/refs/remotes , так и .git/refs/heads/

Хммм ... так что если я не обновляю рабочую копию с git fetch, то где я делаю изменения? Где git fetch хранит новые коммиты?

Отличный вопрос. Он помещает его куда-то изолированно от вашей рабочей копии. Но опять же где? Давайте узнаем.

В каталоге вашего проекта (т. Е. Где вы выполняете команды git) выполните:

  1. ls. Это покажет файлы и каталоги. Ничего крутого, я знаю.

  2. Теперь сделайте ls -a. Это покажет точечные файлы , то есть файлы, начинающиеся с . После этого вы сможете увидеть каталог с именем: .git.

  3. Do cd .git. Это, очевидно, изменит ваш каталог.
  4. Теперь самое интересное; сделать ls. Вы увидите список каталогов. Мы ищем refs. Do cd refs.
  5. Интересно посмотреть, что находится внутри всех каталогов, но давайте сосредоточимся на двух из них. heads и remotes. Используйте cd, чтобы проверить внутри них тоже.
  6. ЛЮБОЙ git fetch, который вы делаете, будет обновлять элементы в каталоге /.git/refs/remotes. Он ничего не обновит в каталоге /.git/refs/heads.
  7. ЛЮБОЙ git pull сначала выполнит git fetch, обновит элементы в каталоге /.git/refs/remotes, затем объединится с вашим локальным сервером и затем изменит заголовок внутри каталога /.git/refs/heads.

Также можно найти очень хороший связанный ответ Где размещается "git fetch"?

Также обратите внимание на «Слеш нотацию» из Соглашения об именах веток Git post. Это поможет вам лучше понять, как git помещает вещи в разные каталоги

7 голосов
/ 01 февраля 2018

Кратко и просто:

git fetch: посмотрите, есть ли что-нибудь новое.

git pull: Возьмите новый материал и положите его поверх своего материала.

3 голосов
/ 22 декабря 2017

Git Fetch

Помогает вам узнать о последних обновлениях от git repository. Допустим, вы работаете в команде, используя GitFlow, где команда работает над несколькими branches (функции). С git fetch --all command вы можете узнать обо всех новых branches в repository.

В основном git fetch используется с git reset. Например, вы хотите вернуть все ваши локальные изменения в текущее состояние хранилища.

git fetch --all // get known about latest updates
git reset --hard origin/[branch] // revert to current branch state

Git pull

Эта команда обновляет ваше branch с текущим repository branch состоянием. Давайте продолжим с GitFlow. Множественная функция branches была веткой от merged до develop, и когда вы хотите разработать новые функции для проекта, вы должны перейти к разработке branch и выполнить git pull, чтобы получить текущее состояние develop branch

Документация для GitFlow https://gist.github.com/peterdeweese/4251497

2 голосов
/ 01 августа 2018

Я полагаю, что большинство ответов ответили на разницу достаточно хорошо. Я бы подчеркнул, когда вместо этого использовать.

Enter image description here

Извлечение может быть полезно, когда вам нужно получить обновление от других разработчиков, но при этом хотите продолжить свою работу беспрепятственно. Люди, которые часто хотят выходить из сети и работать, используют fetch, чтобы получать последние обновления, пока она / он не был в сети. Позже, когда она / он устраивает ее изменения, объединяет их из своей ветви в свое рабочее пространство.

Принимая во внимание, что люди, которые работают в сети и очень уверены в своих изменениях и хотят получить самый последний код и merge, используют pull. Я редко использую fetch, потому что для проверки последних обновлений я проверяю их через веб-сайт GitHub и всегда работаю в автономном режиме. Как я уже говорил, вы могли бы использовать для вышеупомянутого сценария.

1 голос
/ 24 ноября 2016

Git fetch синхронизирует каталог удаленного репозитория с вашим локальным. Он не объединит изменения файла / кода с удаленного в локальный филиал.

Git pull загружает изменения, относящиеся к вашей текущей локальной ветке, а затем объединяет их.

...