Что такое генерируемые файлы BACKUP, BASE, LOCAL и REMOTE в конфликте git merge?
Я предполагаю, что файлы LOCAL и REMOTE - это то, что предполагает их название, но для чего нужны BASE и BACKUP?
4 ответа
Git выполняет трехстороннее слияние, находя общего предка (он же "база слияния") двух ветвей, которые вы объединяете. Когда вы вызываете git mergetool
в случае конфликта он создаст эти файлы, пригодные для подачи в типичный инструмент 3-way merge. Таким образом:
foo.LOCAL
: "наша" сторона конфликта - т. е. ваша ветвь (HEAD
) который будет содержать результаты слиянияfoo.REMOTE
: "их" сторона конфликта - отрасль, в которую вы объединяетесьHEAD
foo.BASE
: общий предок. полезно для подачи в трехсторонний инструмент слиянияfoo.BACKUP
: содержимое файла до вызова инструмента слияния будет сохранено в файловой системе, еслиmergetool.keepBackup = true
,
В случае переноса (слияния) изменений из онлайн-репозитория в вашу локальную копию, вы можете понимать REMOTE, LOCAL и BASE как:
-
REMOTE
= Ваш локальный файл, включая собственные модификации ('как в файловой системе') -
LOCAL
= Удаленный файл в онлайн-репозитории ("изменения, внесенные другими пользователями") -
BASE
= Происхождение обоих файлов ("без изменений")
Эти термины с точки зрения в интернет - хранилище, которое является то, что "местный" относится. См. Также статью в Википедии о трехстороннем слиянии.
Согласно https://git-scm.com/docs/git-mergetool
Когда git mergetool вызывается с помощью этого инструмента (либо с помощью параметра -t или --tool, либо с помощью переменной конфигурации merge.tool), настроенная командная строка будет вызвана с $BASE, установленным в имя временного файла, содержащего общую базу слияние, если доступно; $LOCAL устанавливается равным имени временного файла, содержащего содержимое файла в текущей ветви; $REMOTE установлен на имя временного файла, содержащего содержимое файла для слияния, а $MERGED установлен на имя файла, в который инструмент слияния должен записать результат разрешения слияния.
Однако, похоже, есть разница между командой rebase и командой слияния.
Слияние использует вашу локальную ветвь как ЛОКАЛЬНУЮ, а ветвь, в которую вы сливаетесь, как УДАЛЕННУЮ.
Rebase использует вашу локальную ветвь как REMOTE, а ветку, на которую вы переустанавливаете, как LOCAL.
Я согласен с @Shanakor, один из ответов неправильный. Так называемоеlocal or remote
в основном указывает, что делает git с точки зрения «извлечения/переключения ветки». Если вы сейчас находитесь в филиале А и запускаетеgit merge B
, git остается в вашей ветке A на протяженииmerge
команда, поэтому локальной является A; если вы сейчас находитесь в филиале А и бежитеgit rebase B, (or rebase --onto B)
, внутри, git check out /switch на B, а затем, конечно же, локальным является B;
См.: https://git-scm.com/docs/git-rebase .
Цитата: Если указано, git rebase выполнит автоматическое переключение git, прежде чем делать что-либо еще. В противном случае он остается в текущей ветке.