При выполнении git rebase мне часто трудно разобраться, что происходит с «локальным» и «удаленным» при разрешении конфликтов. У меня иногда создается впечатление, что они меняются сторонами от одного коммита к другому.
Это вероятно (определенно), потому что я все еще не понял должным образом.
При ребазинге кто «локальный», а кто «удаленный»?
(Я использую P4Merge для разрешения конфликтов)
git svn
', только для части 'git rebase
')Ответы:
TL; DR;
Подводя итог (как комментарии Benubird ), когда:
local
естьB
(перебазировать на ),remote
являетсяA
И:
local
естьA
(слить в ),remote
являетсяB
Переключает ребазу
ours
(текущая ветвь перед началом ребазинга) иtheirs
(ветка, поверх которой вы хотите перебазировать).Кучкем указывает, что в контексте mergetool с графическим интерфейсом :
ours
" (ветка upstream)theirs
" - текущая ветвь перед ребазингом.Смотрите иллюстрации в последней части этого ответа.
Инверсия при ребазе
Путаница может быть связана с инверсией
ours
иtheirs
во время ребазинга .(соответствующие выдержки)
git rebase
справочная страница :Из-за этого, когда возникает конфликт слияния:
ours
» это так далеко нормированные серии, начиная с<upstream>
,theirs
' это рабочая ветвь. Другими словами, стороны поменялись местами.Инверсия проиллюстрирована
На слиянии
мы не меняем текущую ветвь «B», поэтому то, что у нас есть, это то, над чем мы работали (и мы объединяем из другой ветки)
На ребазе:
Но при перебазировании мы переключаемся на сторону, потому что первое, что делает перебазировка, это извлекает ветку upstream! (чтобы воспроизвести текущие коммиты поверх него)
A
git rebase upstream
сначала изменитHEAD
B на восходящую ветвьHEAD
(следовательно, переключение «наших» и «их» по сравнению с предыдущей «текущей» рабочей ветвью.), а затем rebase воспроизведет «их» коммиты в новой «нашей» ветке B:
Примечание: понятие «восходящий поток» - это ссылочный набор данных (все репо или, как здесь, ветвь, которая может быть локальной ветвью), из которой считываются данные или в которые добавляются / создаются новые данные.
'
local
' и 'remote
' против 'mine
' и 'theirs
'Пандавуд добавляет в комментариях :
GUI git mergetool
кучкем добавляет, и справедливо так
ours
" (ветка upstream)theirs
" - текущая ветвь перед ребазингом.git mergetool
действительно упоминает «локальный» и «удаленный» :Например, KDiff3 будет отображать разрешение слияния следующим образом :
И Мельд отобразил бы это тоже :
То же самое для VimDiff , который отображает :
источник
git checkout A; git rebase B
git checkout A; git rebase B
местный житель B, удаленный является . Если я ,checkout A
то я имею в настоящее время , глядя на файлы , как они существуют наA
, как в том , что каким - либо образом удаленного ? (Я не говорю, что Benubird не прав; я говорю, что у git тупой UX){branch A}
и /{branch B}
или подобное.Суть
мерзавец
мерзавец слияния
Другими словами, LOCAL - это всегда оригинал, а REMOTE - это всегда парень, чьи коммиты не были раньше, потому что они были объединены или перебазированы сверху
Докажите это!
Безусловно. Не верь мне на слово! Вот простой эксперимент, который вы можете сделать, чтобы убедиться в этом.
Во-первых, убедитесь, что у вас правильно настроен git mergetool. (Если вы этого не сделали, вы, вероятно, не прочитали бы этот вопрос в любом случае.) Затем найдите каталог для работы.
Настройте свой репозиторий:
Создайте начальный коммит (с пустым файлом):
Создайте коммит на ветке, которая не является основной:
Создайте коммит в основной ветке:
На этом этапе ваш репозиторий должен выглядеть так:
Теперь для теста ребаз:
Теперь проверка слияния. Закройте ваш mergetool без сохранения каких-либо изменений, а затем отмените ребаз:
Затем:
Ваши результаты должны быть такими же, как показанные вверху.
источник
local
/remote
аспекты, с которыми я боролся в моем собственном ответе выше (который больше касается инверсииours
vs вtheirs
любом случае)Я не понял вашу проблему точно, но я думаю, что следующая диаграмма решает вашу проблему. (Rebase: Удаленное хранилище ---> Рабочая область)
Источник: Мой рабочий процесс Git
источник