Git知识rebase, merge, cherry-pick

本文详细解析了Git中Rebase与Merge的区别及应用场景,通过对比两种方式产生的历史记录,帮助开发者理解何时应选择Rebase,何时更适合使用Merge。同时,文章提供了具体的实例来说明这两种操作可能带来的不同结果。

如何优雅地使用 Git - 掘金
https://juejin.im/post/5a54386af265da3e3b7a6317

如何和产品妹子解释什么是变基
https://mp.weixin.qq.com/s?__biz=MzA3ODUxMjMyMw==&mid=2649753261&idx=1&sn=091ab93c0e15f02c7d8d45cf634a8820#rd

你会在 WebIDE 里变基么?
https://mp.weixin.qq.com/s?__biz=MzA3ODUxMjMyMw==&mid=2649753249&idx=1&sn=0e60ecb1d128696e6323552b082471ef&scene=21#wechat_redirect

git rebase vs git merge详解 - 世有因果知因索果 - 博客园
https://www.cnblogs.com/kidsitcn/p/5339382.html

git merge 和 git rebase 小结 - 优快云博客
http://blog.youkuaiyun.com/wh_19910525/article/details/7554489

在开发过程中使用git rebase还是git merge

https://www.zhihu.com/question/36509119

Git Rebase原理以及黄金准则详解 - 某熊的全栈之路 - SegmentFault 思否
https://segmentfault.com/a/1190000005937408

Elpie Kay

不管用什么风格的操作流程来整合你的本地分支,最终,这条分支是要和服务器上的目标分支做一次merge的。

通常情况下有这么两种情形:

  1. 本地分支是A-B-C-D,服务器上是A-B。这时候直接push,服务器上也会变成A-B-C-D,这种是快进式合并。结束后,历史树是一条线。

2.本地分支A-B-C-D,服务器上是A-B-E。这时候直接push,假如设置允许这次push并且没有冲突的话,那最终服务器上会是A-B-分叉:一边是C-D,一边是E,然后E和D又连到一个新的merge commit F上。优点:记录下合并动作;缺点:很多时候这种合并动作是垃圾信息,记录意义不大,反而把历史树搞得复杂不直观,会对实际工作带来负面作用。

负面作用实例:某工在push完提交以后,想用当前分支最新的代码编译一个版本,于是就在D上打了个tag,因为他想D是最新的一笔提交嘛,然后让编译job根据这个tag去抓代码编译了,编完后同事跑来跟他反馈说,这版本不对呀,我改的E好像没起效果嘛。我比你先push的,你说你取了最新的代码,怎么会没有我的改动呢?

某工应该把tag打在F上,才能取到当时最新的版本。他在取版本时不用tag而是用branch,那是可以避免这种情况的,因为branch一般指向的commit就是最新的。但也存在风险:job去取分支时,分支上又被其他人上了新的提交,这个新提交很可能并不是他想要的,还可能带来不好的副作用。如果先处理一下,使得最终提交是像第1种情形里的那样,那tag打在D上是没有问题的。

那某工在提交之前,如果先做一次rebase。git pull --rebase,那么本地分支就会被更新成A-B-E-C’-D’,把C-D的基从B上变到E上,这时再去push,那服务器上也变成A-B-E-C’-D’. 那tag打在D’上就行了。目标分支上的历史树还是一条线。

当然他也可以先在本地merge。默认情况下git pull origin 远程分支,会把远程分支上的E更新到本地,然后merge到本地分支上。merge结束后,本地最新的一个commit就是F,某工可以清楚地知道现在最新的commit是F而不是D,tag也不会建错。这时再push,那服务器上也会进行快进式合并,目标分支也会更新到F上。但历史树不是一条线了,中间有分叉然后又合并到一起。

这种有分叉的历史树还是有一个优点,D和E分别代表了某工和同事各自的版本,D上不包含E的改动,E上不包含CD的改动。而一条线的话,D’是包含了E的改动的,而E不包含C’D’。此时如果想要D的版本(不包含E),那得把D找出来,建个tag或者branch引用起来;或者在D’后面把E的改动revert掉。

其它可能还有一些情形,但大致上会是第二种情形的变形。rebase和merge的使用得看具体的情形,并不存在谁比谁好。rebase和merge比起来,相对难以理解和使用一些。在学习rebase的过程中,可以把它分解成cherry-pick来做。

