Как отменить успешный "вишневый выбор" git?
На локальном репо я только что выполнил git cherry-pick SHA
без каких-либо конфликтов или проблем. Затем я понял, что не хочу делать то, что я только что сделал. Я не толкнул это нигде.
Как я могу удалить только эту вишню?
Я хотел бы знать, если есть способ сделать это:
- когда у меня есть другие локальные изменения
- когда у меня нет других локальных изменений
Желательно с одной командой для обоих случаев, если это возможно.
Ответы
Ответ 1
Вишневый выбор в основном является фиксацией, поэтому, если вы хотите его отменить, вы просто отмените фиксацию.
когда у меня есть другие локальные изменения
Сбрасывайте текущие изменения, чтобы их можно было повторно применить после сброса фиксации.
$ git stash
$ git reset --hard HEAD^
$ git stash pop # or `git stash apply`, if you want to keep the changeset in the stash
когда у меня нет других локальных изменений
$ git reset --hard HEAD^
Ответ 2
Чтобы отменить последнее коммит, просто выполните git reset --hard HEAD~
.
Изменить: этот ответ применяется к более ранней версии вопроса, которая не упоминает о сохранении локальных изменений; принятый ответ от Тима действительно правильный. Благодаря qwertzguy для головок.
Ответ 3
Если возможно, избегайте жестких сбросов. Жесткие сбрасывания - одна из немногих разрушительных операций в git. К счастью, вы можете отменить выбор вишни без сбрасываний и избежать чего-либо разрушительного.
Обратите внимание на хеш вишни, который вы хотите отменить, скажем, ${bad_cherrypick}
. Сделайте a git revert ${bad_cherrypick}
. Теперь содержимое вашего рабочего дерева так же, как и до вашей плохой вишневой подборки.
Повторите git cherry-pick ${wanted_commit}
, и когда вы будете довольны новым вишневым кирком, сделайте git rebase -i ${bad_cherrypick}~1
. Во время rebase удалите как ${bad_cherrypick}
, так и соответствующий его возврат.
В отрасли, в которой вы работаете, будет только хороший вишневый подбор. Сброс не требуется!
Ответ 4
Столкнувшись с этой же проблемой, я обнаружил, что с момента успешного выполнения вишни -p ick вы совершали и/или отправляли на удаленный компьютер и хотите удалить его, вы можете найти вишню -p ick SHA, выполнив команду:
git log --graph --decorate --oneline
Затем (после использования :wq
для выхода из журнала) вы можете удалить вишню -p ick, используя
git rebase -p --onto YOUR_SHA_HERE^ YOUR_SHA_HERE
где YOUR_SHA_HERE
равен вишне -p, выбранному коммиту 40- или сокращенному 7-символьному SHA.
Во-первых, вы не сможете отправить свои изменения, потому что у вашего удаленного репо и вашего локального репо будут разные истории фиксации. Вы можете заставить свои локальные коммиты заменить то, что на вашем пульте, используя
git push --force origin YOUR_REPO_NAME
(Я адаптировал это решение от Сета Робертсона: см. "Удаление всего коммита".)
Ответ 5
git reflog
может прийти вам на помощь.
Введите его в свою консоль, и вы получите список своей истории git вместе с SHA-1, представляющим их.
Просто проверьте все SHA-1, которые вы хотите вернуть
Ответ 6
Одна команда и не использует деструктивную команду git reset
:
GIT_SEQUENCE_EDITOR="sed -i 's/pick/d/'" git rebase -i HEAD~ --autostash
Он просто отбрасывает фиксацию, возвращая вас точно в состояние до выбора вишни, даже если у вас были локальные изменения.
Ответ 7
git cherry-pick -abort
- ваш спаситель.