перебаза мерзавцев, отслеживание 'локальных' и 'удаленных'

При выполнении перебазы мерзавцев я часто испытываю затруднения при разработке того, что происходит с 'локальным' и 'удаленным' при разрешении конфликтов. У меня иногда есть впечатление, что они подкачивают стороны от, каждый передает следующему.

Это, вероятно (определенно), потому что я все еще правильно не понял.

При перебазировании, кто 'локален' и кто является 'удаленным'?

(Я использую P4Merge для разрешения конфликтов),

161
задан Benjol 16 June 2010 в 07:43
поделиться

2 ответа

TL; DR;

Подводя итог (Как 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 :

  • local ссылается на частично перемещенные коммиты : « наш » (восходящая ветвь)
  • удаленный относится к входящим изменениям : « их » - текущая ветвь до перебазирования.

См. Иллюстрации в последней части этого ответа.


Инверсия при перебазировании

Путаница может быть связана с инверсией наших и их во время перебазирования .
(соответствующие отрывки)

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, ссылка на них, кажется, только делает ответ более запутанным).

GUI git mergetool

kutschkem добавляет, и это правильно:

При разрешении конфликтов git скажет что-то вроде:

local: modified file and remote: modified file. 

Я совершенно уверен, что вопрос направлен на определение локального и удаленного в эта точка. В этот момент, исходя из моего опыта, мне кажется, что:

  • local ссылается на частично перебазированные коммиты : « наш » (восходящая ветвь)
  • remote относится к входящим изменениям : « их » - текущая ветка до перебазирования.

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 будет отображать разрешение слияния следующим образом :

kdiff3

И meld будет также отображать его :

Meld diff

То же самое для VimDiff , , которое отображает :

Вызвать Vimdiff как mergetool с git mergetool -t gvimdiff. Последние версии Git вызывают Vimdiff со следующей компоновкой окна:

+--------------------------------+
| LOCAL  |     BASE     | REMOTE |
+--------------------------------+
|             MERGED             |
+--------------------------------+
  • ЛОКАЛЬНОЕ :
    Временный файл, содержащий содержимое файла в текущей ветке.
  • БАЗА :
    Временный файл, содержащий общую базу для слияния.
  • УДАЛЕННЫЙ :
    Временный файл, содержащий содержимое файла, который нужно объединить.
  • ОБЪЕДИНЕННЫЕ :
    Файл, содержащий маркеры конфликта.

Git выполнил максимально возможное автоматическое разрешение конфликтов, и состояние этого файла представляет собой комбинацию LOCAL и REMOTE с маркерами конфликтов, окружающими все, что Git не смог разрешить самостоятельно. .
mergetool должен записать результат разрешения в этот файл.

223
ответ дан 23 November 2019 в 21:26
поделиться

Я не совсем понял вашу проблему, но я думаю, что следующая диаграмма решает ваш вопрос. (Rebase : Remote Repository ---> Workspace)

http://assets.osteele.com/images/2008/git-transport.png

Источник: Мой рабочий процесс Git

3
ответ дан 23 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: