На локальном репо я только что выполнил git cherry-pick SHA
без каких-либо конфликтов или проблем. Затем я понял, что не хочу делать то, что только что сделал. Я никуда этого не толкал.
Как я могу удалить только эту вишенку?
Я хотел бы знать, есть ли способ сделать это:
- когда у меня есть другие локальные изменения
- когда у меня нет других местных изменений
Если возможно, желательно с одной командой в обоих случаях.
Чтобы отменить последнюю фиксацию, просто сделайте это
git reset --hard HEAD~
.Изменить : этот ответ относился к более ранней версии вопроса, в которой не упоминалось сохранение локальных изменений; принятый ответ Тима действительно правильный. Спасибо qwertzguy за внимание.
источник
HEAD
) более надежен: рассмотрим неудачный случай, когдаhead
это имя существующей ссылки.По возможности избегайте аппаратных сбросов. Жесткий сброс - одна из очень немногих деструктивных операций в git. К счастью, вы можете отменить выборку без сброса и избежать чего-либо разрушительного.
Обратите внимание на хеш выборки, которую вы хотите отменить, скажем так
${bad_cherrypick}
. Сделатьgit revert ${bad_cherrypick}
. Теперь содержимое вашего рабочего дерева такое же, как и до вашего неудачного выбора.Повторите
git cherry-pick ${wanted_commit}
, и когда вы будете довольны новым выбором вишни, сделайтеgit rebase -i ${bad_cherrypick}~1
. Во время перебазирования удалите оба${bad_cherrypick}
и соответствующий откат.В ветке, над которой вы работаете, будет только хороший выбор. Сброс не требуется!
источник
git reflog
может прийти вам на помощь.Введите его в свою консоль, и вы получите список вашей истории git вместе с SHA-1, представляющим их.
Просто проверьте любой SHA-1, к которому вы хотите вернуться
Прежде чем ответить, давайте добавим немного предыстории, объясняя, что это такое
HEAD
.First of all what is HEAD?
HEAD
просто ссылка на текущую фиксацию (самую последнюю) в текущей ветке.В
HEAD
любой момент времени может быть только один . (исключаяgit worktree
)Содержимое
HEAD
хранится внутри.git/HEAD
и содержит 40 байт SHA-1 текущего коммита.detached HEAD
Если вы не в последней фиксации - это означает, что
HEAD
это указывает на предыдущую фиксацию в истории, которую он вызываетdetached HEAD
.В командной строке это будет выглядеть так: SHA-1 вместо имени ветки, поскольку
HEAD
не указывает на конец текущей ветки.Несколько вариантов восстановления после отключенной HEAD:
git checkout
Это проверит новую ветку, указывающую на желаемый коммит.
Эта команда выполнит проверку для данной фиксации.
На этом этапе вы можете создать ветку и начать работу с этого момента.
git reflog
Вы всегда можете использовать
reflog
также.git reflog
отобразит любое изменение, которое обновилоHEAD
файл, и проверка нужной записи в журнале reflogHEAD
вернет этот коммит обратно.Каждый раз, когда ГОЛОВА изменяется, в
reflog
Это вернет вас к желаемой фиксации
git reset --hard <commit_id>
«Переместите» вашу ГОЛОВУ обратно к желаемой фиксации.
# This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there's work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts if you've modified things which were # changed since the commit you reset to.
вы также можете использовать
git rebase --no-autostash
.git revert <sha-1>
«Отменить» данную фиксацию или диапазон фиксации.
Команда сброса "отменит" любые изменения, сделанные в данной фиксации.
Новая фиксация с патчем отмены будет зафиксирована, а исходная фиксация также останется в истории.
# add new commit with the undo of the original one. # the <sha-1> can be any commit(s) or commit range git revert <sha-1>
Эта схема показывает, какая команда что делает.
Как видите,
reset && checkout
измените файлHEAD
.источник
git reset --hard
Столкнувшись с той же проблемой, я обнаружил, что если вы совершили и / или нажали на удаленный доступ после успешного выбора вишни, и вы хотите удалить его, вы можете найти SHA вишневого выбора, запустив:
git log --graph --decorate --oneline
Затем (после использования
:wq
для выхода из журнала) вы можете удалить выборку с помощьюgit rebase -p --onto YOUR_SHA_HERE^ YOUR_SHA_HERE
где
YOUR_SHA_HERE
равно 40- или сокращенному 7-значному SHA выбранной фиксации.Сначала вы не сможете протолкнуть свои изменения, потому что ваше удаленное репо и ваше локальное репо будут иметь разные истории фиксации. Вы можете заставить свои локальные коммиты заменять то, что находится на вашем пульте дистанционного управления, используя
git push --force origin YOUR_REPO_NAME
(Я адаптировал это решение от Сета Робертсона : см. «Удаление всей фиксации».)
источник
Одна команда и не использует деструктивную
git reset
команду:GIT_SEQUENCE_EDITOR="sed -i 's/pick/d/'" git rebase -i HEAD~ --autostash
Он просто сбрасывает фиксацию, возвращая вас точно в состояние до выбора вишни, даже если у вас были локальные изменения.
источник
git reset HEAD^
делает?git reset
отменяет действие фиксации без отмены каких-либо изменений. Я рекомендую вам прочитать git-scm.com/docs/git-reset . Вопрос от OP - отменить выбор вишни. Попробуйте обе команды, моя вернет вас в то же состояние, в котором вы были до выбора вишни.git reset
испортит ваше рабочее дерево, поскольку оно оставит выбранные вами изменения, и они станут неотличимы от ваших ранее существовавших локальных изменений.reset --hard
. Не оставляет никаких измененийgit reset --hard
- это деструктивная команда, которая также удалит несвязанные локальные изменения и сделает это безвозвратно! Так что ОП просила не об этом.sed
команда, чем она отличается от выполнения вручную и что--autostash
делает.