Потерянные изменения во время сквоша с перебазированием

я пытаюсь бежать

git rebase -i HEAD~N

чтобы раздавить мои старые коммиты в один. Но иногда у меня возник конфликт слияния. Проблема в том, что даже если я разрешаю конфликт и выполняю git rebase --continue, я теряю многие другие изменения фиксации.

Я также попытался решить проблему, основываясь на этих ответах: Git сквош всех коммитов в ветке без конфликтов


person Paxi    schedule 16.11.2020    source источник
comment
2 вопроса: 1. Вы случайно не изменили порядок применения коммитов или удалили какой-либо коммит? 2. Есть ли коммит слияния в последних N коммитах, которые вы пытаетесь объединить?   -  person LeGEC    schedule 16.11.2020
comment
1. нет, что я сделал, так это сделал несколько пушей, где я успешно раздавил первые 35 коммитов (и у меня все еще есть 11) 2. Да.   -  person Paxi    schedule 16.11.2020


Ответы (3)


Вы можете избежать использования rebase для сжатия, используя reset --soft. Скажем, вы хотите раздавить от HEAD~100 до вашей текущей ветки (HEAD~100 является последним выжившим коммитом, который не будет раздавлен):

git reset --soft HEAD~100
git commit -m "Squashed stuff"

Вот и все. Никаких конфликтов, никаких ссор.

person eftshift0    schedule 16.11.2020

Если вам нужно перебазировать диапазон коммитов, который включает коммит слияния, добавьте параметр -m:

git rebase -i -m HEAD~N

Сценарий секвенсора позволит вам описать, как вы включаете это слияние в переписывание.

person LeGEC    schedule 16.11.2020
comment
Спасибо за ответ. Я пробовал, но, к сожалению, он вел себя так же, как я пробовал в начале. - person Paxi; 17.11.2020

Мягкий сброс работает, но я нашел решение получше. Проблема заключалась в том, что внутри коммитов уже был коммит слияния, который я хотел раздавить. Я использовал следующий код для получения родительской фиксации:

git show --pretty=%P COMMIT_HASH

Наконец, мне пришлось использовать хэш родительского коммита для выполнения перебазирования.

person Paxi    schedule 10.03.2021