git rebase с конфликтом теряет комментарии коммита

  1. У меня были изменения в проекте локально, однако я знал, что в удаленном репозитории (источнике) также были некоторые изменения, которых у меня еще не было локально.

  2. Я фиксирую свои локальные изменения как обычно (на главном сервере) с комментариями (-m). Назовем этот коммит ПЕРВЫМ КОМИТЕТОМ.

  3. git fetch origin

  4. На всякий случай: git checkout master

  5. git rebase origin/master

  6. Есть конфликты в 2-х файлах. Конфликты помечаются маркерами конфликта как нормальные (‹************************************ Верхняя половина показывает, что находится в исходной / основной версии, а нижняя половина показывает, что находится в моей основной версии. После закрывающего маркера (т.е. >>>>>>) он показывает часть строки, которая находится в исходной / основной версии (видимо, это патч или что-то в этом роде). Я этого не понимаю.

  7. Я делаю оба файла такими, какие хочу, и удаляю все теги маркеров конфликтов и т. Д.

  8. git add .

  9. git commit с комментарием (-m), в котором я говорю, что разрешил некоторые конфликты слияния. Назовем эту фиксацию «КОНФЛИКТ РАЗРЕШЕНИЕ КОММИТАЦИЕЙ».

  10. git rebase --continue жалуется на отсутствие изменений. Я не могу продолжать, конфликтов больше нет. git status говорит: «Все конфликты устранены», выполните «git rebase --continue». Единственный вариант - «git rebase --skip» пропустить «патч», что бы это ни было.

  11. git rebase --skip после того, как статус говорит, что ваша ветка опережает origin / master на 1 фиксацию, рабочее дерево очищается и т. Д. Хорошо, как и ожидалось.

  12. git log Показывает все коммиты в том порядке, в котором я хочу их, за исключением того, что нигде не видно «ПЕРВОГО КОМИТЕТА», а вверху отображается только «КОНФЛИКТ УРЕГУЛИРОВАТЬ». С коммитами, которые пришли из origin / master прямо под ним. Изменения все еще присутствуют во всех файлах (как в тех, в которых были конфликты, так и в других, которые были изменены), поэтому я не потерял фактические изменения.

Почему с комментариями, которые я там дал, не отображается «ПЕРВЫЙ ОБЪЯВЛЕНИЕ»?


person Del Berry delberry    schedule 26.01.2018    source источник


Ответы (1)


Вы ошиблись на шаге 9. Вы не должны совершать новые коммиты в середине операции перебазирования, когда вы разрешаете конфликты. На шаге 9 вместо git commit -m "..." вы должны были запустить git rebase --continue. Кстати, именно поэтому git rebase --continue жалуется на шаге 10.

В общем, вы можете запустить git status, и git сообщит вам, какие параметры вы, скорее всего, захотите сделать. Например, если вы запустите git status после шага 8, будет сказано (all conflicts fixed: run "git rebase --continue").


Вероятно, вы уничтожили исходный коммит, который искали (поскольку он не отображается в вашем журнале). Он был заменен на «CONFLICT RESOLVE COMMIT», который вы выполнили на шаге 9. У вас есть несколько вариантов:

  • Не беспокойтесь об этом, ваши файлы все еще там, и вы потеряли крошечный кусочек истории.
  • ИЛИ, интерактивно переустановите (google git rebase -i), чтобы изменить сообщение фиксации на все, что вы хотите.
  • ИЛИ используйте git reflog (погуглите), чтобы вернуть исходную фиксацию, и повторите попытку.
person mkasberg    schedule 26.01.2018
comment
Большое спасибо! Это причина. Я не был уверен в том, что фиксация изменений показалась мне странной, но я следовал: help.github.com/articles/, который затем ссылается на« стандартную процедуру разрешения конфликтов слияния », в которой вам предлагается зафиксировать изменения, разрешающие слияние. Но, если я теперь правильно понимаю: это только тогда, когда конфликт возникает из-за команды слияния, которая просто прерывается, когда слияние не удается. Не тогда, когда вы находитесь в перебазировке, которая находится в состоянии ожидания, потому что есть конфликт, и вы все еще можете продолжить. - person Del Berry delberry; 26.01.2018
comment
Когда-то было так, что git rebase --continue суетливо относился к тому, выполняли ли вы более раннюю git commit, но теперь это должно работать в любом современном Git автоматически. Возможно, у @DelBerrydelberry есть старый Git, я полагаю ... - person torek; 26.01.2018
comment
Да, возможно, более старая версия git ... Я никогда не видел случая, когда вам нужно было бы запустить git commit перед git rebase --continue. - person mkasberg; 26.01.2018
comment
Во избежание недоразумений: мне не нужно запускать git commit до git rebase --continue после разрешения конфликтов. На самом деле, теперь я понимаю, что это плохая идея, потому что он заменит комментарии коммита, которые будет использовать rebase, теми, которые вы дали для «разрешения конфликтов, фиксации», а также даст сбивающее с толку сообщение о том, что он не может продолжаться, потому что нет никаких изменений ( так что делать можно только git rebase --skip). - person Del Berry delberry; 29.01.2018