Забыл «git rebase --continue» и сделал «git commit». Как исправить?

112

Я перебазировал код в git, у меня возникли конфликты слияния. Я разрешил конфликты и сделал:

git add

В этот момент я забыл сделать:

git rebase --continue

Я продолжил кодирование и сделал:

git commit

за изменения. Теперь я работаю "no branch"и не могу:

git rebase --continue 

Как это исправить?

Абхилаш
источник
# В настоящее время нет ни в одной ветке. нечего фиксировать (рабочий каталог чист)
Абхилаш

Ответы:

4

РЕДАКТИРОВАТЬ : Посмотрите на ответ ниже, чтобы узнать, может ли это решение проще для вас. https://stackoverflow.com/a/12163247/493106


Придется попробовать, но, думаю, я бы сделал следующее:

  1. Отметьте свой последний коммит (или просто запишите его SHA1 где-нибудь, чтобы не потерять его): git tag temp
  2. git rebase --abort
  3. Сделайте перебазирование снова. Вам придется снова разрешить слияние. :(
  4. git rebase --continue
  5. git cherry-pick temp

Проблема в том, что ваша tempфиксация, вероятно, содержит как разрешение слияния, так и новый код. Так что это может быть сложно, но я бы попробовал и посмотрел, сработает ли это.

MatrixFrog
источник
Либо вы можете пометить, как говорит @MatrixFrog, либо сохранить его как патч. Затем выполните отмену rebase. Проверьте статус, чтобы убедиться, что репо находится в состоянии, которое, как вы знаете, не имеет проблем, а затем запустите выборку и перебазирование.
yasouser
18
Не делай этого. См. Ответ Кириказы ниже, чтобы узнать о гораздо более простом / чистом способе. Не связывайтесь с выбором и разрешением конфликтов во второй раз.
tandrewnichols 05
4
@Abhilash Пожалуйста, примите ответ Кириказы. Я (как и tandrewnichols) сделал это, и был гораздо более простой способ (и Интернет, похоже, согласен, поскольку этот ответ получил 4-кратное количество голосов).
Дэвид Дориа
Теперь это в 10 раз больше голосов ... также используйте git rerere, чтобы запомнить разрешения конфликтов (полезно, если вы иногда не принимаете плохие решения, которые вы не хотите, чтобы он запомнил).
Ajax
217

Просто сделай git reset --soft HEAD^. Он перемещает указатель HEAD на своего родителя, но сохраняет дерево работы и добавляет изменение слияния в индекс. Так что вы можете продолжить ребазинг, git rebase --continueкак и раньше.

kirikaza
источник
1
Это полностью сработало, и я впервые нашел применение для --soft. Приятно знать, как это работает, спасибо!
mmocny
1
Я надеюсь, что люди увидят все голоса за этот ответ и последуют тому, что предлагается здесь!
Рагу
1
Это именно то, о чем я думал (но, возможно, ошибся случайно). Однако не был уверен, обновлялся ли HEAD во время перебазирования. Спасибо за подтверждение! Так рад, что прокрутил немного дальше, прежде чем возиться с головной болью выше.
DeezCashews 06
Я отредактировал принятый ответ, чтобы разместить здесь ссылку - я не видел этого ответа, пока не последовал указанным выше инструкциям.
xaxxon
0

У меня та же проблема, и, что еще хуже, я перебазировал три коммита, и после решения конфликтов во втором коммите я "совершил" вместо "rebase --continue".

В результате у меня был этот git reflog

Когда я применил решение kirikaza, я просто отменил третью фиксацию, а не вторую, что было проблематично ..

Как вы можете видеть, перебазирование начинается с проверки из ветви remotes / origin / master, а затем применяются три моих коммита, которые отображаются как три предыдущие операции (перед проверкой) в журнале reflog.

Затем, если вы хотите перезапустить с чистой базы, перед перебазированием вы можете просто выполнить жесткий сброс до хэша непосредственно перед проверкой операции перебазирования. В моем случае (см. Картинку):

git reset --hard 859ed3c

Тогда вы можете начать новый git rebase.

Луи Дюран
источник
0

У меня был git перебазирован, исправлены конфликты, git добавил файл с конфликтами и (по ошибке) зафиксирован.

Я пробовал git reset --soft HEAD^иgit reset --hard решения , но ни один из них не помог мне.

Однако просто git rebase --abortсработало: это вернуло меня до начала перебазирования с чистым рабочим деревом.

остаток
источник