Вопрос: Отмена переустановки git


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

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

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

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

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

Есть идеи?

Уточнение: я говорю о переустановке, в ходе которой была переиграна куча коммитов. Не только один.


2385


источник


Ответы:


Самый простой способ - найти головную фиксацию ветви, как это было непосредственно перед началом перезагрузки в reflog ...

git reflog

и сбросить текущую ветвь к ней (с обычными предостережениями о том, чтобы быть абсолютно уверенными перед переходом с --hardопция).

Предположим, что старый коммит был HEAD@{5}в журнале регистрации:

git reset --hard HEAD@{5}

В Windows вам может потребоваться указать ссылку:

git reset --hard "HEAD@{5}"

Вы можете проверить историю старожила кандидата, просто сделав git log HEAD@{5}( Окна: git log "HEAD@{5}").

Если вы не отключили данные для каждого филиала, вы должны просто сделать git reflog branchname@{1}поскольку ребака отделяет ветвь ветви до того, как она снова присоединяется к последней голове. Я бы дважды проверял это, хотя, поскольку я не проверял это недавно.

По умолчанию все лог-файлы активируются для не-голых репозиториев:

[core]
    logAllRefUpdates = true

3284



Фактически, rebase сохраняет вашу отправную точку ORIG_HEADпоэтому это обычно просто:

git reset --hard ORIG_HEAD

Однако reset, rebaseа также mergeвсе сохранить оригинал HEADуказатель на ORIG_HEADпоэтому, если вы выполнили какие-либо из этих команд, так как rebase, который вы пытаетесь отменить, вам придется использовать reflog.


1138



Ответ Чарльза работает, но вы можете это сделать:

git rebase --abort

очистить после reset,

В противном случае вы можете получить сообщение " Interactive rebase already started».


313



Сброс ветки к обмотанному объекту фиксации его старого наконечника - это, конечно, лучшее решение, потому что оно восстанавливает предыдущее состояние, не затрачивая никаких усилий. Но если вы потеряли эти коммиты (f.ex., потому что вы мусор - собрал ваш репозиторий тем временем, или это новый клон), вы всегда можете снова переустановить ветвь. Ключом к этому является --ontoпереключатель.

Допустим, у вас была ветка темы, topic, что вы отделились masterкогда кончик masterбыл 0deadbeefсовершить. В какой-то момент topicветви, вы сделали git rebase master, Теперь вы хотите отменить это. Вот как:

git rebase --onto 0deadbeef master topic

Это займет все topicкоторые не включены masterи воспроизводить их поверх 0deadbeef,

С --onto, вы можете перестроить свою историю в значительной степени любая форма ,

Повеселись. :-)


74



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

Затем восстановление так же просто, как и git reset --hard BACKUP,


61



In case you had pushed your branch to remote repository (usually it's origin) and then you've done a succesfull rebase (without merge) (git rebase --abort gives "No rebase in progress") you can easily reset branch using command:

git reset --hard origin/{branchName}

Example:

$ ~/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

49



In case you haven't completed the rebase and in the middle of it, the following works:

git rebase --abort

48



For multiple commits, remember that any commit references all the history leading up to that commit. So in Charles' answer, read "the old commit" as "the newest of the old commits". If you reset to that commit, then all the history leading up to that commit will reappear. This should do what you want.


13