-
Notifications
You must be signed in to change notification settings - Fork 39
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
如何理解git cherry pick? #172
Comments
概述git cherry-pick是一个非常强大的命令,这个命令可以使得任意Git commits被选中,然后添加到当前的工作HEAD。Cherry pick可以从一个分支选中一个commit,然后再应用到另外一个分支。 git cherry-pick对于undoing的改变是很有用的。例如,一个commit意外提交到了错误的分支。你可以切换到当前分支然后cherry-pick这个commit到它本该属于的地方。 思考:看起来git cherry-pick做的事情是把一个branch上的commit,转移到另一个branch上。 什么时候使用git的cherry pickgit cherry-pick 是一个很好用工具,但并不是所有场景都适用。Cherry picking可以导致重复提交而且许多场景下的cherry pick,传统的merge是更好的选择。尽管如此,git cherry-pick在一些场景下还是很方便的工具。 团队合作很多时候,团队里的成员会操作同一段代码。也许一个新的产品特性有一个后端和前端组件。也许在两个产品部门之间有共享的代码。也许后端开发者创建的数据结构,前端也要利用。前端开发者可以用git cherry-pick去选择创建这个数据结构的commit。这个选择可以使前端开发继续开发项目的前端部分。 思考:前后端合作时,前端可以从后端的commit上拿到伪数据?前后端分离模式下有点难哦。除非是nodejs,python,java全栈项目,前后端代码公用一个仓库的情况下。 Bug hotfixes发现bug就要最快速度去修复。比如这个场景,开发人员在一个新的feature上开始工作。 撤销改变并且恢复丢失的提交又是一个feature分支被淘汰了并且不能被merge到master。又是pr在没有合并的情况下关闭。Git不会丢掉这些commit,通过git log和git reflog可以找到这些commit,然后cherry pick新生。 思考:找到丢失的commit hash,直接cherry pick到当前分支即可。 如何使用git cherry pick为了演示如何使用git cherry-pick,我们假设Feature和Master分支是下面的状态。
git cherry-pick的语法是这样的: 在这个例子中,commitSha是一个commit引用。你可以通过git log找到commit引用。在这个例子中我们假设自己想在master分支上用'f'这个提交。 第一步,切换到master分支:
成功从特性分支中提取出f commit并添加到master分支。 在自己的项目中测试成功!
git cherry pick的使用示例git cherry pick可以加一些额外的选项。 cherry-pick前修改commit信息
cherry-pick前删除commit信息
cherry-pick后commit信息上增加”signoff“标记
这些有用的选项,可以帮助cherry pick做多种多样的合并策略。可以查看git合并策略去了解更多。 另外,git cherry pick还有一些解决冲突的选型:--abort --continue 和 --quit,这些选项在git merge和git rebase上更深入。 总结cherry pick是一个强大的方便的命令,在一些场景下是很好用的。cherry pick不应该和git merge,git rebase混淆。git log命令可以帮助cherry pick去查找commit。 收获:cherry-pick可以很方便的把一个branch上的commit,复制一份到另一个branch上面。 |
The text was updated successfully, but these errors were encountered: