При выполнении перебазы мерзавцев я часто испытываю затруднения при разработке того, что происходит с 'локальным' и 'удаленным' при разрешении конфликтов. У меня иногда есть впечатление, что они подкачивают стороны от, каждый передает следующему.
Это, вероятно (определенно), потому что я все еще правильно не понял.
При перебазировании, кто 'локален' и кто является 'удаленным'?
(Я использую P4Merge для разрешения конфликтов),
Подводя итог (Как Benubird комментарии ), когда:
git checkout A
git rebase B # rebase A on top of B
local
равно B
(перебазировать на ), удаленный
- это A
И:
git checkout A
git merge B # merge B into A
локальный
- это A
(объединить в ), удаленный
- B
A Переключатели перебазирования наши
(текущая ветвь до начала перезагрузки) и их
(ветвь вверху из которых вы хотите переустановить).
kutschkem указывает, что, в контексте слияния GUI :
наш
» (восходящая ветвь) их
» - текущая ветвь до перебазирования. См. Иллюстрации в последней части этого ответа.
Путаница может быть связана с инверсией наших
и их
во время перебазирования .
(соответствующие отрывки)
git rebase
страница руководства :
Обратите внимание, что слияние rebase работает путем воспроизведения каждого коммита из рабочей ветки поверх ветки
.
Из-за этого, когда происходит конфликт слияния:
наша
», является перебазированной на данный момент серией, начиная с
, их
» - это рабочая ветвь.
Другими словами, стороны меняются местами. x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
мы не меняем текущую ветвь «B», поэтому то, что у нас есть, остается тем, над чем мы работали (и мы сливаемся из другой ветки)
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
Но при перебазировании мы переключаемся на сторону, потому что первое, что делает перебаз, - проверяет восходящую ветвь! (чтобы воспроизвести текущие коммиты поверх него)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
A git rebase upstream
сначала изменит HEAD
B на восходящую ветвь HEAD
(отсюда переключатель «наши» и «их» по сравнению с предыдущей «текущей» рабочей ветвью.)
x--x--x--x--x <- former "current" branch, new "theirs"
\
\
\--y--y--y(*) <- upstream branch with B reset on it,
new "ours", to replay x's on it
, а затем перебазирование будет воспроизводить «их» коммиты в новой «нашей» ветке B:
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream branch
Примечание: «восходящее» понятие - это ссылочный набор данных (все репо или, как здесь, ветвь, которая может быть локальной ветвью), из которой данные считываются или в которую новые данные добавлены / созданы.
локальный
» и « удаленный
» vs.« мой
» и « их
» Пандавуд добавляет в комментарии :
Для меня вопрос все еще остается, а именно: "local" и who is "remote" (поскольку термины "наш" и "их" не используются при перебазировании в git, ссылка на них, кажется, только делает ответ более запутанным).
kutschkem добавляет, и это правильно:
При разрешении конфликтов git скажет что-то вроде:
local: modified file and remote: modified file.
Я совершенно уверен, что вопрос направлен на определение локального и удаленного в эта точка. В этот момент, исходя из моего опыта, мне кажется, что:
наш
» (восходящая ветвь) их
» - текущая ветка до перебазирования. git mergetool
действительно упоминает «локальный» и «удаленный» :
Merging:
f.txt
Normal merge conflict for 'f.txt':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (kdiff3):
Например, KDiff3 будет отображать разрешение слияния следующим образом :
И meld будет также отображать его :
То же самое для VimDiff , , которое отображает :
Вызвать Vimdiff как mergetool с git mergetool -t gvimdiff. Последние версии Git вызывают Vimdiff со следующей компоновкой окна:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
ЛОКАЛЬНОЕ
:
Временный файл, содержащий содержимое файла в текущей ветке.БАЗА
:
Временный файл, содержащий общую базу для слияния.УДАЛЕННЫЙ
:
Временный файл, содержащий содержимое файла, который нужно объединить.ОБЪЕДИНЕННЫЕ
:
Файл, содержащий маркеры конфликта.Git выполнил максимально возможное автоматическое разрешение конфликтов, и состояние этого файла представляет собой комбинацию
LOCAL
иREMOTE
с маркерами конфликтов, окружающими все, что Git не смог разрешить самостоятельно. .
mergetool
должен записать результат разрешения в этот файл.
Я не совсем понял вашу проблему, но я думаю, что следующая диаграмма решает ваш вопрос. (Rebase : Remote Repository ---> Workspace)
Источник: Мой рабочий процесс Git