Как может возникнуть конфликт слияния, когда git перебазируется на одну и ту же ветку? - PullRequest
0 голосов
/ 07 сентября 2018

С документации git rebase:

Текущая ветвь сбрасывается или, если --onto опция была предоставлена. Это имеет тот же эффект, что и git reset - трудно (или). ORIG_HEAD настроен так, чтобы указывать на конец ветви перед сбросом.

Коммиты, которые ранее были сохранены во временной области, затем по очереди применяются к текущей ветке, по порядку. Обратите внимание, что любые коммиты в HEAD, которые вносят те же текстовые изменения, что и commit в HEAD .. опущены (т.е. патч уже принят вверх по течению с другим сообщением фиксации или отметка времени будет пропущено).

Тогда важный бит:

Возможно, сбой слияния помешает этому процессу будучи полностью автоматическим

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

Вот мои команды:

407  07/09/18 16:53:09 cd temp
  408  07/09/18 16:53:16 git clone https://github.com/joereddington/todo.txt
  410  07/09/18 16:53:35 cd todo.txt/
  412  07/09/18 16:53:41 git rebase HEAD~20

Мне кажется, что это НЕ МОЖЕТ потерпеть неудачу. Я понимаю, что последовательность:

  • Переместить ГОЛОВУ в ГОЛОВУ ~ 20
  • Поместите 20 последних коммитов в временную область
  • для того, чтобы повторно применить фиксы , которые уже были сделаны, к репо с таким же состоянием
  • Конец

Но я получаю ошибку:

Applying: update Using index info to reconstruct a base tree... M   todo.txt .git/rebase-apply/patch:21: trailing whitespace. (A) Apply for gift aid number  .git/rebase-apply/patch:30: trailing whitespace. (C) Sort all the 'to sort' spending in the right categories in the expenditure against grant file.  .git/rebase-apply/patch:76: trailing whitespace. (E) Go thought calendar and find at least one 'thank you's you *can* make  warning: 3 lines add whitespace errors. Falling back to patching base and 3-way merge... Auto-merging todo.txt CONFLICT (content): Merge conflict in todo.txt error: Failed to merge in the changes. Patch failed at 0025 update The copy of the patch that failed is found in: .git/rebase-apply/patch

Resolve all conflicts manually, mark them as resolved with "git add/rm <conflicted_files>", then run "git rebase --continue". You can instead skip this commit: run "git rebase --skip". To abort and get back to the state before "git rebase", run "git rebase --abort".

Josephs-Mini:todo.txt josephreddington$

Как это может произойти? Он отказывается выполнить коммит для контента, в котором он уже выполнил те же изменения!

1 Ответ

0 голосов
/ 07 сентября 2018

Этот вопрос основан на устаревшем понимании систем контроля версий.

Такие системы, как CVS и SVN, сохраняют коммиты как дельты - коммит был буквально списком отличий от предыдущей версии. Если бы git работал таким же образом, то имело бы смысл, чтобы этот перебаз был полностью без ошибок.

Git не работает так ( есть некоторая дельта-компрессия под капотом ). Git хранит снимок того, как ваши файлы выглядят каждый раз. Это означает, что если в перебазировании есть какие-либо слияния, то он не знает, что с ними делать - когда перебазирование мерзкого слияния имеет три разные файловые системы для сравнения и требует некоторого руководства (в данном случае эвристический «заставляет его выглядеть» точно так же, как следующее звено в цепочке "было бы хорошо, но это крайний случай).

Чтобы решить приведенный пример, ключ '--preserve-merges' решает проблему.

...