Разве файлы разрешения конфликтов git не всегда представляют каждую строку в исходных файлах?

Я работаю в репо с тремя ветками: master, stage и dev. Я некоторое время работал над dev, готов выдвинуть свои изменения и уже собрал мои локальные коммиты в один коммит для публикации. Я хочу обновить свое локальное репо любой работой, которая была перенесена членами команды на ветку «stage». Я бы хотел:

  1. Извлекайте любые изменения, перенесенные на сцену, пока я работал над dev
  2. Перебазировать единственный коммит на «dev», который представляет мою работу на «stage»
  3. Другие вещи, связанные с публикацией

(Никто другой не ссылается на мою локальную ветку разработчиков, так что я чувствую себя комфортно.)

Я делаю:

git checkout stage
git pull
git checkout dev

Вот ситуация:

foo.cpp на ветке dev (устарел)

...
if (conditional)
{
Datastructure data = someValue;
cout << "Some text" << endl;
cout << "More text" << endl;
}

return 0; // rest of function NYI

if (someOtherConditional) {

Bob bob = makeBob();
Fred fred = makeFred();
...
}
...

foo.cpp на стадии ветвления (более поздняя версия)

...
if (conditional)
{
Datastructure data = someValue;
cout << "Some text" << endl;
cout << "More text" << endl;

cout << "Even more text" << endl;
cout << "Lots of text" << endl;

// todo: fix this hackish code
if (anotherConditional) {
myBool = true;
}
}

if (yetAnotherConditional) {
Bob bob = makeBob();
Fred fred = makeFred();
...
}
...

Наконец, я делаю:

git rebase stage

Я получаю несколько конфликтов, в том числе foo.cpp. Я открываю foo.cpp и получаю:

foo.cpp после начала перебазирования dev на сцену

...
if (conditional)
{
Datastructure data = someValue;
cout << "Some text" << endl;
cout << "More text" << endl;

<<<<<<<< HEAD
cout << "Even more text" << endl;
cout << "Lots of text" << endl;

// todo: fix this hackish code
if (anotherConditional) {
myBool = true;
}
}
=======
return 0; // rest of function NYI

if (someOtherConditional) {
>>>>>>> mostRecentDevCommit

if (yetAnotherConditional) {
Bob bob = makeBob();
Fred fred = makeFred();
...
}
...

Что случилось с отсутствующей закрывающей скобкой, соответствующей первой if (conditional) { в mostRecentDevCommit?

И почему if (yetAnotherConditional) { за пределами раздела разрешения конфликтов — foo.cpp в ветке ‘dev’ этого не имеет!

Спасибо — мне на самом деле не нужно разбираться с этим, чтобы разрешить конфликт, но я хотел бы знать, что Git делает здесь.

2

Решение

Что нужно сделать в подобных ситуациях, это проверить оригинал, посмотреть, что было в первую очередь, что сделало эти два блока замены похожими на минимальное редактирование.

Для дальнейшего использования вы можете запросить отчеты о конфликтах в стиле «diff3», которые будут включать исходный блок в отчет, по запросу для определенных файлов или по умолчанию:

git -c merge.conflictstyle=diff3 checkout -m --paths# just these for now
git config --global merge.conflictstyle diff3 # or as global default

Вы можете сделать одноразовый перезапуск любого слияния или перебазирования, проверив свои reflogs, здесь git reflog dev будет содержать пару как

9d7143d dev@{1}: rebase finished: refs/heads/dev onto 0f30b87ba7a2499c2b5d87b17d26ea8d353b8e34
5e58907 dev@{2}: commit: -

и с этими числами вы бы

git -c merge.conflictstyle=diff3 rebase dev@{2} 0f30b87
# (look at foo.cpp, if the conflict report is still confusing, post it?)
git rebase --abort
git checkout @{-1}     # <-- takes you back to your previous checkout

Лучшее, что я могу придумать без этого, это, пожалуй, (возможно, в обеих заменах удалено больше строк):

    }
return 0;
}

void func(type parm ...)
{
if (someOtherConditional) {

что кажется правильным для всех трех версий.

0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector