Setup and Config
Getting and Creating Projects
Basic Snapshotting
Branching and Merging
Sharing and Updating Projects
Inspection and Comparison
Patching
Debugging
External Systems
Server Admin
Guides
- gitattributes
- Command-line interface conventions
- Everyday Git
- Frequently Asked Questions (FAQ)
- Glossary
- Hooks
- gitignore
- gitmodules
- Revisions
- Submodules
- Tutorial
- Workflows
- All guides...
Administration
Plumbing Commands
-
2.53.0
2026-02-02
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 no changes
-
2.51.0
2025-08-18
- 2.50.1 no changes
-
2.50.0
2025-06-16
- 2.49.1 no changes
-
2.49.0
2025-03-14
- 2.47.1 → 2.48.2 no changes
-
2.47.0
2024-10-06
- 2.43.2 → 2.46.4 no changes
-
2.43.1
2024-02-09
-
2.43.0
2023-11-20
- 2.42.1 → 2.42.4 no changes
-
2.42.0
2023-08-21
- 2.39.4 → 2.41.3 no changes
-
2.39.3
2023-04-17
- 2.38.1 → 2.39.2 no changes
-
2.38.0
2022-10-02
- 2.35.1 → 2.37.7 no changes
-
2.35.0
2022-01-24
- 2.34.1 → 2.34.8 no changes
-
2.34.0
2021-11-15
- 2.33.2 → 2.33.8 no changes
-
2.33.1
2021-10-12
-
2.33.0
2021-08-16
- 2.30.1 → 2.32.7 no changes
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 no changes
-
2.29.0
2020-10-19
- 2.27.1 → 2.28.1 no changes
-
2.27.0
2020-06-01
- 2.25.1 → 2.26.3 no changes
-
2.25.0
2020-01-13
- 2.24.1 → 2.24.4 no changes
-
2.24.0
2019-11-04
- 2.23.1 → 2.23.4 no changes
-
2.23.0
2019-08-16
- 2.22.2 → 2.22.5 no changes
-
2.22.1
2019-08-11
-
2.22.0
2019-06-07
- 2.20.1 → 2.21.4 no changes
-
2.20.0
2018-12-09
- 2.19.1 → 2.19.6 no changes
-
2.19.0
2018-09-10
- 2.18.1 → 2.18.5 no changes
-
2.18.0
2018-06-21
- 2.17.1 → 2.17.6 no changes
-
2.17.0
2018-04-02
-
2.16.6
2019-12-06
-
2.15.4
2019-12-06
-
2.14.6
2019-12-06
-
2.13.7
2018-05-22
-
2.12.5
2017-09-22
- 2.10.5 → 2.11.4 no changes
-
2.9.5
2017-07-30
-
2.8.6
2017-07-30
- 2.7.6 no changes
-
2.6.7
2017-05-05
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
- 2.3.10 no changes
-
2.2.3
2015-09-04
-
2.1.4
2014-12-17
-
2.0.5
2014-12-17
СИНОПСИС
gitmerge[-n] [--stat] [--compact-summary] [--no-commit] [--squash] [--[no-]edit] [--no-verify] [-s<strategy>] [-X<strategy-option>] [-S[<keyid>]] [--[no-]allow-unrelated-histories] [--[no-]rerere-autoupdate] [-m<msg>] [-F<file>] [--into-name<branch>] [<commit>…]gitmerge(--continue|--abort|--quit)
ОПИС
Включає зміни з вказаних комітів (починаючи з моменту, коли їхні історії розійшлися з поточною гілкою) у поточну гілку. Ця команда використовується командою git pull для включення змін з іншого репозиторію, а також може використовуватися вручну для злиття змін з однієї гілки в іншу.
Припустимо, що існує наступна історія, а поточною гілкою є master:
A---B---C topic
/
D---E---F---G master
Тоді команда git merge topic застосує зміни, внесені у гілці topic з моменту її відгалуження від master (тобто від E) до її поточного коміту (C) поверх гілки master, і збереже результат у новому коміті разом з іменами двох батьківських комітів та повідомленням у журналі від користувача, що описує зміни. Перед операцією ORIG_HEAD встановлюється на кінцеву точку поточної гілки (G).
A---B---C topic
/ \
D---E---F---G---H master
Злиття зупиняється, якщо виникає конфлікт, який неможливо вирішити автоматично, або якщо під час ініціювання злиття було вказано параметр --no-commit. У цей момент ви можете виконати git merge --abort або git merge --continue.
Команда git merge --abort перерве процес злиття та спробує відновити стан, що існував до злиття. Однак, якщо на момент початку злиття були незбережені зміни (а особливо якщо ці зміни були додатково змінені після початку злиття), команда git merge --abort у деяких випадках не зможе відновити початкові (до злиття) зміни. Тому:
|
Warning
|
Не рекомендується виконувати команду git merge, якщо є значні зміни, що не зафіксовані: хоча це й можливо, у разі конфлікту ви можете опинитися в ситуації, з якої важко буде вийти.
|
ОПЦІЇ
-
--commit -
--no-commit -
Виконати обʼєднання та зафіксувати результат. Цю опцію можна використовувати для перевизначення параметра
--no-commit.З параметром
--no-commitвиконується обʼєднання, але процес зупиняється безпосередньо перед створенням коміту обʼєднання, щоб дати користувачеві можливість перевірити та додатково налаштувати результат обʼєднання перед фіксацією.Зверніть увагу, що оновлення з переходом вперед (fast-forward) не створюють коміт злиття, тому немає можливості зупинити ці злиття за допомогою
--no-commit. Отже, якщо ви хочете переконатися, що ваша гілка не буде змінена або оновлена командою злиття, використовуйте--no-ffразом з--no-commit. -
--edit -
-e -
--no-edit -
Перед фіксацією успішного механічного злиття слід запустити редактор, щоб додатково відредагувати автоматично згенероване повідомлення про злиття, завдяки чому користувач зможе пояснити та обґрунтувати це злиття. Для прийняття автоматично згенерованого повідомлення можна використати опцію
--no-edit(зазвичай це не рекомендується). Опція--edit(або-e) все ще корисна, якщо ви надсилаєте чернетку повідомлення з опцією-mз командного рядка та хочете редагувати цю чернетку в редакторі.Старі скрипти можуть розраховувати на те, що раніше користувачеві не дозволялося редагувати повідомлення журналу злиття. При виконанні команди
gitmergeу них відкриватиметься редактор. Щоб полегшити адаптацію таких скриптів до оновленої поведінки, на початку їхнього коду можна встановити значення змінної середовищаGIT_MERGE_AUTOEDITякno. -
--cleanup=<режим> -
Цей параметр визначає, як повідомлення злиття буде очищено перед комітом. Див. git-commit[1] для отримання додаткової інформації. Крім того, якщо <mode> має значення
scissors, scissors буде додано доMERGE_MSGперед передачею до механізму коміту у разі конфлікту злиття. -
--ff -
--no-ff -
--ff-only -
Вказує, як обробляється злиття, коли історія, що зливається, вже є нащадком поточної історії.
--ffє стандартним значенням, за винятком випадків злиття тегів з анотаціями (та, можливо, підписаних), які не зберігаються у своєму природному місці в ієрархіїrefs/tags/; у такому випадку використовується значення--no-ff.За допомогою параметра
--ff, коли можливо, виконувати злиття як перемотування вперед (fast-forward) (оновлювати лише вказівник гілки, щоб він відповідав обʼєднаній гілці; не створювати коміт злиття). Якщо неможливо (коли історія обʼєднання не є нащадком поточної історії), створювати коміт злиття.З опцією
--no-ffстворюється коміт злиття у всіх випадках, навіть якщо злиття можна було б виконати як перемотування вперед (fast-forward).З опцією
--ff-only, за можливості, виконувати злиття як перемотування вперед. Якщо це неможливо, відмовитися від злиття та завершити роботу з ненульовим статусом. -
-S[<key-id>] -
--gpg-sign[=<key-id>] -
--no-gpg-sign -
Підписати отриманий коміт злиття за допомогою GPG. Аргумент <key-id> є необов’язковим, а стандартним значенням є ідентифікатор автора коміту; якщо його вказано, він повинен бути вказаний у параметрі без пробілів. Параметр
--no-gpg-signдозволяє скасувати дію як конфігураційної змінноїcommit.gpgSign, так і попереднього параметра--gpg-sign. -
--log[=<n>] -
--no-log -
На додачу до назв гілок, додати до повідомлення журналу однорядкові описи не більше ніж <n> фактичних комітів, які об’єднуються. Див. також git-fmt-merge-msg[1].
З опцією
--no-logне виводити однорядкові описи з фактичних комітів, що обʼєднуються. -
--signoff -
--no-signoff -
Додає наприкінці повідомлення журналу коміту підпис
Signed-off-by, поставлений автором коміту. Значення такого підпису залежить від проєкту, до якого ви робите коміт. Наприклад, він може підтверджувати, що автор коміту має права на публікацію роботи відповідно до ліцензії проєкту або погоджується з певними запевненнями щодо авторів, такими як «Сертифікат походження розробника». (Див. https://developercertificate.org, щоб ознайомитися з тим, що використовується в ядрі Linux та проектах Git.) Зверніться до документації або керівництва проєкту, до якого ви робите внесок, щоб зрозуміти, як підписи використовуються в цьому проєкті.Опцію
--no-signoffможна використовувати для скасування попередньої опції--signoffу командному рядку.У Git немає (і не буде) змінної конфігурації, яка б стандартно вмикала опцію командного рядка
--signoff; детальніше див. елементcommit.signoffу gitfaq[7].
-
--stat -
-n -
--no-stat -
Показати diffstat в кінці злиття. diffstat також контролюється параметром конфігурації merge.stat.
З опціями
-nабо--no-statне показувати статистику змін (diffstat) в кінці злиття. -
--compact-summary -
Показати компактний зведений опис в кінці злиття.
-
--squash -
--no-squash -
Утворити робоче дерево та стан індексу так, ніби відбулося справжнє злиття (за винятком інформації про злиття), але фактично не виконувати коміт, не переміщувати
HEADі не записувати$GIT_DIR/MERGE_HEAD(щоб наступна командаgitcommitстворила коміт злиття). Це дозволяє створити єдиний коміт поверх поточної гілки, ефект якого є таким самим, як злиття іншої гілки (або декількох у випадку «octopus»).За допомогою
--no-squashвиконати злиття та зафіксувати результат. Цей параметр можна використовувати для перевизначення--squash.При використанні опції
--squashопція--commitє недопустимою і призведе до помилки. -
--verify -
--no-verify -
Стандартно виконуються хуки pre-merge та commit-msg. Якщо вказано параметр
--no-verify, їх виконання пропускається. Див. також githooks[5]. -
-s<стратегія> -
--strategy=<стратегія> -
Використовувати вказану стратегію злиття; її можна вказати кілька разів, щоб визначити порядок, у якому вони мають бути випробувані. Якщо опція
-sвідсутня, замість неї використовується вбудований список стратегій (ortпри злитті з однією вершиною,octopusв інших випадках). -
-X<option> -
--strategy-option=<option> -
Передати параметр, що визначає стратегію, безпосередньо до стратегії злиття.
-
--verify-signatures -
--no-verify-signatures -
Переконайтеся, що останній коміт бічної гілки, яка об’єднується, підписано дійсним ключем, тобто ключем із дійсним ідентифікатором (uid): у стандартній моделі довіри це означає, що ключ підписання був підписаний ключем, якому довіряють. Якщо останній коміт бічної гілки не підписано дійсним ключем, об’єднання не відбудеться.
-
--summary -
--no-summary -
Синоніми до
--statта--no-stat; вони застарілі та будуть видалені в майбутньому. -
-q -
--quiet -
Виконувати дії без виводу повідомлень. Мається на увазі
--no-progress. -
-v -
--verbose -
Докладний вивід.
-
--progress -
--no-progress -
Явне увімкнення/вимкнення функції «Прогрес». Якщо жодне з цих значень не вказано, хід виконання відображається, якщо стандартний потік помилок підключено до терміналу. Зверніть увагу, що не всі стратегії злиття можуть підтримувати показ ходу виконання.
-
--autostash -
--no-autostash -
Перед початком операції автоматично створити тимчасовий запис у сховку, записати його в посилання
MERGE_AUTOSTASHі застосувати після завершення операції. Це означає, що операцію можна виконувати на брудному робочому дереві. Однак слід бути обережними: остаточне застосування запису зі сховку після успішного злиття може призвести до серйозних конфліктів. -
Стандартно команда
gitmergeвідмовляється обʼєднувати історії, які не мають спільного предка. Цю опцію можна використовувати, щоб обійти це обмеження під час обʼєднання історій двох проєктів, які спочатку розвивалися незалежно один від одного. Оскільки такі випадки трапляються вкрай рідко, конфігураційної змінної, яка б увімкнула цю функцію в стандартному режимі, не існує і не планується додавати.
-
-m<msg> -
Встановлює повідомлення коміту, яке буде використовуватися для коміту злиття (якщо такий буде створено).
Якщо вказано
--log, до вказаного повідомлення буде додано короткий журнал комітів, що обʼєднуються.Команду
gitfmt-merge-msgможна використовувати для встановлення якісного стандартного повідомлення для автоматичних викликівgitmerge. Автоматизоване повідомлення може містити опис гілки. -
--into-name<branch> -
Створює стандартне повідомлення про злиття так, ніби злиття відбувається у гілку <branch>, замість назви тієї гілки, до якої насправді відбувається злиття.
-
-F<файл> -
--file=<файл> -
Отримати повідомлення коміту, яке буде використано для коміту злиття (якщо такий буде створено).
Якщо вказано
--log, до вказаного повідомлення буде додано короткий журнал комітів, що обʼєднуються. -
--rerere-autoupdate -
--no-rerere-autoupdate -
Після того, як механізм rerere повторно використає записане розвʼязання поточного конфлікту для оновлення файлів у робочому дереві, дозвольте йому також оновити індекс результатом розвʼязання.
--no-rerere-autoupdate— це гарний спосіб перевірити, що зробивrerere, та виявити потенційні помилки злиття, перш ніж занести результат до індексу за допомогою окремогоgitadd.
-
--overwrite-ignore -
--no-overwrite-ignore -
Перезаписувати ігноровані файли в результаті злиття без попередження. Це стандартна поведінка. Для скасування використовуйте опцію
--no-overwrite-ignore. -
--abort -
Перервати поточний процес розвʼязання конфліктів та спробувати відновити стан який був до початку процесу обʼєднання. Якщо запис autostash присутній, застосувати його до робочого дерева.
Якщо на початку злиття були присутні незафіксовані зміни в робочому дереві,
gitmerge--abortу деяких випадках не зможе їх реконструювати. Тому рекомендується завжди зафіксувати або зберегти зміни перед запускомgitmerge.gitmerge--abortє еквівалентомgitreset--merge, коли присутнійMERGE_HEAD, окрім випадків, коли також присутнійMERGE_AUTOSTASH, у цьому випадкуgitmerge--abortзастосовує запис stash до робочого дерева, тоді якgitreset--mergeзбереже збережені зміни у списку stash. -
--quit -
Ігнорувати поточне злиття. Залишити індекс та робоче дерево без змін. Якщо встановлено параметр
MERGE_AUTOSTASH, запис stash буде збережено у списку stash. -
--continue -
Якщо команда
gitmergeзупинилася через конфлікти, ви можете завершити злиття, виконавши командуgitmerge--continue(див. розділ «ЯК РОЗВʼЯЗУВАТИ КОНФЛІКТИ» нижче). - <commit>...
-
Коміти, це зазвичай вершини інших гілок, які потрібно обʼєднати з нашою гілкою. Якщо вказати більше одного коміту, буде створено злиття з більш ніж двома батьківськими комітами (яке жартома називають «злиттям Восьминога», Octopus merge).
Якщо в командному рядку не вказано жодного коміту, слід обʼєднати гілки віддаленого відстеження, які поточна гілка налаштована використовувати як своє джерело (upstream). Див. також розділ про налаштування на цій сторінці довідки.
Якщо вказано
FETCH_HEAD(і жодного іншого коміту), гілки, записані у файлі.git/FETCH_HEADпід час попереднього виконання командиgitfetchдля злиття, зливаються з поточною гілкою.
ПЕРЕВІРКИ ПЕРЕД ЗЛИТТЯМ
Перш ніж застосовувати зовнішні зміни, слід привести власні зміни до ладу та зберегти їх локально, щоб у разі конфліктів вони не були загублені. Див. також git-stash[1]. Команди git pull та git merge зупиняться, не виконавши жодних дій, якщо локальні незбережені зміни перекриваються з файлами, які git pull/git merge можуть оновлювати.
Щоб уникнути запису змін, що не стосуються злиття, команди git pull та git merge також припинять роботу, якщо в індексі зареєстровані будь-які зміни порівняно з комітом HEAD. (Залежно від використовуваної стратегії злиття можуть існувати окремі винятки з цього правила, але загалом індекс повинен збігатися з HEAD.)
Якщо всі вказані коміти вже є попередниками HEAD, команда git merge завершиться достроково з повідомленням «Already up to date» («Вже оновлено»).
ЗЛИТТЯ FAST-FORWARD
Часто вершина поточної гілки є пращуром вказаного коміту. Це найпоширеніший випадок, особливо при виконанні команди git pull: ви відстежуєте репозиторій-джерело, не зафіксували жодних локальних змін і тепер хочете оновити репозиторій до нової версії з джерела. У цьому випадку для збереження обʼєднаної історії не потрібен новий коміт; натомість HEAD (разом з індексом) оновлюється, щоб вказувати на вказаний коміт, без створення додаткового коміту злиття.
Цю поведінку можна придушити за допомогою опції --no-ff.
СПРАВЖНЄ ЗЛИТТЯ
За винятком випадків злиття fast-forward (див. вище), гілки, що обʼєднуються, повинні бути повʼязані між собою комітом злиття, в якому обидві гілки є його батьками.
Обʼєднана версія, що враховує зміни з усіх гілок, які потрібно об’єднати, фіксується, а ваш HEAD, індекс та робоче дерево оновлюються відповідно до неї. У робочому дереві можуть бути зміни, якщо вони не перетинаються; під час оновлення вони будуть збережені.
Якщо не зрозуміло, як узгодити зміни, відбувається наступне:
-
Вказівник
HEADзалишається незмінним. -
Посилання
MERGE_HEADналаштовується так, щоб вказувати на вершину іншої гілки. -
Шляхи, які були успішно об’єднані, оновлюються як у файлі індексу, так і у вашому робочому дереві.
-
У разі конфлікту шляхів індексний файл фіксує до трьох версій: у stage 1 зберігається версія від спільного предка, у stagе 2 — від
HEAD, а у stage 3 — відMERGE_HEAD(переглянути stage можна за допомогою командиgitls-files-u). Файли робочого дерева містять результат операції злиття, тобто результати тристороннього злиття зі знайомими маркерами конфлікту <<<===>>>. -
Створюється посилання з іменем
AUTO_MERGE, яке вказує на дерево, що відповідає поточному вмісту робочого дерева (включно з маркерами конфліктів для текстових конфліктів). Зверніть увагу, що це посилання створюється лише у разі використання стратегії злиттяort(зазвичай). -
Жодних інших змін не вноситься. Зокрема, локальні зміни, які ви мали до початку злиття, залишаться незмінними, а записи індексу для них залишаться такими, якими вони були, тобто збігатимуться з
HEAD.
Якщо ви спробували злиття, яке призвело до складних конфліктів, і хочете почати спочатку, ви можете відновити його за допомогою git merge --abort.
ОБʼЄДНАННЯ ТЕГА
Під час злиття тегу з анотацією (і, можливо, з підписом) Git завжди створює коміт злиття, навіть якщо можливе злиття методом «fast-forward», а шаблон повідомлення про коміт заповнюється текстом тегу. Крім того, якщо тег підписано, результат перевірки підпису відображається у вигляді коментаря в шаблоні повідомлення. Див. також git-tag[1].
Якщо ви хочете просто інтегрувати зміни, що передують коміту, який випадково має тег, наприклад, для синхронізації з версією випуску upstream, вам, можливо, не варто створювати зайвий коміт злиття.
У такому випадку ви можете самостійно «розгорнути» тег перед тим, як передати його команді git merge, або вказати параметр --ff-only, якщо у вас немає власних змін. Наприклад:
git fetch origin git merge v1.2.3^0 git merge --ff-only v1.2.3
ЯК ПОДАЮТЬСЯ КОНФЛІКТИ
Під час злиття файли робочого дерева оновлюються, щоб відобразити результат злиття. Серед змін, внесених до версії спільного предка, ті, що не перекриваються (тобто ви змінили частину файлу, тоді як інша сторона залишила цю частину без змін, або навпаки), включаються до кінцевого результату дослівно. Однак, коли обидві сторони внесли зміни до однієї й тієї ж частини, Git не може довільно вибрати одну сторону замість іншої і просить вас виправити ситуацію, лишивши те, що обидві сторони зробили з цією частиною.
Зазвичай Git використовує той самий стиль, що й програма «merge» з набору RCS, для відображення такого фрагмента з конфліктом, наприклад:
Ось рядки, які або залишилися без змін порівняно зі спільним предком, або розвʼязані без конфліктів, оскільки змінилася лише одна сторона, або розвʼязані без конфліктів, оскільки обидві сторони змінилися однаково. <<<<<<< ваш:sample.txt Розвʼязання конфліктів — це складно; Ходімо на закупи. ======= Git спрощує розв’язання конфліктів. >>>>>>> їхній:sample.txt А ось ще один рядок, який розв’язано без конфліктів або який залишився без змін.
Місце, де відбулася пара суперечливих змін, позначено маркерами <<<<<<<, ======= та >>>>>>>. Частина перед ======= зазвичай належить вам, а частина після — іншій стороні.
У стандартному форматі не показується, що саме було написано в оригінальному тексті у місці, де виникли розбіжності. Неможливо визначити, скільки рядків було видалено та замінено коментарем Барбі у вашій частині тексту. Єдине, що можна зрозуміти, — це те, що у вашій частині йдеться про те, що це складно і ви б воліли піти на закупи, тоді як у частині опонента стверджується, що це легко.
Альтернативний стиль можна використовувати, встановивши змінну конфігурації merge.conflictStyle на diff3 або zdiff3. У стилі diff3 вищезгаданий конфлікт може виглядати так:
Ось рядки, які або залишилися без змін порівняно зі спільним предком, або розвʼязані без конфліктів, оскільки змінилася лише одна сторона, <<<<<<< ваш:sample.txt або розвʼязані без конфліктів, оскільки обидві сторони змінилися однаково. Розвʼязання конфліктів — це складно; Ходімо на закупи. ||||||| базовий:sample.txt або розвʼязані без конфліктів, оскільки обидві сторони змінилися однаково. Розвʼязання конфліктів — це складно. ======= або розвʼязані без конфліктів, оскільки обидві сторони змінилися однаково. Git спрощує вирішення конфліктів. >>>>>>> їхній:sample.txt А ось ще один рядок, який розв’язано без конфліктів або який залишився без змін.
в той час як в zdiff3 це може виглядати так:
Ось рядки, які або залишилися без змін порівняно зі спільним предком, або розвʼязані без конфліктів, оскільки змінилася лише одна сторона, або розвʼязані без конфліктів, оскільки обидві сторони змінилися однаково. <<<<<<< ваш:sample.txt Розвʼязання конфліктів — це складно; Ходімо на закупи. ||||||| base:sample.txt або розвʼязані без конфліктів, оскільки обидві сторони змінилися однаково. Розвʼязання конфліктів — це складно. ======= Git спрощує вирішення конфліктів. >>>>>>> їхній:sample.txt А ось ще один рядок, який розв’язано без конфліктів або який залишився без змін.
Окрім маркерів <<<<<<<, ======= та >>>>>>>, тут використовується ще один маркер |||||||, за яким йде оригінальний текст. З цього можна зрозуміти, що в оригіналі йшлося про констатацію факту, і ваша сторона просто погодилася з цим твердженням та поступилася, тоді як інша сторона намагалася зайняти більш позитивну позицію. Іноді, переглянувши оригінал, можна знайти краще рішення.
ЯК РОЗВʼЯЗУВАТИ КОНФЛІКТИ
Після виявлення конфлікту ви можете зробити дві речі:
-
Відмовитися від злиття. Єдине, що потрібно зробити для прибирання, — це скинути файл індексу до коміту
HEAD, щоб скасувати stage 2, та прибрати зміни у робочому дереві, внесені stage 2 і 3; для цього можна використати командуgitmerge--abort. -
Розвʼязати конфлікти. Git позначить конфлікти у робочому дереві. Відредагуйте файли та додайте їх до індексу за допомогою команди
gitadd. Використовуйтеgitcommitабоgitmerge--continue, щоб завершити операцію. Остання команда перевіряє, чи триває (перерване) злиття, перш ніж запускатиgitcommit.
Ви можете розвʼязати конфлікт за допомогою різних інструментів:
-
Використайте mergetool.
gitmergetoolзапускає графічний інтерфейс mergetool, який допоможе вам виконати злиття. -
Перегляньте diff. Команда
gitdiffпокаже тристоронню різницю, виділивши зміни як у версіїHEAD, так і в версіїMERGE_HEAD. КомандаgitdiffAUTO_MERGEпокаже, які зміни ви внесли до цього моменту для вирішення текстових конфліктів. -
Перегляньте відмінності з кожної гілки.
gitlog--merge-p<шлях> спочатку покаже відмінності для версіїHEAD, а потім для версіїMERGE_HEAD. -
Подивіться на оригінали.
gitshow:1:filenameпоказує спільного предка,gitshow:2:filenameпоказує версіюHEAD, аgitshow:3:filenameпоказує версіюMERGE_HEAD.
ПРИКЛАДИ
-
Злиття гілок
fixesта `enhancements ` у поточну гілку, шляхом використання стратегії злиття "octopus":$ git merge fixes enhancements
-
Злиття гілки
obsoleteу поточну гілку, використовуючи стратегію злиттяours:$ git merge -s ours obsolete
-
Злиття гілки
maintз поточною гілкою, але без автоматичного створення нового коміту:$ git merge --no-commit maint
Це можна використовувати, коли ви хочете включити подальші зміни до злиття або хочете написати власне повідомлення коміту злиття.
Не слід зловживати цією опцією, щоб непомітно внести суттєві зміни в коміт злиття. Невеликі виправлення, такі як підвищення номера версії, є прийнятними.
СТРАТЕГІЇ ЗЛИТТЯ
Механізм злиття (команди git merge та git pull) дозволяє вибирати бекенд-«стратегії злиття» за допомогою опції -s. Деякі стратегії також можуть приймати власні опції, які можна передати, надаючи аргументи -X<опція> командам git merge та/або git pull.
-
ort -
Це стандартна стратегія злиття при витягуванні або злитті однієї гілки. Ця стратегія дозволяє об’єднати лише дві вершини за допомогою алгоритму тристороннього злиття. Коли існує більше ніж один спільний предок, який можна використати для тристороннього злиття, вона створює злите дерево спільних предків і використовує його як дерево-орієнтир для тристороннього злиття. За результатами тестів, проведених на реальних комітах злиття, взятих з історії розробки ядра Linux 2.6, це призводить до меншої кількості конфліктів злиття без створення помилкових злиттів. Крім того, ця стратегія може виявляти та обробляти злиття, що містять перейменування. Вона не використовуватиме виявлені копії. Назва цього алгоритму є акронімом («Ostensibly Recursive’s Twin») і походить від того, що він був написаний як заміна попереднього стандартного алгоритму,
recursive.Якщо шлях вказує на субмодуль, і коміт субмодуля, який використовується в одній частині злиття, є нащадком коміту субмодуля, що використовується в іншій частині злиття, Git намагається виконати швидкий перехід до цього нащадка. В іншому випадку Git розглядає цю ситуацію як конфлікт і пропонує в якості розвʼязання коміт субмодуля, який є нащадком комітів, що конфліктують, якщо такий існує.
Стратегія
ortможе приймати такі варіанти:-
ours -
Ця опція змушує систему автоматично розвʼязувати конфлікти між фрагментами коду, надаючи перевагу «нашій» версії. Зміни з іншого дерева, які не суперечать нашій версії, враховуються в результаті злиття. У випадку з бінарним файлом весь вміст береться з нашої версії.
Це не слід плутати зі стратегією злиття
ours, яка взагалі не враховує вміст іншого дерева. Вона відкидає всі зміни, внесені в іншому дереві, і вважає, що «наша» історія містить усе, що там відбувалося. -
theirs -
Це протилежність параметру
ours; зверніть увагу, що, на відміну відours, не існує стратегії злиттяtheirs, з якою можна було б сплутати цей параметр злиття. -
ignore-space-change -
ignore-all-space -
ignore-space-at-eol -
ignore-cr-at-eol -
Для цілей тристороннього злиття рядки, що містять вказаний тип змін пробілів, розглядаються як незмінені. Зміни пробілів, що поєднуються з іншими змінами в рядку, не ігноруються. Див. також git-diff[1]
-b,-w,--ignore-space-at-eolта--ignore-cr-at-eol.-
Якщо «їхня» версія передбачає лише зміну пробілів у рядку, використовується «наша» версія;
-
Якщо «наша» версія містить зміни пробілів, але «їхня» версія містить суттєві зміни, використовується «їхня» версія;
-
В іншому випадку обʼєднання відбувається у звичайному порядку.
-
-
renormalize -
Ця опція виконує перевірку та реєстрацію всіх трьох стадій будь-якого файлу, який потребує тристороннього злиття. Цю опцію слід використовувати під час злиття гілок із різними фільтрами очищення або правилами нормалізації кінців рядків. Детальніше див. розділ «Злиття гілок із різними атрибутами checkin/checkout» у статті gitattributes[5].
-
no-renormalize -
Вимикає опцію
renormalize. Це замінює змінну конфігураціїmerge.renormalize. -
find-renames[=<n>] -
Вимкає виявлення перейменувань, за бажанням встановивши поріг схожості. Це значення є типовим. Воно має пріоритет над змінною конфігурації
merge.renames. Див. також git-diff[1]--find-renames. -
rename-threshold=<n> -
Застарілий синонім до
find-renames=<n>. -
no-renames -
Вимикає виявлення перейменування. Перевизнає змінну конфігурації
merge.renames. Див. також git-diff[1]--no-renames. -
histogram -
Застарілий синонім до
diff-algorithm=histogram. -
patience -
Застарілий синонім до
diff-algorithm=patience. -
diff-algorithm=(histogram|minimal|myers|patience) -
Під час злиття використовувати інший алгоритм порівняння, що допоможе уникнути помилкових злиттів, які виникають через неважливі збіги рядків (наприклад, дужки з різних функцій). Див. також git-diff[1]
--diff-algorithm. Зверніть увагу, що дляortстандартним значенням єdiff-algorithm=histogram, тоді як для звичайних порівнянь наразі використовується значення параметра конфігураціїdiff.algorithm. -
subtree[=<path>] -
Цей варіант є вдосконаленою формою стратегії subtree, за якої стратегія робить припущення щодо того, як слід змістити два дерева, щоб вони збігалися під час об’єднання. Натомість до вказаного шляху додається префікс (або з його початку видаляється частина), щоб форми двох дерев збігалися.
-
-
recursive -
Тепер це синонім до
ort. Це стратегія була альтернативною реалізацією до версії 2.49.0, але була перенаправлена наortу версії 2.50.0. Попередня рекурсивна стратегія була стандартною стратегією для розвʼязання для двох вершин з Git версії 0.99.9k до версії 2.33.0. -
resolve -
Може розвʼязувати лише дві гілки (тобто поточну гілку та іншу гілку, з якої було виконано злиття) за допомогою алгоритму тристороннього злиття. Намагається ретельно виявляти неоднозначності, пов’язані з перехресним злиттям. Не підтримує перейменування.
-
octopus -
Ця стратегія розвʼязує випадки, коли є більше двох вершин, але відмовляється виконувати складне злиття, яке потребує ручного втручання. Вона призначена насамперед для обʼєднання вершин гілок тем. Це стратегія злиття є стандартною під час злиття або об’єднання кількох гілок.
-
ours -
Ця стратегія дозволяє обʼєднати будь-яку кількість вершин, але отримане в результаті злиття дерево завжди відповідає вершині поточної гілки, фактично ігноруючи всі зміни з усіх інших гілок. Вона призначена для заміни старої історії розробки бічних гілок. Зверніть увагу, що вона відрізняється від опції
-Xoursстратегії злиттяort. -
subtree -
Це модифікована стратегія
ort. Під час обʼєднання дерев A та B, якщо B відповідає піддереву A, B спочатку коригується відповідно до структури дерева A, замість того, щоб зчитувати дерева на одному рівні. Це коригування також виконується для дерева спільного предка.
У стратегіях, що використовують тристороннє злиття (включно зі стандартною стратегією ort), якщо зміна була внесена в обох гілках, але згодом скасована в одній із них, ця зміна все одно буде присутня в результаті злиття; деякі користувачі вважають таку поведінку заплутаною. Це відбувається тому, що під час злиття враховуються лише кінцеві точки гілок та базова точка злиття, а не окремі коміти. Тому алгоритм злиття розглядає скасовану зміну як відсутність будь-якої зміни взагалі і замінює її зміненою версією.
КОНФІГУРАЦІЯ
Все, що знаходиться вище цього рядка в цьому розділі, не включено до документації git-config[1]. Наступний вміст такий самий, як і той, що знаходиться там:
-
merge.conflictStyle -
Вкажіть стиль, у якому конфліктні фрагменти записуються у файли робочого дерева під час обʼєднання. Стандартне значення — "merge", показує маркер конфлікту <<<<<<<, зміни, внесені однією стороною, маркер
=======, зміни, внесені іншою стороною, а потім маркер >>>>>>>. Альтернативний стиль, "diff3", додає маркер ||||||| та оригінальний текст перед маркером=======. Стиль "merge", як правило, створює менші області конфлікту, ніж diff3, як через виключення оригінального тексту, так і тому, що коли підмножина рядків збігається з двох сторін, вони просто витягуються з області конфлікту. Інший альтернативний стиль, "zdiff3", подібний до diff3, але видаляє з області конфлікту рядки, що збігаються з двох сторін, коли ці рядки, що збігаються, зʼявляються поблизу початку або кінця області конфлікту. -
merge.defaultToUpstream -
Якщо команда merge викликається без аргументу commit, виконується злиття гілок upstream, налаштованих для поточної гілки, з використанням їхніх останніх значень, збережених у гілках remote-tracking. Перевіряються значення branch.<current branch>.merge, які називають гілки на віддаленому сервері, названому
branch.<current-branch>.remote, а потім вони зіставляються за допомогоюremote.<remote>.fetchз відповідними гілками віддаленого відстеження, і вершини цих гілок відстеження зливаються. Стандартне значення — true. -
merge.ff -
Стандартно Git не створює додаткового коміту злиття під час злиття коміту, який є нащадком поточного коміту. Натомість вершина поточної гілки переноситься вперед (fast-forward). Якщо для цієї змінної встановлено значення
false, Git створює додатковий коміт злиття в такому випадку (що еквівалентно введенню опції--no-ffу командному рядку). Якщо встановлено значенняonly, дозволяються лише такі злиття з переміщенням вперед (що еквівалентно введенню опції--ff-onlyу командному рядку). -
merge.verifySignatures -
Якщо це значення true, це еквівалентно опції командного рядка
--verify-signatures. Див. git-merge[1] для отримання детальної інформації. -
merge.branchdesc -
Окрім назв гілок, заповнювати повідомлення журналу текстом опису гілок, повʼязаним із ними. Стандартне значення — false.
-
merge.log -
Окрім назв гілок, заповнювати повідомлення журналу щонайбільше вказаною кількістю однорядкових описів з фактичних комітів, що обʼєднуються. Станадртне значення — false, а true є синонімом 20.
-
merge.suppressDest -
Якщо додати до цієї багатозначної конфігураційної змінної шаблон, що відповідає назвам гілок інтеграції, у титулі стандартного повідомлення про злиття, яке генерується під час злиття в ці гілки інтеграції, буде опущено фрагмент «into <branch-name>».
Елемент із порожнім значенням можна використовувати для очищення списку шаблонів, накопичених з попередніх записів конфігурації. Якщо змінна
merge.suppressDestне визначена, для зворотної сумісності стандартно використовується значенняmaster.
-
merge.renameLimit -
Кількість файлів, які слід враховувати під час вичерпної перевірки на перейменування під час злиття. Якщо значення не вказано, зазвичай використовується значення
diff.renameLimit. Якщо не вказано аніmerge.renameLimit, аніdiff.renameLimit, зазвичай використовується значення 7000. Цей параметр не діє, якщо виявлення перейменувань вимкнено. -
merge.renames -
Чи виявляє Git перейменування. Якщо встановлено значення
false, виявлення перейменування вимкнено. Якщо встановлено значенняtrue, базове виявлення перейменування ввімкнено. Стандартне значення визначається в diff.renames. -
merge.directoryRenames -
Чи виявляє Git перейменування тек, що впливає на те, як під час злиття обробляються нові файли, додані до теки на одному боці історії, якщо ця тека була перейменована на іншому боці історії. Можливі значення:
Якщо
merge.renamesмає значенняfalse,merge.directoryRenamesігнорується та обробляється якfalse. Стандартне значення —conflict. -
merge.renormalize -
Повідомте Git, що канонічне представлення файлів у репозиторії з часом змінилося (наприклад, попередні коміти записували текстові файли із закінченнями рядків CRLF, але новіші використовують закінчення рядків LF). У такому репозиторії, для кожного файлу, де потрібне тристороннє злиття вмісту, Git може конвертувати дані, записані в комітах, у канонічну форму перед виконанням злиття, щоб зменшити непотрібні конфлікти. Для отримання додаткової інформації див. розділ «Злиття гілок із різними атрибутами checkin/checkout» в gitattributes[5].
-
merge.stat -
Визначає, що друкувати (якщо взагалі щось) між
ORIG_HEADі результатом злиття наприкінці процесу злиття. Можливі значення:але будь-яке нерозпізнане значення (наприклад, значення, додане майбутньою версією Git) сприймається як
true, а не викликає помилку. Стандартне значення —true. -
merge.autoStash -
Якщо встановлено значення
true, автоматично створюється тимчасовий запис stash перед початком операції та застосовується після її завершення. Це означає, що ви можете запустити злиття на некоректному робочому дереві. Однак використовуйте обережно: остаточне застосування stash після успішного злиття може призвести до нетривіальних конфліктів. Цей параметр можна перевизначити параметрами--no-autostashта--autostashпараметра git-merge[1]. Стандартне значення —false. -
merge.tool -
Керує тим, який інструмент злиття використовується git-mergetool[1]. У списку нижче наведено дійсні вбудовані значення. Будь-яке інше значення розглядається як власний інструмент злиття та вимагає визначення відповідної змінної
mergetool.<tool>.cmd. -
merge.guitool -
Керує тим, який інструмент злиття використовується git-mergetool[1], коли вказано прапорець
-g/--gui. У списку нижче наведено дійсні вбудовані значення. Будь-яке інше значення розглядається як власний інструмент злиття та вимагає визначення відповідної змінноїmergetool.<guitool>.cmd.
|
Warning
|
Missing See original version for this content. |
-
merge.verbosity -
Контролює обсяг виводу, що відображається стратегією рекурсивного злиття. Рівень 0 не виводить нічого, окрім остаточного повідомлення про помилку, якщо виявлено конфлікти. Рівень 1 виводить лише конфлікти, 2 виводить конфлікти та зміни файлів. Рівень 5 і вище виводить інформацію для налагодження. Стандартно використовується рівень 2. Може бути перевизначений змінною середовища
GIT_MERGE_VERBOSITY. -
merge.<driver>.name -
Визначає зрозумілу для людини назву для власного драйвера злиття низького рівня. Див. gitattributes[5] для отримання детальної інформації.
-
merge.<driver>.driver -
Визначає команду, яка реалізує власний драйвер злиття низького рівня. Див. gitattributes[5] для отримання детальної інформації.
-
merge.<driver>.recursive -
Визначає драйвер злиття низького рівня, який буде використовуватися під час виконання внутрішнього злиття між спільними предками. Див. gitattributes[5] для отримання детальної інформації.
GIT
Частина набору git[1]