Git Cherry-pick使用
概述
无论项目大小,当你和一群程序员一起工作时,处理多个 Git 分支之间的变更都会变得很困难。有时,与其把整个 Git 分支合并到另一个分支,不如选择并移动几个特定的提交。这个过程被称为 "挑拣", 即 Cherry-pick。
本文将介绍 "Cherry-pick" 的内容、原因和方法。
让我们开始吧~
什么是 Cherry-pick?
通过 cherry-pick 命令,Git 可以将任何分支中的选定提交合并到当前的 Git HEAD 分支中。
在执行 git merge 或 git rebase 时,一个分支的所有提交都会被合并。而 cherry-pick 命令则允许你选择单个提交进行整合。
区别图示如下:

△ 使用 merge 的情况: 在执行 merge 或 rebase 时,一个分支的所有提交都会被整合。

△ 使用 cherry-pick 的情况: 允许你选择个别提交进行整合。在本例中,只有 C2 被整合到主分支,而不是 C4。
为什么要用 Cherry-pick?
下面的情况可能更容易理解 "Cherry-pick" 的作用。
想象一下,您正在为即将到来的每周 spring 实施新功能。代码准备就绪后,您将把它推送到远程分支,准备进行测试。
然而,客户并不满意所有的修改,要求你只提交某些修改。因为客户还没有批准下次发布的所有修改,所以 git rebase 不会产生预期的结果。因为 git rebase 或 git merge 会将上一次冲刺的所有调整都纳入其中。
而 "Cherry-pick" 就能解决这个问题!因为 "Cherry-pick" 只关注提交中添加的改动,所以它只会带来已批准的改动,而不会添加其他提交。
使用 "Cherry-pick" 还有其他一些原因:
- 这对修复 bug 非常重要,因为开发分支中的 bug 都是用它们的提交设置的。
- 通过使用
git cherry-pick,而不是其他应用指定提交的改动的选项(如git diff),可以避免不必要的争斗。 - 如果因为各 Git 分支的版本不兼容而无法进行完整的分支合并,它就是一个很有用的工具。
什么时候用 Cherry-pick?
简而言之就是:尽量少用。之所以要尽量少用 cherry-pick,是因为它很容易产生 "重复"提交:当你使用 cherry-pick 将一个提交整合到 HEAD 分支时,Git 必须创建一个内容完全相同的新提交。不过,这是一个全新的提交对象,有自己的 SHA 标识符。同时也会失去跟踪提交历史的能力。
如果你不按顺序提交了很多提交,这些提交就会被记录在你的分支中,这可能会导致你的 Git 分支出现不理想的结果。
只要能用传统的合并或重置来整合,就应该这么做。Cherry-pick 应保留给不可能这样做的情况,例如必须创建 Hotfix 或只想从一个废弃的分支中保存一个或几个提交。
如何使用 Cherry-pick 命令?
流程概述
下面是使用步骤:
- 拉取本地分支。使用
git fetch。 - 回到要合并的分支。你可能会通过运行
git checkout main来做到这一点。 - 找到要拉入分支的提交。转到
git log,为每条提交获取唯一的提交哈希值。 - "Cherry-pick" 您想要加入该分支的提交。运行以下命令:
git cherry-pick <commit sha>。这将只把这个提交拉入当前分支。 - (可选) 在某些情况下, 可能需要手动解决冲突.
- 像往常一样推送这个分支:
git push origin main。
具体命令
在 cherry-pick 命令的最简单形式中,你只需使用要集成到当前 HEAD 分支中的提交的 SHA 标识符即可。
要获取提交哈希值,可以使用 git log 命令:
git log --oneline
知道 commit 的哈希值后,就可以使用 cherry-pick 命令。
语法如下:
git cherry-pick <commit sha>
Notes:
<commit sha>可以是多个
例如:
git cherry-pick 85c5532
这将把指定的更改专用于当前已签出的分支。
如果你想做进一步修改,也可以指示 Git 在你的工作副本中添加提交改动。
语法如下:
git cherry-pick <commit sha> --no-commit
如:
git cherry-pick 85c5532 --no-commit
如果您想同时选择多个提交,请添加它们的提交哈希值,中间用空格隔开:
git cherry-pick hash1 hash3
在挑选提交时,不能使用 git pull 命令,因为它会从一个版本库中获取提交并自动合并到另一个版本库中。cherry-pick 命令是专门用来避免这种情况发生的工具;取而代之的是使用 git fetch,它会获取提交但不应用它们。
Cherry-pick 实战
要尝试该过程,请启动终端并生成一个示例项目:
mkdir fruit.git
cd fruit.git
git init .
创建一些数据并提交:
echo "Kiwifruit" > fruit.txt
git add fruit.txt
git commit -m 'First commit'
现在,创建一个项目的 fork 来代表远程开发者:
mkdir ~/fruit.fork
cd !$
echo "Strawberry" >> fruit.txt
git add fruit.txt
git commit -m 'Added a fruit"
这是一个有效的提交。现在,创建一个糟糕的提交,代表你不想合并到项目中的内容:
echo "Rhubarb" >> fruit.txt
git add fruit.txt
git commit -m 'Added a vegetable that tastes like a fruit"
返回你的权威版本库,从你假想的开发者那里获取提交(使用 git fetch 获取):
$ cd ~/fruit.git
$ git remote add dev ~/fruit.fork
$ git fetch dev
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done...
$ git log –oneline dev/master
e858ab2 Added a vegetable that tastes like a fruit
0664292 Added a fruit
b56e0f8 First commit
你已经从假想的开发者那里获取了提交,但还没有将它们合并到你的版本库中。你想接受第二个提交,但不想接受第三个,所以要使用 cherry-pick:
git cherry-pick 0664292
现在,第二个提交就在你的版本库中:
$ cat fruit.txt
Kiwifruit
Strawberry
将更改推送到远程服务器,就大功告成了!
Cherry-pick 多个提交实战
从 dev 挑选数个 commits 进行合并:
git cherry-pick 85c5532 366a196 53ebe44 --no-commits
然后, 可能第一个合并会出现冲突, 手动解决冲突, 并git add 具体文件或 git rm.
继续 cherry-pick:
git cherry-pick --continue
第二个提交可能没有冲突, 直接合并.
第三个提交可能又有冲突, 手动解决冲突, 并git add 具体文件或 git rm.
继续 cherry-pick:
git cherry-pick --continue
最后再执行 git cherry-pick --continue, 会提示你没有在运行的任务.
此时, 可以提交:
git push origin main
总结
Cherry-pick 是一个功能强大的命令,如果没有正确理解可能发生的情况,使用它可能会带来麻烦。不过,当你搞砸并提交到错误的分支时,它可能会拯救你的生命(至少是你的日常工作)。
️参考文档
- What is Git cherry-picking? | Opensource.com
- How to merge only specific commits from a pull request with git cherry-pick | MattStauffer.com
- Git Cherry Pick - How to use the "cherry-pick" command in Git | Learn Version Control with Git
三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写.
Git Cherry-pick使用的更多相关文章
- git之rebase、merge和cherry pick的区别(面试常问)
git flow图例镇楼 merge 这个简单,初学者常用.比如主分支是Dev,最新版本是01.然后小明基于此,搞了个feature 分支A,业务:打酱油.然后在上面多次提交,完成功能迭代开发,如A1 ...
- git cherry命令来比较两个分支的不同
git cherry 命令使用 1. 两个参数的情况 git cherry -v origin/master asa 比较本地的asa分支和远程master的差别 git cherry -v mast ...
- 10 个迅速提升你 Git 水平的提示
1. Git自动补全 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情.为了解决这个问题,你可以启用Git的自动补全功能,完成这项工作仅需要几分钟. 为了得到这个脚本 ...
- 10 个迅速提升你 Git 水平的提示【转】
转自:https://www.oschina.net/translate/10-tips-git-next-level 最近我们推出了两个教程:熟悉Git的基本功能和让你在开发团队中熟练的使用Git ...
- 【转】10 个迅速提升你 Git 水平的提示
最近我们推出了两个教程:熟悉Git的基本功能和让你在开发团队中熟练的使用Git . 我们所讨论的命令足够一个开发者在Git使用方面游刃有余.在这篇文章中,我们试图探索怎样有效的管理你的时间和充分的使用 ...
- Git 提供篇
1. Git自动补全 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情.为了解决这个问题,你可以启用Git的自动补全功能,完成这项工作仅需要几分钟. 为了得到这个脚本 ...
- Git 经常使用命令合集
====== Git 经常使用命令合集 ====== === 1.Git 文档 === Git 中文文档观看地址:http://git.oschina.net/progit/ === ...
- Git版本控制原理和常用指令说明
平时在Android Studio开发Android项目,习惯了点击右键或图标直接拉新fetch,pull,commit和push.但是必要的时候还得在终端输入命令行.比如正在开发新版本v3.0,老板 ...
- Git速成学习第六课:Bug分支
Git速成学习笔记整理于廖雪峰老师的官网网站:https://www.liaoxuefeng.com/ 当你接到一个修复代码为101的任务的时候,很自然的你想创建一个分支issue-101来修复它,但 ...
- git gui 还原部分提交文件
有时候用git提交文件的时候会一起提交了多个文件,但是突然后悔了,想把其中一个文件撤销提交,其他文件不做修改.这个时候该怎么办呢? 我觉得有很多办法,比如可以先checkout到上次的提交,然后复制要 ...
随机推荐
- 超实用的Go语言基础教程,让你快速上手刷题!!
背景 工欲善其事,必先利其器.掌握Go的基础语法还不够,还需要勤加练习,修习"外功",才能达到出奇制胜的效果. 在大致了解Go语言的基本语法后,我就迫不得已地想使用这门语言.可是我 ...
- 2021-06-27:给定一个正数数组arr,代表若干人的体重。再给定一个正数limit,表示所有船共同拥有的载重量。每艘船最多坐两人,且不能超过载重,想让所有的人同时过河,并且用最好的分配方法让船尽
2021-06-27:给定一个正数数组arr,代表若干人的体重.再给定一个正数limit,表示所有船共同拥有的载重量.每艘船最多坐两人,且不能超过载重,想让所有的人同时过河,并且用最好的分配方法让船尽 ...
- 用好kafka,你不得不知的那些工具
前言 工欲善其事,必先利其器.本文主要分享一下消息中间件kafka安装部署的过程,以及我平时在工作中针对kafka用的一些客户端工具和监控工具. kafka部署架构 一个kafka集群由多个kafka ...
- 代码随想录算法训练营Day48 动态规划
代码随想录算法训练营 代码随想录算法训练营Day48 动态规划|198.打家劫舍 213.打家劫舍II 337.打家劫舍III 198.打家劫舍 题目链接:198.打家劫舍 你是一个专业的小偷,计划偷 ...
- 03. 选择器补充及CSS动画
1.了解frameset 2.iframe html5新特性 iframe 元素会创建包含另外一个文档的内联框架(即行内框架). 提示:您可以把需要的文本放置在 <iframe> 和 &l ...
- 2023最新IntellJ IDEA诺依SpringCloud开发部署文档(保姆级别)
目录 若依RuoYi v3.6.2部署文档 一.环境构建 二.模块描述 三.部署后端 1.下载到本地. 2.MySQL导入数据. 3.Nacos修改 (1)保证本地Nacos下载安装成功,修改本地Na ...
- Vue——表单控制、购物车案例、v-model进阶、与后端交互三种方式、箭头函数
表单控制 // 1 checkbox 单选 多选 // 2 radio 单选 <body> <div id="app"> <h1>checkbo ...
- C# 客户端程序 Visual Studio 远程调试方法
传统桌面客户端的远程调试相比UWP,ASP等项目来说,配置比较麻烦,因为它是非部署的应用程序,原理是复制编译的文件到远程计算机,通过网络来连接和VS的通信,本文主要讲述WPF,WinForm应用程序的 ...
- 【Python】sqlmodel: Python 数据库管理ORM 的终极形态?
ORM 大家都知道ORM(Object Relational Mapping)是一种将对象和关系数据库中的表进行映射的技术,它可以让开发者更加方便地操作数据库,而不用直接使用SQL语句. 直接使用SQ ...
- ChatGPT教我用200行代码写一个简版Vue框架 - OpenTiny
AI 是未来最好的老师 最近,我正在准备一份关于 Vue 基础的学习材料.期间我突发奇想:能否利用现在热门的 ChatGPT 帮我创建学习内容?其实 Vue 本身不难学,特别是基础用法,但是,如果你想 ...