我从https://github.com/blog/2019-how-to-undo-almost-anything-with-git读到了这个:
如果要恢复项目的历史记录,请使用git reset --hard 如果您想将其中一个提交重放到您的存储库中,请使用git cherry-pick。
我是初学者,还没有进入分支。对我来说,这里使用的cherry-pick似乎与git reset相同。我想知道实际上git cherry-pick与git reset有什么不同,因为我只在一个分支中工作。
答案 0 :(得分:2)
完成挑选是对合并特定(甚至是一系列)提交(属于另一个分支)进行当前签出< / em>分支。
git checkout foo
#you are in branch foo. you make some EDITS on this branch.
git commit -am "my changes to foo branch"
git push
#The commit, say sha1, is pushed to foo branch.
### several other commits are pushed randomly by different users to this branch ###
让我们说,另一个用户希望将此提交sha1
从分支foo
转移到相同存储库的分支bar
。请注意,在这种情况下,分支foo
可以在sha1
提交状态的几次提交之前。
foo : ORIG_HEAD -- sha1 -- sha2 -- sha3 -- .... shaN
^~~~user want to cherry-pick
only this commit
挑选提交sha1
到分支bar
:
git checkout bar
git cherry-pick sha1
# The commit `sha1` is merged to your branch `bar` and is ahead by 1 commit
Git重置主要用于撤消本地提交或git pull / merge失败。它还用于清除 dirtly 工作树中的混乱。
例如:
$ git pull
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard # clears the mess from the index file and the working tree.
因此,挑选樱桃和git-reset都会影响HEAD位置,但它们的用例非常不同。
答案 1 :(得分:1)
git reset --hard
表示git reset --hard HEAD
,其中HEAD是当前已检出的提交的ref(引用)或当前分支中的最后一次提交,即不更改分支但删除所有本地更改,因此它将删除所有暂存和未暂停的更改。 git reset
命令提供了很多选项,这里有很好的解释:
Can you explain what "git reset" does in plain english?
而Cherry挑选意味着从一个分支中选择一个提交并将其应用到另一个分支。如果你这样做可以做到。犯了一个错误,并将更改提交到错误的分支,但不想合并整个分支。你可以这样。恢复提交并在另一个分支上挑选它。
如果您推送到错误的分支机构,或者您的分支机构出现问题,因为您的系统上存在旧的git历史记录而导致其他用户提交了大量提交(当多个用户正在工作时),您可以删除当前分支保持你的提交哈希是安全的,然后挑选提交到一个新的分支,它将从master更新。 (有时会出现这种情况,cherry-pick
或rebase
无法解决问题时merge
是一个选项。
引自这个答案:
来源: https://stackoverflow.com/a/30218784/4207394
使用git cherry-pick命令git cherry-pick commit应用 由当前分支上的命名提交引入的更改。它会 引入一个新的,独特的提交。严格来说,使用git cherry-pick不会改变存储库中的现有历史记录; 相反,它增加了历史。与其他Git操作一样 通过应用diff的过程引入更改,您可能需要 解决冲突以完全应用来自给定提交的更改。 命令git cherry-pick通常用于介绍特定的 从存储库中的一个分支提交到另一个分支。一个 常用的是来自维护的前向或后端提交 分支到开发分支。
因此,无论何时想要重置提交或更改,都可以使用git reset
和事件,如果要重置提交并保持更改的安全性,则可以git reset
使用--soft
1}}选项。如果要将提交从其他分支复制到其他分支,则可以使用git cherry-pick
。 git reset
有很多选项,例如:
要重置为当前HEAD
:
git reset --hard HEAD
要重置一次提交并删除更改:
git reset --hard HEAD~1
这个1可以删除任意数量的提交。并且为了保留提交的更改,您可以使用--soft
代替--hard
。
对于cherry-pick
,语法为:
git cherry-pick <commit-hash>