Подтвердить что ты не робот

Как отменить успешный "вишневый выбор" git?

На локальном репо я только что выполнил git cherry-pick SHA без каких-либо конфликтов или проблем. Затем я понял, что не хочу делать то, что я только что сделал. Я не толкнул это нигде.

Как я могу удалить только эту вишню?

Я хотел бы знать, если есть способ сделать это:

  • когда у меня есть другие локальные изменения
  • когда у меня нет других локальных изменений

Желательно с одной командой для обоих случаев, если это возможно.

4b9b3361

Ответ 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

- ваш спаситель.