Забыл «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, либо сохранить его как патч. Затем выполните отмену rebase. Проверьте статус, чтобы убедиться, что репо находится в состоянии, которое, как вы знаете, не имеет проблем, а затем запустите выборку и перебазирование.
— yasouser

18
Не делай этого. См. Ответ Кириказы ниже, чтобы узнать о гораздо более простом / чистом способе. Не связывайтесь с выбором и разрешением конфликтов во второй раз.
— tandrewnichols 05

4
@Abhilash Пожалуйста, примите ответ Кириказы. Я (как и tandrewnichols) сделал это, и был гораздо более простой способ (и Интернет, похоже, согласен, поскольку этот ответ получил 4-кратное количество голосов).
— Дэвид Дориа

Теперь это в 10 раз больше голосов ... также используйте git rerere, чтобы запомнить разрешения конфликтов (полезно, если вы иногда не принимаете плохие решения, которые вы не хотите, чтобы он запомнил).
— Ajax

217

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


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сработало: это вернуло меня до начала перебазирования с чистым рабочим деревом.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.