如何撤销成功的;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@{...}