Кто-нибудь знает, как легко отменить git rebase?
Единственный способ, который приходит на ум, это сделать это вручную:
В моей текущей ситуации это сработает, потому что я могу легко обнаружить коммиты из обеих веток (в одной был мой материал, в другой - материал моего коллеги).
Однако мой подход кажется мне неоптимальным и чреватым ошибками (допустим, я только что сделал ребайтинг с двумя своими ветками).
Есть идеи?
Уточнение: Я говорю о ребазе, во время которого было воспроизведено множество коммитов. Не только один.
Самый простой способ - найти в reflog головной коммит ветви, каким он был непосредственно перед началом rebase...
git reflog
и сбросить текущую ветку на него (с обычными оговорками о том, что нужно быть абсолютно уверенным перед сбросом с помощью опции --hard
).
Предположим, что старый коммит был HEAD@{5}
в журнале ссылок:
git reset --hard HEAD@{5}
В Windows вам может понадобиться процитировать ссылку:
git reset --hard "HEAD@{5}"
Вы можете проверить историю старой головы кандидата, просто сделав git log HEAD@{5}
(Windows: git log "HEAD@{5}"
).
Если вы не отключили рефлог ветвей, вы должны иметь возможность просто сделать git reflog branchname@{1}
, поскольку при ребазе отделяется голова ветви перед повторным присоединением к конечной голове. Я бы перепроверил это, хотя, поскольку я не проверял это в последнее время.
По умолчанию, все рефлоги активированы для непустых репозиториев:
[core]
logAllRefUpdates = true
На самом деле, перебазировать сохраняет исходную точку к `ORIG_HEAD, так это обычно так:
git reset --hard ORIG_HEAD
Однако, перезагрузка
, перемещение
и слить
все сохранить оригинал голова
указатель на ORIG_HEAD
так что, если вы'ве сделали любой из этих команд, поскольку перебазирование вы'вновь пытается отменить тогда вы'll должны использовать reflog.
Чарльз'ы ответ работает, но вы можете сделать это:
git rebase --abort
убирать после "перезагрузки".
В противном случае вы можете получить сообщение: “`интерактивные перебазирования уже начались”.
`в Git reflog покажет вам все изменения до и после перебазирования, и позволит вам найти правильный выбор для сброса. Но я'м удивлен, никто не упомянул эту и другие супер простой способ здесь:
Также, Как упоминалось уже здесь, перебазировать листья старого государства, как ORIG_HEAD
, так что вы можете отменить последнее перемещение, выполнив:
git reset --hard ORIG_HEAD
Сброс ветви на висячий объект коммита её старой вершины, конечно, является лучшим решением, потому что он восстанавливает предыдущее состояние без каких-либо усилий. Но если вы случайно потеряли эти коммиты (например, из-за того, что вы за это время собрали мусор в репозитории или это свежий клон), вы всегда можете перебазировать ветвь снова. Ключом к этому является переключатель --onto
.
Допустим, у вас есть тематическая ветвь, образно названная topic
, которую вы ответвили от master
, когда вершиной master
был коммит 0deadbeef
. В какой-то момент, находясь в ветке topic
, вы сделали git rebase master
. Теперь вы хотите отменить это. Вот как:
git rebase --onto 0deadbeef master topic
Это возьмёт все коммиты в topic
, которые не находятся в master
, и воспроизведёт их поверх 0deadbeef
.
С помощью --onto
вы можете перестроить свою историю в практически любую форму.
Развлекайтесь. :-)
Я вообще-то поставил тег резервного копирования на ветке прежде чем решать нетривиальные операции (большинство перебазирует банально, но я'd сделать это, если он выглядит везде комплекса).
Затем, восстановление так же просто, как ГИТ сброс --жесткий резервного копирования`.
В случае, если вы толкнул свою ветку в удаленный репозиторий (обычно это'происхождение) и тогда вы'ве сделано успешного перебазирования (без слияния) (`Git для перебазирования --аборт дает "Нет перебазироваться в Прогресс") Смотрите также вы можете легко сброс филиала использование команды:
&ГТ; ГИТ сброс --жесткий происхождения/{branchName}
Пример:
$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".
$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.
nothing to commit, working directory clean
Используя reflog
ничего't работа для меня.
Что работал для меня было подобно, как описано здесь. Откройте файл .в Git/журналы/рефы имени филиала, который был перебазированы и найдите строку, которая содержит "перебазировать закончены" Ну, что-то вроде:
5fce6b51 88552c8f Kris Leech <[email protected]> 1329744625 +0000 rebase finished: refs/heads/integrate onto 9e460878
Проверка второй коммит перечислены на линии.
git checkout 88552c8f
После подтверждения этому содержатся мои потерянные изменения, я попробовал и издал вздох облегчения.
git log
git checkout -b lost_changes
Для нескольких коммитов помните, что любой коммит ссылается на всю историю, предшествующую этому коммиту. Поэтому в ответе Чарльза читайте "старый коммит" как "самый новый из старых коммитов". Если вы вернётесь к этому коммиту, то вся история, предшествующая этому коммиту, появится снова. Это должно сделать то, что вы хотите.
После решения @Аллан и @Zearin, я желаю что я мог бы просто сделать замечание, хотя, но я не'т достаточно репутации, поэтому я использовал следующую команду:
Вместо того, чтобы делать git для перебазирования -я-аборт
(примечание -Я) мне пришлось просто сделать ГИТ перебазирования --отбой
(не в я).
Используя как я
и --аборт
в то же время вызывает Git, чтобы показать мне список использования/параметры.
Поэтому мое предыдущее и текущее состояние отрасли с это решение:
matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort
matbhz@myPc /my/project/environment (branch-123)
$
Если вы успешно корректируются с учетом удаленную ветку и не могу ГИТ перебазирования --абортвы все еще можете сделать некоторые уловки, чтобы сохранить свою работу и Дон'т придется принудительно толкает. Предположим, вашей текущей веткой, что было приведено по ошибке называют
свой-филиали отслеживания происхождения/ваш филиал
Git в ветке-твой-филиал-перебазируется
# переименовать текущую веткуGit в кассе происхождения/ваш-филиал
# checkout, чтобы последнее состояние, которое известно происхождениеГИТ кассе -б ваш филиал
, чтобы сравнить
в Git журнала свой филиал и определить коммиты, которые отсутствуют у вашего-филиал`ГИТ выбирают COMMIT_HASH на каждый коммит в свой филиал-перебазируется
Позвольте'ы сказать, что я мастер перебазироваться на мою ветку, а я вам 30 новых коммитов, которые что-то сломать. Я'ве обнаружили, что часто Это'ы можете просто удалить плохое совершает.
git rebase -i HEAD~31
Интерактивные перебазирования за последние 31 обязывает (это вовсе'т больно, если вы выбираете слишком много).
Просто взять коммиты, которые вы хотите избавиться, и пометить их с "Д" и вместо "и выбрать" по. Теперь коммиты удаляются эффективно отмена перебазировать (если вы удалите только коммитов, которые вы только что получили, когда перебазирования).
Для новичков/кто-то слишком боится делать жесткий сброс, вы можете оформить заказ совершить из reflog, а затем сохранить его в качестве нового филиала.
git reflog
Найти совершить непосредственно перед началом перебазирования. Вы, возможно, потребуется прокрутить вниз, чтобы найти его (нажмите Enter или вниз). Принять к сведению головки и замены 57:
git checkout HEAD@{57}
Комментарий филиал/совершает, если он выглядит хорошо создать новую ветку, используя эту голову:
git checkout -b new_branch_name
Если вы находитесь на ветке вы можете использовать:
git reset --hard @{1}
Там не только справочную журнал для руководителя (полученных в Git reflog
), есть также reflogs для каждого филиала (полученных в Git reflog &ЛТ;филиал&ГТ;
). Поэтому, если вы находитесь на мастер
, затем в Git reflog мастер будут перечислены все изменения в этой ветке. Вы можете сослаться на то, что изменения
мастер@{1},
Мастер@{2}` и т. д.
Git для перебазирования
обычно будут меняться на голову несколько раз, но текущая ветка будет обновляться только один раз.
@{1}
- это просто ярлык для текущей ветви, поэтому он's, равных мастер@{1}
Если вы мастер
.
ГИТ сброс --жесткий ORIG_HEAD не будет работать, если вы использовали
ГИТ сброс в интерактивной перебазировка
.
Что я обычно делаю это
ГИТ сброс #commit_hash
на последний коммит, где я думаю, перебазировать не имели никакого эффекта.
затем извлечения
Теперь ваша ветка должна соответствовать точности как Мастер и перебазируется совершает не должно быть в нем.
Теперь можно просто отбирают совершает на этой ветке.
Если вы что-то напутали в ГИТ перебазирования, например, `Git для перебазирования --аборт, а у вас есть несохраненные файлы, они будут потеряны и в Git reflog не поможет. Это случилось со мной, и вы должны думать вне коробки здесь. Если вам повезло как мне и использовать IntelliJ Webstorm, то вы можете Правой Кнопкой Мыши-&ГТ;краеведение и может вернуться в предыдущее состояние файла или папки, не важно, какие ошибки вы сделали с программным обеспечением версий. Это всегда хорошо иметь еще один безотказный запуск.