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.54.0
2026-04-20
-
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<стратегия>] [-X<параметр-стратегии>] [-S[<id-ключа>]] [--[no-]allow-unrelated-histories] [--[no-]rerere-autoupdate] [-m<сообщение>] [-F<файл>] [--into-name<ветка>] [<коммит>…]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 устанавливается на верхушку (tip) текущей ветки (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]. Кроме того, если <режим> получит значение
scissors, в случае конфликта слияния кMERGE_MSGбудет добавлен разделительscissorsперед передачей механизму фиксации. -
--ff -
--no-ff -
--ff-only -
Указывает, как обрабатывается слияние, когда сливаемая история уже является потомком текущей истории.
--ffиспользуется по умолчанию, если только не выполняется слияние аннотированной (и, возможно, подписанной) метки, которая не хранится в своём естественном месте в иерархииrefs/tags/, и в этом случае подразумевается--no-ff.С
--ff, когда возможно, разрешить слияние как перемотку вперёд (fast-forward) (только обновить указатель ветки, чтобы он соответствовал сливаемой ветке; не создавать коммит слияния). Когда это невозможно (когда сливаемая история не является потомком текущей истории), создать коммит слияния.С
--no-ffсоздавать коммит слияния во всех случаях, даже если слияние могло бы быть разрешено как перемотка вперёд (fast-forward).С
--ff-onlyразрешать слияние как перемотку вперёд (fast-forward), когда это возможно. Когда это невозможно, отказаться от слияния и выйти с ненулевым статусом. -
-S[<id-ключа>] -
--gpg-sign[=<id-ключа>] -
--no-gpg-sign -
Подписать результирующий коммит слияния с помощью GPG. Аргумент <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в конец сообщения коммита. Смысл этого действия зависит от проекта, с которым вы сотрудничаете. Например, это может удостоверять, что коммиттер имеет все права на то, чтобы предоставить данную работу в проект под его лицензией, или что он соглашается с каким-нибудь соглашением участника, вроде Сертификата Происхождения Разработчика (тот что используется в проектах Linux и Git см. в https://developercertificate.org). Проконсультируйтесь с документацией или руководством проекта, в который вы хотите внести свой вклад, чтобы понять, какой именно смысл эта приписка имеет в конкретном проекте.С помощью параметра
--no-signoffможно отменить параметр--signoff, указанный раннее в командной строке.Git не имеет (и не будет иметь) переменной конфигурации для включения параметра командной строки
--signoffпо умолчанию; подробности см. в записиcommit.signoffв gitfaq[7].
-
--stat -
-n -
--no-stat -
Показывать diffstat в конце слияния. Diffstat также управляется параметром конфигурации merge.stat.
С
-nили--no-statне показывать diffstat в конце слияния. -
--compact-summary -
Показывать компактную сводку (compact-summary) в конце слияния.
-
--squash -
--no-squash -
Создать состояние рабочего каталога и индекса, как если бы произошло реальное слияние (за исключением информации о слиянии), но фактически не создавать коммит, не перемещать
HEADи не записывать$GIT_DIR/MERGE_HEAD(чтобы следующая командаgitcommitсоздала коммит слияния). Это позволяет вам создать один коммит поверх текущей ветки, эффект от которого будет таким же, как и от слияния другой ветки (или более в случае слияния octopus).С
--no-squashвыполнить слияние и зафиксировать результат. Этот параметр можно использовать для переопределения--squash.С
--squash--commitне разрешён и приведёт к ошибке. -
--verify -
--no-verify -
По умолчанию запускаются перехватчики (hooks) pre-merge и commit-msg. Когда указан
--no-verify, они обходятся. См. также githooks[5]. -
-s<стратегия> -
--strategy=<стратегия> -
Использовать указанную стратегию слияния; может быть указана более одного раза для задания порядка их применения. Если опция
-sотсутствует, используется встроенный список стратегий (ortпри слиянии одной головы,octopusв противном случае). -
-X<параметр> -
--strategy-option=<параметр> -
Передать параметр, специфичный для стратегии слияния, самой стратегии слияния.
-
--verify-signatures -
--no-verify-signatures -
Проверить, что верхушка (tip) сливаемой побочной ветки подписана действительным ключом, т.е. ключом, имеющим действительный uid: в модели доверия по умолчанию это означает, что ключ подписи был подписан доверенным ключом. Если верхушка побочной ветки не подписана действительным ключом, слияние прерывается.
-
--summary -
--no-summary -
Синонимы для
--statи--no-stat; они устарели и будут удалены в будущем. -
-q -
--quiet -
Работать тихо. Подразумевает
--no-progress. -
-v -
--verbose -
Быть многословнее.
-
--progress -
--no-progress -
Явно включить/отключить индикацию хода выполнения. Если не указано ни то, ни другое, ход выполнения показывается, если стандартный поток ошибок подключён к терминалу. Обратите внимание, что не все стратегии слияния могут поддерживать отчёт о ходе выполнения.
-
--autostash -
--no-autostash -
Автоматически создать временную запись в тайнике (stash) перед началом операции, записать её в ссылку
MERGE_AUTOSTASHи применить её после завершения операции. Это означает, что вы можете выполнять операцию на грязном рабочем каталоге. Однако используйте с осторожностью: финальное применение тайника после успешного слияния может привести к нетривиальным конфликтам. -
По умолчанию команда
gitmergeотказывается сливать истории, у которых нет общего предка. Этот параметр можно использовать для отмены этой меры безопасности при слиянии историй двух проектов, которые начали своё существование независимо. Поскольку это очень редкий случай, не существует и не будет добавлено переменной конфигурации для включения этого поведения по умолчанию.
-
-m<сообщение> -
Установить сообщение коммита, которое будет использовано для коммита слияния (если он создаётся).
Если указан
--log, к указанному сообщению будет добавлен краткий журнал (shortlog) сливаемых коммитов.Команда
gitfmt-merge-msgможет использоваться для создания хорошего значения по умолчанию для автоматических вызововgitmerge. Автоматическое сообщение может включать описание ветки. -
--into-name<ветка> -
Подготовить сообщение слияния по умолчанию так, как если бы слияние выполнялось в ветку <ветка>, вместо имени реальной ветки, в которую выполняется слияние.
-
-F<файл> -
--file=<файл> -
Прочитать сообщение коммита, которое будет использовано для коммита слияния (если он создаётся).
Если указан
--log, к указанному сообщению будет добавлен краткий журнал (shortlog) сливаемых коммитов. -
--rerere-autoupdate -
--no-rerere-autoupdate -
После того как механизм rerere повторно использует записанное ранее разрешение на текущем конфликте для обновления файлов в рабочем каталоге, разрешить также обновить индекс, применив к нему результат разрешения. Параметр
--no-rerere-autoupdateможно использовать как удобный способ дважды проверить результат работы git-rerere[1] и поймать потенциальные ошибки слияния до того, как зафиксировать результат в индексе с помощью отдельной команды git-add[1].
-
--overwrite-ignore -
--no-overwrite-ignore -
Незаметно перезаписывать игнорируемые файлы из результата слияния. Это поведение по умолчанию. Используйте
--no-overwrite-ignore, чтобы прервать операцию. -
--abort -
Прервать текущий процесс разрешения конфликта и попытаться восстановить состояние до слияния. Если присутствует запись автоатайника (autostash), применить её к рабочему каталогу.
Если на момент начала слияния присутствовали незафиксированные изменения в рабочем каталоге,
gitmerge--abortв некоторых случаях не сможет восстановить эти изменения. Поэтому рекомендуется всегда фиксировать или прятать (stash) свои изменения перед запускомgitmerge.gitmerge--abortэквивалентенgitreset--merge, когда присутствуетMERGE_HEAD, если только также не присутствуетMERGE_AUTOSTASH, и в этом случаеgitmerge--abortприменяет запись из тайника (stash) к рабочему каталогу, тогда какgitreset--mergeсохранит спрятанные изменения в списке тайников. -
--quit -
Забыть о текущем процессе слияния. Оставить индекс и рабочий каталог в текущем состоянии. Если присутствует
MERGE_AUTOSTASH, запись из тайника будет сохранена в список тайников. -
--continue -
После остановки
gitmergeиз-за конфликтов вы можете завершить слияние, выполнивgitmerge--continue(см. раздел «КАК РАЗРЕШАТЬ КОНФЛИКТЫ» ниже). - <коммит>...
-
Коммиты, обычно головы других веток, для слияния в нашу ветку. Указание более одного коммита создаст слияние с более чем двумя родителями (ласково называемое слиянием Octopus).
Если коммит не указан в командной строке, выполнить слияние отслеживаемых внешних веток, которые текущая ветка настроена использовать в качестве своей вышестоящей (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.)
СЛИЯНИЕ ПЕРЕМОТКОЙ ВПЕРЁД
Часто голова текущей ветки является предком указанного коммита. Это самый распространённый случай, особенно при вызове из git pull: вы отслеживаете вышестоящий (upstream) репозиторий, у вас нет зафиксированных локальных изменений, и теперь вы хотите обновиться до более новой вышестоящей редакции. В этом случае новый коммит не нужен для хранения объединённой истории; вместо этого HEAD (вместе с индексом) обновляется, чтобы указывать на указанный коммит, без создания дополнительного коммита слияния.
Это поведение можно подавить с помощью опции --no-ff.
ИСТИННОЕ СЛИЯНИЕ
За исключением слияния перемоткой вперёд (см. выше), сливаемые ветки должны быть связаны коммитом слияния, у которого обе они являются родителями.
Фиксируется объединённая версия, согласовывающая изменения из всех сливаемых веток, и ваш HEAD, индекс и рабочий каталог обновляются до неё. Допустимо наличие изменений в рабочем каталоге, если они не пересекаются; обновление сохранит их.
Когда неочевидно, как согласовать изменения, происходит следующее:
-
Указатель
HEADостаётся тем же. -
Ссылка
MERGE_HEADустанавливается указывать на голову другой ветки. -
Пути, которые слились чисто, обновляются как в файле индекса, так и в вашем рабочем каталоге.
-
Для конфликтующих путей файл индекса хранит до трёх версий: этап 1 хранит версию от общего предка, этап 2 от
HEAD, а этап 3 отMERGE_HEAD(вы можете просмотреть этапы с помощьюgitls-files-u). Файлы рабочего каталога содержат результат операции слияния; т.е. результаты трёхстороннего слияния со знакомыми маркерами конфликтов <<<===>>>. -
Записывается ссылка с именем
AUTO_MERGE, указывающая на дерево, соответствующее текущему содержимому рабочего каталога (включая маркеры конфликтов для текстовых конфликтов). Обратите внимание, что эта ссылка записывается только при использовании стратегии слиянияort(по умолчанию). -
Никаких других изменений не делается. В частности, локальные изменения, которые у вас были до начала слияния, останутся такими же, и записи индекса для них останутся такими, как были, т.е. соответствующими
HEAD.
Если вы попытались выполнить слияние, которое привело к сложным конфликтам, и хотите начать заново, вы можете восстановиться с помощью git merge --abort.
СЛИЯНИЕ МЕТКИ
При слиянии аннотированной (и, возможно, подписанной) метки Git всегда создаёт коммит слияния, даже если возможно слияние перемоткой вперёд, и шаблон сообщения коммита подготавливается с сообщением метки. Кроме того, если метка подписана, проверка подписи сообщается как комментарий в шаблоне сообщения. См. также 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, для представления такого конфликтного блока, например:
Вот строки, которые либо не изменились по сравнению с общим предком, либо чисто разрешены, потому что изменилась только одна сторона, либо чисто разрешены, потому что обе стороны изменились одинаково. <<<<<<< yours:sample.txt Разрешение конфликтов — это сложно; пойдём по магазинам. ======= Git делает разрешение конфликтов лёгким. >>>>>>> theirs:sample.txt А вот другая строка, которая либо чисто разрешена, либо не изменена.
Область, где произошла пара конфликтующих изменений, помечена маркерами <<<<<<<, ======= и >>>>>>>. Часть до ======= обычно представляет вашу сторону, а часть после — их сторону.
Формат по умолчанию не показывает, что говорилось в исходном тексте в конфликтующей области. Вы не можете сказать, сколько строк удалено и заменено на замечание Барби с вашей стороны. Единственное, что вы можете сказать, это то, что ваша сторона хочет сказать, что это сложно, и вы предпочли бы пойти по магазинам, в то время как другая сторона хочет утверждать, что это легко.
Альтернативный стиль можно использовать, установив переменную конфигурации merge.conflictStyle в diff3 или zdiff3. В стиле diff3 вышеуказанный конфликт может выглядеть так:
Вот строки, которые либо не изменились по сравнению с общим предком, либо чисто разрешены, потому что изменилась только одна сторона, <<<<<<< yours:sample.txt либо чисто разрешены, потому что обе стороны изменились одинаково. Разрешение конфликтов — это сложно; пойдём по магазинам. ||||||| base:sample.txt либо чисто разрешены, потому что обе стороны изменились идентично. Разрешение конфликтов — это сложно. ======= либо чисто разрешены, потому что обе стороны изменились одинаково. Git делает разрешение конфликтов лёгким. >>>>>>> theirs:sample.txt А вот другая строка, которая либо чисто разрешена, либо не изменена.
тогда как в стиле zdiff3 это может выглядеть так:
Вот строки, которые либо не изменились по сравнению с общим предком, либо чисто разрешены, потому что изменилась только одна сторона, либо чисто разрешены, потому что обе стороны изменились одинаково. <<<<<<< yours:sample.txt Разрешение конфликтов — это сложно; пойдём по магазинам. ||||||| base:sample.txt либо чисто разрешены, потому что обе стороны изменились идентично. Разрешение конфликтов — это сложно. ======= Git делает разрешение конфликтов лёгким. >>>>>>> theirs:sample.txt А вот другая строка, которая либо чисто разрешена, либо не изменена.
В дополнение к маркерам <<<<<<<, ======= и >>>>>>> он использует ещё один маркер |||||||, за которым следует исходный текст. Вы можете сказать, что исходный текст просто констатировал факт, а ваша сторона просто согласилась с этим утверждением и сдалась, в то время как другая сторона попыталась иметь более позитивный настрой. Иногда вы можете придумать лучшее разрешение, просмотрев исходный текст.
КАК РАЗРЕШАТЬ КОНФЛИКТЫ
Увидев конфликт, вы можете сделать две вещи:
-
Решить не сливать. Единственная необходимая очистка — сбросить файл индекса до коммита
HEAD, чтобы отменить шаг 2, и очистить изменения в рабочем каталоге, сделанные на шагах 2 и 3; для этого можно использоватьgitmerge--abort. -
Разрешить конфликты. Git отметит конфликты в рабочем каталоге. Отредактируйте файлы в нужную форму и выполните
gitaddдля них в индекс. Используйтеgitcommitилиgitmerge--continue, чтобы завершить дело. Последняя команда проверяет, есть ли (прерванное) слияние в процессе, перед вызовомgitcommit.
Вы можете проработать конфликт с помощью ряда инструментов:
-
Используйте инструмент слияния (mergetool).
gitmergetoolзапускает графический инструмент слияния, который проведёт вас через слияние. -
Посмотрите на различия.
gitdiffпокажет трёхстороннее сравнение, выделяя изменения как из версииHEAD, так и изMERGE_HEAD.gitdiffAUTO_MERGEпокажет, какие изменения вы внесли на данный момент для разрешения текстовых конфликтов. -
Посмотрите на различия из каждой ветки.
gitlog--merge-p<путь> покажет различия сначала для версииHEAD, а затем для версииMERGE_HEAD. -
Посмотрите на оригиналы. git show :1:имя_файла показывает общего предка, git show :2:имя_файла показывает версию
HEAD, а git show :3:имя_файла показывает версию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 -
Это выполняет виртуальное переключение и фиксацию всех трёх стадий любого файла, которому требуется трёхходовое слияние. Этот параметр предназначен для использования при слиянии веток с разными фильтрами очистки или правилами нормализации концов строк. Подробности см. в разделе "Слияние веток с различными атрибутами фиксации/переключения" в gitattributes[5].
-
no-renormalize -
Отключает параметр
renormalize. Это переопределяет переменную конфигурацииmerge.renormalize. -
find-renames[=<n>] -
Включает обнаружение переименований, опционально устанавливая порог схожести. Это поведение по умолчанию. Это переопределяет переменную конфигурации
merge.renames. См. также git-diff[1]--find-renames. -
rename-threshold=<число> -
Устаревший синоним для
find-renames=<число>. -
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[=<путь>] -
Этот параметр является более продвинутой формой стратегии subtree, когда стратегия делает предположение о том, как два дерева должны быть сдвинуты, чтобы соответствовать друг другу при слиянии. Вместо этого указанный путь добавляется в начало (или удаляется из начала), чтобы форма двух деревьев совпадала.
-
-
recursive -
Теперь это синоним для
ort. Это была альтернативная реализация до v2.49.0, но в v2.50.0 была перенаправлена наort. Предыдущая рекурсивная стратегия была стратегией по умолчанию для разрешения двух голов начиная с Git v0.99.9k до v2.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 вызывается без аргумента коммита, выполняется слияние вышестоящих веток, настроенных для текущей ветки, с использованием их последних наблюдаемых значений, сохранённых в их удалённых отслеживающих ветках. Используются значения branch.<текущая ветка>.merge, которые называют ветки в удалённом репозитории, указанном в branch.<текущая ветка>.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 -
Добавляя glob, соответствующий именам веток интеграции, в эту многозначную конфигурационную переменную, стандартное сообщение о слиянии, вычисляемое для слияний в эти ветки интеграции, будет опускать "into <имя-ветки>" из своего заголовка.
Элемент с пустым значением можно использовать для очистки списка glob-ов, накопленных из предыдущих записей конфигурации. Когда переменная
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.<инструмент>.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.<драйвер>.name -
Определяет человекопонятное имя для пользовательского низкоуровневого драйвера слияния. Подробности см. в gitattributes[5].
-
merge.<драйвер>.driver -
Определяет команду, реализующую пользовательский низкоуровневый драйвер слияния. Подробности см. в gitattributes[5].
-
merge.<драйвер>.recursive -
Указывает низкоуровневый драйвер слияния, который будет использоваться при выполнении внутреннего слияния между общими предками. Подробности см. в gitattributes[5].
GIT
Является частью пакета git[1]