Пошук уроків, статей та іншого контенту
Дізнаєтеся, як завантажувати нові коміти з віддаленого репозиторію без автоматичної зміни поточної гілки.
git fetchКоманда git fetch завантажує нові коміти, гілки та інші посилання з віддаленого репозиторію, але не застосовує ці зміни до поточної локальної гілки.
Це дає змогу спочатку переглянути отримані зміни, порівняти їх із локальним кодом і лише потім вирішити, як їх інтегрувати.
git fetch originУ цьому прикладі:
origin — назва віддаленого репозиторію;
Git завантажує нові об’єкти з origin;
локальні гілки не перемикаються;
оновлюються віддалені посилання, наприклад origin/main.
Після клонування репозиторію Git зазвичай створює віддалений репозиторій із назвою origin.
Гілка:
mainє локальною гілкою, а:
origin/mainє віддаленим посиланням, яке показує стан гілки main у репозиторії origin.
Після виконання:
git fetch originGit може перемістити origin/main на новий коміт, якщо у віддаленому репозиторії з’явилися нові зміни.
Локальна main при цьому не зміниться автоматично.
Стан гілок можна переглянути так:
git branch --allПриклад результату:
* main
remotes/origin/HEAD -> origin/main
remotes/origin/main
remotes/origin/feature/searchЗірочка показує поточну локальну гілку. Записи з remotes/origin/ — це віддалені гілки, відомі локальному репозиторію.
Уявімо, що ви працюєте в локальній гілці main, а інший розробник уже додав коміти до віддаленої main.
Спочатку перевірте поточний стан:
git statusПотім отримайте нові зміни:
git fetch originПісля цього порівняйте локальну гілку з віддаленою:
git log --oneline main..origin/mainЦя команда покаже коміти, які є в origin/main, але ще відсутні в локальній main.
Щоб переглянути зміни у файлах:
git diff main origin/mainЯкщо зміни потрібно додати до локальної гілки, це можна зробити окремою командою, наприклад:
git merge origin/mainДо виконання merge команда fetch не змінює вашу локальну гілку.
Можна отримати дані не з усього віддаленого репозиторію, а лише з конкретної гілки:
git fetch origin mainЦе завантажить нові коміти для гілки main із репозиторію origin і оновить посилання origin/main.
Для іншої гілки:
git fetch origin feature/searchПісля цього можна переглянути коміти віддаленої гілки:
git log --oneline origin/feature/searchВажливо: така команда не створює локальну гілку feature/search. Вона лише отримує дані та оновлює віддалене посилання.
Якщо у проєкті налаштовано кілька віддалених репозиторіїв, можна отримати зміни з усіх них:
git fetch --allНаприклад, це може бути корисно, якщо репозиторій має origin і upstream.
Щоб також видалити локальні віддалені посилання на гілки, яких уже немає на сервері, використовуйте:
git fetch --all --pruneПараметр --prune видаляє застарілі віддалені посилання. Він не видаляє ваші локальні гілки та не видаляє коміти з віддаленого репозиторію.
Для одного репозиторію:
git fetch origin --pruneПісля виконання fetch корисно перевірити, які гілки та коміти змінилися:
git branch -vvЦя команда показує:
локальні гілки;
гілки, за якими вони відстежують зміни;
чи випереджає локальна гілка віддалену;
чи відстає локальна гілка від віддаленої.
Переглянути останні коміти віддаленої гілки можна так:
git log --oneline --decorate --graph origin/mainА визначити різницю між локальною та віддаленою гілками — так:
git diff main..origin/mainНижче наведено послідовність команд для перевірки змін перед їхнім об’єднанням:
# Перевіряємо поточну гілку та незбережені зміни
git status
# Отримуємо нові коміти з віддаленого репозиторію
git fetch origin
# Переглядаємо коміти, яких немає в локальній main
git log --oneline main..origin/main
# Переглядаємо зміни у файлах
git diff main..origin/main
# За потреби об'єднуємо отримані зміни з локальною main
git merge origin/mainДо команди git merge локальна гілка main залишається без змін. Якщо під час перегляду ви вирішили не об’єднувати зміни, можна просто продовжити роботу або виконати інші дії.
git fetch і git pullОбидві команди отримують зміни з віддаленого репозиторію, але поводяться по-різному.
git fetch:
завантажує нові коміти;
оновлює віддалені посилання;
не об’єднує зміни з поточною гілкою;
не змінює робочі файли через інтеграцію отриманих комітів.
git pull за типовим сценарієм:
виконує fetch;
одразу інтегрує отримані зміни в поточну гілку через merge або налаштований механізм.
Тому git fetch краще використовувати, коли потрібно спочатку перевірити зміни:
git fetch origin
git diff HEAD..origin/mainА вже потім явно виконати потрібну операцію:
git merge origin/mainfetchGit зберігає коміти та пов’язані з ними об’єкти у локальному репозиторії. Після fetch вони стають доступними для перегляду, навіть якщо ще не належать поточній локальній гілці.
Наприклад, після отримання нового коміту:
A---B---C main
\
D---E origin/mainЛокальна main усе ще вказує на коміт C, а origin/main — на коміт E.
Коміти D та E уже завантажені локально, але ще не включені до main. Їх можна переглянути, порівняти або об’єднати:
git show origin/main
git log main..origin/main
git merge origin/mainfetch змінить локальну гілкуПісля:
git fetch originлокальна main не стане автоматично такою самою, як origin/main.
Щоб інтегрувати зміни, потрібно виконати окрему команду, наприклад:
git merge origin/mainПісля отримання змін важливо порівнювати локальну гілку з відповідним віддаленим посиланням:
git diff main..origin/mainЯкщо порівняти main із main, нові віддалені коміти не будуть враховані.
origin/main і локальною mainorigin/main не є другою робочою копією гілки main. Це локальне віддалене посилання, яке показує останній відомий стан main у origin.
Воно оновлюється під час fetch, але не використовується як поточна робоча гілка.
Команда:
git merge origin/mainможе спричинити конфлікти або додати зміни, які ви ще не переглядали.
Безпечніша послідовність:
git fetch origin
git log --oneline main..origin/main
git diff main..origin/main
git merge origin/mainfetch із незбереженими локальними змінамиgit fetch зазвичай не змінює робочі файли, тому незбережені зміни не повинні конфліктувати із самим завантаженням. Проте перед подальшим merge варто перевірити стан робочого дерева:
git statusНезбережені зміни можуть ускладнити об’єднання отриманих комітів.
git fetch завантажує нові коміти та посилання з віддаленого репозиторію.
Команда не змінює поточну локальну гілку автоматично.
Після fetch оновлюються посилання на кшталт origin/main.
Отримані коміти можна переглянути через git log, git diff і git show.
Для інтеграції змін потрібно окремо виконати merge або іншу відповідну операцію.
git fetch дає змогу контролювати процес і перевіряти зміни до їхнього об’єднання.
Параметр --prune видаляє застарілі віддалені посилання.