Проще говоря, если вы собираетесь сесть на самолет без подключения к Интернету ... перед отъездом вы можете просто сделать git fetch origin <master>. Он будет загружать все изменения на ваш компьютер, но держать его отдельно от вашей локальной разработки / рабочей области.
В самолете вы можете внести изменения в свое локальное рабочее пространство, а затем объединить его с тем, что вы получили, и разрешить все возможные конфликты объединения без подключения к Интернету. И если кто-то не внес новые противоречивые изменения в удаленный репозиторий, то, как только вы прибудете в пункт назначения, вы сделаете это git push origin <branch>и отправитесь за кофе.
Из этого удивительного учебника Atlassian :
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/refs/remotes и .git/refs/heads/
Хм ... так что, если я не обновляю рабочую копию git fetch, то где я делаю изменения? Где Git выбирает новые коммиты?
Отличный вопрос Он помещает его куда-то изолированно от вашей рабочей копии. Но опять же где? Давайте выясним.
В каталоге вашего проекта (то есть, где вы делаете свои gitкоманды) выполните:
ls, Это покажет файлы и каталоги. Ничего крутого, я знаю.
Теперь делай ls -a. Это покажет точечные файлы , то есть файлы , начинающиеся с .вы затем сможете увидеть каталог с именем: .git.
- Есть
cd .git. Это, очевидно, изменит ваш каталог.
- Теперь самое интересное; делать
ls. Вы увидите список каталогов. Мы ищем refs. Есть cd refs.
- Интересно посмотреть, что находится внутри всех каталогов, но давайте сосредоточимся на двух из них.
headsи remotes. Используйте, cdчтобы проверить внутри них тоже.
- Все,
git fetch что вы делаете, будет обновлять элементы в /.git/refs/remotesкаталоге. Это не будет ничего обновлять в /.git/refs/headsкаталоге.
- Любой
git pull сначала сделает git fetch, обновит элементы в /.git/refs/remotesкаталоге, затем объединится с вашим локальным, а затем изменит заголовок внутри /.git/refs/headsкаталога.
Очень хороший ответ на этот вопрос также можно найти в разделе Где размещается «git fetch»? ,
Кроме того, ищите «Слеш нотацию» из поста соглашения о наименовании веток Git . Это поможет вам лучше понять, как Git размещает вещи в разных каталогах.
Чтобы увидеть реальную разницу
Просто делать:
git fetch origin master
git checkout master
Если удаленный мастер был обновлен, вы получите следующее сообщение:
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
(use "git pull" to update your local branch)
Если вы этого не сделали fetchи сделали, git checkout masterто ваш местный мерзавец не знал бы, что добавлено 2 коммита. И было бы просто сказать:
Already on 'master'
Your branch is up to date with 'origin/master'.
Но это устаревшее и неправильное. Это потому, что git даст вам обратную связь исключительно на основе того, что он знает. Он не обращает внимания на новые коммиты, которые еще не снесены ...
Есть ли способ увидеть новые изменения, сделанные в удаленном режиме при локальной ветке?
Некоторые IDE (например, XCode) очень умны и используют результат a git fetchи могут комментировать строки кода, которые были изменены в удаленной ветви вашей текущей рабочей ветви. Если эта строка была изменена как локальными изменениями, так и удаленной ветвью, то эта строка помечается красным. Это не конфликт слияния. Это потенциальный конфликт слияния. Это headps, который вы можете использовать для разрешения будущего конфликта слияния, прежде чем делать это git pullиз удаленной ветви.

Интересный совет:
Если вы загрузили удаленную ветку, например, сделали:
git fetch origin feature/123
Тогда это будет идти в ваш каталог удаленных. Это все еще не доступно для вашего локального каталога. Тем не менее, это упрощает вашу проверку в этой удаленной ветви с помощью DWIM (делайте то, что я имею в виду):
git checkout feature/123
вам больше не нужно делать:
git checkout -b feature/123 origin/feature/123
Подробнее об этом читайте здесь