Что такое генерируемые файлы 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, прежде чем делать что-либо еще. В противном случае он остается в текущей ветке.

Другие вопросы по тегам