Я работаю в репо с тремя ветками: master, stage и dev. Я некоторое время работал над dev, готов выдвинуть свои изменения и уже собрал мои локальные коммиты в один коммит для публикации. Я хочу обновить свое локальное репо любой работой, которая была перенесена членами команды на ветку «stage». Я бы хотел:
(Никто другой не ссылается на мою локальную ветку разработчиков, так что я чувствую себя комфортно.)
Я делаю:
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 делает здесь.
Что нужно сделать в подобных ситуациях, это проверить оригинал, посмотреть, что было в первую очередь, что сделало эти два блока замены похожими на минимальное редактирование.
Для дальнейшего использования вы можете запросить отчеты о конфликтах в стиле «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) {
что кажется правильным для всех трех версий.