Простіше кажучи, якщо ви збиралися скокнути на літак без будь-якого з’єднання з Інтернетом ... перед від'їздом ви могли просто зробити git fetch origin <master>. Це дозволило б отримати всі зміни на вашому комп'ютері, але тримайте його окремо від локальної розробки / робочої області.
У площині ви можете внести зміни до місцевого робочого простору, а потім об'єднати його з тим, що ви отримали, і вирішити потенційні конфлікти злиття, без підключення до Інтернету. І якщо хто - то не зробили нові зміни конфліктуючих в віддалене сховище , то після прибуття в пункті призначення ви могли б зробити git push origin <branch>і піти отримати кави.
З цього дивовижного підручника з атласу :
У 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 вплине як на ваше, так і на ваше.git/refs/remotes .git/refs/heads/
Гммм ... так що якщо я не оновлюю робочу копію git fetch, то де я вношу зміни? Де Git fetch зберігає нові зобов’язання?
Чудове запитання. Він розміщує його десь ізольовано від вашої робочої копії. Але знову ж де? Давай дізнаємось.
У каталозі вашого проекту (тобто, де ви виконуєте свої 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"? .
Крім того, шукайте "Slash notation" з гілки 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то ваш місцевий git не знав би, що додано 2 коміти. І це просто сказало б:
Already on 'master'
Your branch is up to date with 'origin/master'.
Але це застаріло і неправильно. Це тому, що git надасть вам відгук виключно на основі того, що він знає. Це не забуває про нові зобов'язання, які ще не знищили ...
Чи є можливість побачити нові зміни, внесені у віддалений під час роботи на філії локально?
Деякі IDE (наприклад, Xcode) є надзвичайно розумними та використовують результат a git fetchі можуть коментувати рядки коду, які були змінені у віддаленому відділенні поточної робочої гілки. Якщо цей рядок було змінено як локальними змінами, так і віддаленою гілкою, то цей рядок буде помічено червоним кольором. Це не конфлікт злиття. Це потенційний конфлікт злиття. Це заголовок, який можна використовувати для вирішення майбутнього конфлікту злиття, перш ніж робити git pullз віддаленої гілки.

Прикольна порада:
Якщо ви отримали віддалену гілку, наприклад, зробили:
git fetch origin feature/123
Тоді це перейде у ваш віддалений каталог. Він все ще не доступний у вашому локальному каталозі. Однак це спрощує реєстрацію до цієї віддаленої гілки за допомогою DWIM (Робіть, що я маю на увазі):
git checkout feature/123
вам більше не потрібно робити:
git checkout -b feature/123 origin/feature/123
Більше про це читайте тут