git reset和git cherry-pick

时间:2017-01-12 07:54:51

标签: git github git-cherry-pick

我从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有什么不同,因为我只在一个分支中工作。

2 个答案:

答案 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-pickrebase无法解决问题时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-pickgit reset有很多选项,例如:

要重置为当前HEAD

git reset --hard HEAD

要重置一次提交并删除更改:

git reset --hard HEAD~1

这个1可以删除任意数量的提交。并且为了保留提交的更改,您可以使用--soft代替--hard

对于cherry-pick,语法为:

git cherry-pick <commit-hash>