Простіше кажучи, якщо ви збиралися скокнути на літак без будь-якого з’єднання з Інтернетом ... перед від'їздом ви могли просто зробити 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
Більше про це читайте тут