Отмена мерзавца - PullRequest
       127

Отмена мерзавца

2762 голосов
/ 25 сентября 2008

Кто-нибудь знает, как легко отменить git rebase?

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

  • git checkout родительский коммит для обеих ветвей
  • затем создайте временную ветку оттуда
  • Вишня выбирает все коммиты вручную
  • заменить ветку, в которую я перебазировал ветку, созданную вручную

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

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

Есть идеи?

Разъяснение: я говорю о ребазе, во время которого была повторена группа коммитов. Не только один.

Ответы [ 17 ]

11 голосов
/ 23 июня 2016

Если вы успешно сделали ребазинг на удаленную ветку и не можете git rebase --abort, вы все равно можете сделать некоторые трюки, чтобы сохранить свою работу и не делать принудительных нажатий. Предположим, что ваша текущая ветвь, которая была перебазирована по ошибке, называется your-branch и отслеживает origin/your-branch

  • git branch -m your-branch-rebased # переименовать текущую ветку
  • git checkout origin/your-branch # оформление заказа до последнего состояния, о котором известно происхождение
  • git checkout -b your-branch
  • проверьте git log your-branch-rebased, сравните с git log your-branch и определите коммиты, отсутствующие в your-branch
  • git cherry-pick COMMIT_HASH за каждый коммит в your-branch-rebased
  • нажмите ваши изменения. Обратите внимание, что два локальных филиала связаны с remote/your-branch, и вы должны нажимать только your-branch
11 голосов
/ 12 марта 2015

Следуя решению @Allan и @Zearin, я хотел бы просто сделать комментарий, но мне не хватает репутации, поэтому я использовал следующую команду:

Вместо того, чтобы делать git rebase -i --abort (обратите внимание на -i ), я должен был просто сделать git rebase --abort ( без -i ).

Использование одновременно -i и --abort приводит к тому, что Git показывает мне список использования / опций.

Итак, мой предыдущий и текущий статус ветки в этом решении:

matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort

matbhz@myPc /my/project/environment (branch-123)
$
4 голосов
/ 09 февраля 2017

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

git rebase -i HEAD~31

Интерактивная перебазировка за последние 31 коммитов (это не повредит, если вы выберете слишком много).

Просто возьмите коммиты, от которых вы хотите избавиться, и пометьте их "d" вместо "pick". Теперь коммиты эффективно удаляются, отменяя перебазирование (если вы удаляете только коммиты, которые вы только что получили при перебазировании).

1 голос
/ 10 января 2019

Если вы находитесь на ветке, вы можете использовать:

git reset --hard @{1}

Существует не только справочный журнал для HEAD (полученный с помощью git reflog), но также есть журналы для каждой ветви (полученный с помощью git reflog <branch>). Итак, если вы находитесь на master, то git reflog master перечислит все изменения в этой ветке. Вы можете сослаться на эти изменения по master@{1}, master@{2} и т. Д.

git rebase обычно меняет HEAD несколько раз, но текущая ветвь будет обновляться только один раз.

@{1} - это просто ярлык для текущей ветви , поэтому он равен master@{1}, если вы используете master.

git reset --hard ORIG_HEAD не будет работать, если вы использовали git reset во время интерактивного rebase.

0 голосов
/ 29 мая 2019

Для новичков / тех, кто слишком боится сделать полный сброс, вы можете извлечь коммит из reflog, а затем сохранить его как новую ветвь.

git reflog

Найти коммит непосредственно перед тем, как вы начали ребазинг. Возможно, вам придется прокрутить дальше вниз, чтобы найти его (нажмите Enter или PageDown). Запишите номер ГОЛОВКИ и замените 57:

git checkout HEAD@{57}

Просмотрите ветку / commitits, если она выглядит хорошо, создайте новую ветку, используя эту HEAD:

git checkout -b new_branch_name
0 голосов
/ 06 мая 2019

git reset --hard origin / {branchName}

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

0 голосов
/ 09 марта 2016

Если вы что-то напутали в git rebase, например git rebase --abort, пока у вас есть незафиксированные файлы, они будут потеряны и git reflog не поможет. Это случилось со мной, и вам нужно будет думать нестандартно здесь. Если вам повезло, как и мне, и вы используете IntelliJ Webstorm, тогда вы можете right-click->local history и вернуться к предыдущему состоянию ваших файлов / папок, независимо от того, какие ошибки вы допустили при работе с версионным программным обеспечением. Всегда хорошо запускать другой отказоустойчивый.

...