git cherry-pick用法 - 简书
https://www.jianshu.com/p/d577dcc36a08

Git cherry-pick - 小白搞技术 - 博客园
https://www.cnblogs.com/yangweiqiang/p/6958464.html

<think> 首先,用户的问题是:“git pull和git cherry-pick的区别”。我需要用中文回答这个问题。 关键点: - 回答必须用中文。 - 回答完问题后,必须在末尾输出“§§相关问题§§”,然后在同一行开始列出3-5个相关问题。 - “§§相关问题§§”必须是第一行完整的输出,禁止换行分散。 - 相关问题必须基于用户的问题及我的回答。 回顾用户的问题:比较git pull和git cherry-pick的区别。 我的回答结构: 1. 先回答问题:解释git pull和git cherry-pick的区别。 2. 然后,输出“§§相关问题§§”,并立即列出3-5个相关问题。 在之前的响应中,我有一个示例关于git cherry-pick的用法,现在是比较两者。 区分git pull和git cherry-pick- git pull:用于从远程仓库获取更新并合并到当前分支。相当于git fetch + git merge(或git fetch + git rebase,取决于配置)。它会更新整个分支。 - git cherry-pick:用于将特定提交应用到当前分支,而不是整个分支。它选择性地复制提交。 主要区别: - 范围:git pull 获取并合并整个远程分支的更改,而git cherry-pick只应用指定的提交。 - 目的:git pull 用于同步远程更改,git cherry-pick 用于选择性地移植提交。 - 工作方式:git pull 自动更新,git cherry-pick 需要手动指定提交哈希。 用中文回答: - 开始解释区别。 然后,生成3-5个相关问题: - 基于用户的问题(比较git pull和git cherry-pick)和我的回答。 - 问题应该相关,比如涉及git的其他命令、使用场景、常见问题等。 可能的§§相关问题§§: 1. 什么时候应该使用git pull而不是git cherry-pick? 2. git cherry-pickgit rebase有什么不同? 3. 在使用git pull时如何避免冲突? 4. 如何撤销一个git pull操作? 5. git cherry-pick是否会影响提交历史? 确保有3-5个问题。 输出格式: - 回答内容。 - 然后,"§§相关问题§§"后跟问题列表,没有换行,直接在同一行开始。 例如: 回答... §§相关问题§§1. ... 2. ... 3. ... 在之前的响应中,我使用了数字列表,所以我应该这样做。 最终输出: - 中文回答。 - §§相关问题§§ - 1. ... 2. ... 3. ... (至少3个) </think> ### git pull 和 git cherry-pick 的区别 `git pull` 和 `git cherry-pick` 都是 Git 中用于代码同步的工具,但它们在目的、工作方式和适用场景上有显著差异: 1. **目的不同**: - **git pull**:主要用于从远程仓库获取最新更改并合并到当前分支。它相当于 `git fetch`(下载远程数据)加上 `git merge` 或 `git rebase`(合并到本地分支),目的是同步整个分支的状态。 - **git cherry-pick**:用于选择性地复制另一个分支的特定提交到当前分支,而不是获取整个分支。它只应用指定的提交(如修复 bug 的功能),目的是移植个别更改而不影响其他历史。 2. **工作方式不同**: - **git pull**:操作自动化程度高,命令如 `git pull origin main` 会自动获取远程 `main` 分支的更新并尝试合并。如果出现冲突,需要手动解决。 - **git cherry-pick**:需要手动指定提交哈希(如 `git cherry-pick abc123`),只复制该提交的内容。如果提交有依赖关系,可能导致冲突,需手动处理。 3. **适用场景**: - **git pull**:适合日常开发中保持本地代码与远程同步,例如当团队成员更新了代码库时。 - **git cherry-pick**:适用于特定场景,如将热修复从开发分支移植到生产分支,避免不必要的合并历史。 4. **影响和历史记录**: - **git pull**:可能会改变当前分支的提交历史(如创建合并提交),并引入所有远程更新的提交。 - **git cherry-pick**:只添加指定提交作为新提交,不会引入整个分支历史,但可能破坏提交间的依赖关系。 总之,`git pull` 是“整体同步”,而 `git cherry-pick` 是“选择性复制”。使用 `git pull` 时需注意冲突风险,`git cherry-pick` 则更适合精细操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值