如何撤销成功的;git cherry pick“;?

如何撤销成功的;git cherry pick“;?,git,Git,在本地回购中,我刚刚执行了git cherry pick SHA,没有任何冲突或问题。然后我意识到我不想做我刚才做的事。我没有把这个推到任何地方 我怎样才能只摘下这棵樱桃树 我想知道是否有办法做到这一点: 当我有其他本地更改时 当我没有其他本地更改时 如果可能,两种情况下最好使用一个命令 要撤消上次提交,只需执行git reset--hard HEAD~ 编辑:此答案适用于问题的早期版本,该版本未提及保留本地更改;蒂姆接受的答案确实是正确的。感谢qwertzguy的提醒。一个樱桃选择基本上就

在本地回购中,我刚刚执行了
git cherry pick SHA
,没有任何冲突或问题。然后我意识到我不想做我刚才做的事。我没有把这个推到任何地方

我怎样才能只摘下这棵樱桃树

我想知道是否有办法做到这一点:

  • 当我有其他本地更改时
  • 当我没有其他本地更改时

如果可能,两种情况下最好使用一个命令

要撤消上次提交,只需执行
git reset--hard HEAD~


编辑:此答案适用于问题的早期版本,该版本未提及保留本地更改;蒂姆接受的答案确实是正确的。感谢qwertzguy的提醒。

一个樱桃选择基本上就是一个提交,所以如果你想撤销它,你只需撤销提交即可

$ git stash
$ git reset --hard HEAD^
$ git stash pop  # or `git stash apply`, if you want to keep the changeset in the stash
当我有其他本地更改时

隐藏当前更改,以便在重置提交后重新应用它们

$ git stash
$ git reset --hard HEAD^
$ git stash pop  # or `git stash apply`, if you want to keep the changeset in the stash
当我没有其他本地更改时


git reflog
可以帮助您

在控制台中键入它,您将得到一个git历史记录列表,以及代表它们的SHA-1

只需签出您希望恢复到的任何SHA-1即可


在回答之前,让我们添加一些背景知识,解释一下这是什么

首先什么是头?
HEAD
只是对当前分支上当前提交(最新)的引用。
在任何给定时间只能有一个
。(不包括git工作树

HEAD
的内容存储在
.git/HEAD
中,它包含当前提交的40字节SHA-1


分离头
如果您不在最新提交上-意味着
头部
指向历史记录中的先前提交,则称为
分离头部

在命令行上,它看起来像-SHA-1,而不是分支名称,因为
没有指向当前分支的尖端

有关如何从分离的头部恢复的几个选项:
这将使你回到你想要的承诺


“移动”你的头回到想要的位置

#这将破坏任何本地修改。
#如果你有未完成的工作要做,就不要做。
git重置—硬0d1d7fc32
#或者,如果有工作要做:
暂存
git重置—硬0d1d7fc32
吉特隐藏流行音乐
#这将保存修改,然后在重置后重新应用该修补程序。
#如果您修改了已删除的内容,则可能会出现合并冲突
#自您重置到的提交后已更改。
  • 注:()
    您还可以使用git-rebase--no-autostash

“撤消”给定的提交或提交范围。
重置命令将“撤消”给定提交中所做的任何更改。
将提交带有撤消修补程序的新提交,而原始提交也将保留在历史记录中

#通过撤消原始提交添加新提交。
#可以是任何提交或提交范围
git还原

此架构说明了哪个命令做什么。
正如您在那里看到的那样,
重置和签出
修改
标题


一个命令,并且不使用破坏性的
git重置
命令:

GIT\u SEQUENCE\u EDITOR=“sed-i's/pick/d/””GIT-rebase-i HEAD~--autostash


它只是简单地删除提交,即使您有本地更改,也会将您完全恢复到樱桃拾取之前的状态。

如果可能,请避免硬重置。硬重置是git中为数不多的破坏性操作之一。幸运的是,您可以在不重置的情况下撤消樱桃拾取,并避免任何破坏性操作

请注意要撤消的cherry pick的散列,假设它是
${bad\u cherrypick}
。执行
git revert${bad\u cherrypik}
。现在,你的工作树的内容与你的坏樱桃采摘之前一样

重复你的
git cherry pick${wanted\u commit}
,当你对新的cherry pick感到满意时,执行
git rebase-i${bad\u cherry pick}~1
。在重新基址期间,删除
${bad_cherrypik}
及其相应的还原


你正在经营的那家分店只有好的樱桃树。无需重置

面对同样的问题,我发现如果您在成功进行cherry pick后已提交和/或推送到remote,并且您希望删除它,则可以通过运行以下命令找到cherry pick的SHA:

git日志--图形--装饰--单线

然后,(使用
:wq
退出日志后)可以使用

git-rebase-p——在这里你的SHA上^在这里你的SHA上

其中,
此处的\u SHA\u
等于cherry picked commit的40个字符或缩写的7个字符的SHA

首先,您将无法推动您的更改,因为您的远程repo和本地repo将具有不同的提交历史记录。您可以通过使用强制本地提交来替换远程提交上的内容

git-push——强制来源您的\u REPO\u名称


(我将此解决方案改编自:请参见“删除整个提交”)

应该是HEAD^或HEAD~1,它们都相当于HEAD~(和HEAD^1),这是正确的@davideutsch(尽管仅在较新版本的Git中),但大写(
HEAD
)更健壮:考虑不幸的情况:<代码>头<代码>是现有引用的名称。@ Jubbs-好点;我在回答中改变了语气。@qwertzguy,接得好;看看时间戳,在我发布这个答案一分钟后,关于本地更改的部分被添加到问题中:)它只是删除了提交。你觉得呢
git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back
# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>
git reflog
git checkout HEAD@{...}