Хорошо, я был невнимателен, когда объединял некоторый код в репозиторий (были серьезные изменения в потоке некоторого кода), поэтому мне пришлось отменить фиксацию слияния. Я пошел домой на день, и теперь есть больше коммитов на мастере, и я не могу запустить слияние, чтобы я мог получить свой код в мастере, поскольку у меня есть различия между двумя файлами. Я был неуклюж, и меня уже заставляли писать код до origin.

Вот история последних коммитов в одну линию:

Commit History

Как мне вернуть правильный экран слияния, чтобы я мог о нем позаботиться?

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

git
4
HSchmale 2 Ноя 2018 в 17:47

1 ответ

Лучший ответ

Когда код фиксируется, а затем возвращается в ветку, повторная фиксация того же кода не будет иметь никакого эффекта из-за исходного возврата. Например, предположим, что у вас есть одна или несколько фиксаций в ветке B, и вы отменяете их с помощью фиксации R:

master
|
* R
|\
| * B

Повторное слияние B с мастером не будет иметь никакого эффекта, потому что git понимает, что откат R произошел после всех коммитов в B (даже если B снова слился).

Здесь есть 2 возможных решения.

Отменить возврат

Один из них - отменить откат (назовите эту фиксацию R').

master
|
* R'
|
* R
|\
| * B

Команда для этого проста. $ git revert R


Перебазируйте ветку

Другое возможное решение - перебазировать всю ветку B так, чтобы она появлялась после отката R (вызовите перебазированную ветку B'). Есть несколько различных вариантов этого, но все они зависят от переписывания истории ветки новыми коммитами, которых нет в истории R.

master
| 
* New merge commit
|\
| * B'
|  \
|   ...
* R
|\
| * B
| ...
|/
* A

Команды для перебазирования следующие:

$ git checkout B
$ git rebase --no-ff A

У Линуса есть хороший комментарий по этому сценарию для дальнейшего чтения.

5
mkasberg 2 Ноя 2018 в 16:47