先想想一个情况,现在我们有一个功能急需要发布到线上,但是这个功能相关的代码所在的测试分(test)支有很多不应该发布的代码,那么这个时候我们就需要将与这个代码相关的提交选择性的合并到master上并发布。如果你还不知道git cherry-pick命令的话,很有可能你会从master分支上检出一个新分支,然后在把相关的代码copy到新分支上然后再合并回master。当然这么做确实可以达到最终的目的,但是手动copy很容易遗漏某些东西,那么我们这篇文章就来讲解一下git cherry-pick命令。

准备

1.准备一个空的git仓库,并创建一个readme文件然后提交。

mkdir git-test
cd git-test
git init
touch README.md
git add README.md
git commit -m "第一次提交"

2.基于master创建一个新的分支dev

git checkout -b dev

3.修改两次README.md文件,并commit两次。执行git log后我们会看到如下内容:

$ git log
commit cc04beabf0678f54bf64635bd56160c78b0aa1e6 (HEAD -> dev)
Author: 代码无止境 <gancy.programmer@gmail.com>
Date:   Mon Jun 17 18:35:44 2019 +0800     第三次提交 commit 32259aa35d0702d2d05c648938798f9a5bd4b9e7
Author: 代码无止境 <gancy.programmer@gmail.com>
Date:   Mon Jun 17 18:35:23 2019 +0800     第二次提交 commit e7f478807d478a0c3e0af8659e0733a9d5b32c8b (master)
Author: 代码无止境 <gancy.programmer@gmail.com>
Date:   Mon Jun 17 18:34:09 2019 +0800     第一次提交

git cherry-pick

经过上面的步骤一个git cherry-pick的使用场景就已经被我们模拟出来了。假如说我们现在dev上的第二次提交就是我们现在急需要发布的功能,那么我们就需要使用git cherry-pick命令将这次提交合并到master分支上。

1.在dev分支上执行git log命令,找到目标commit的commitid.

2.切换到master分支

git checkout master

3.执行git cherry-pick命令

git cherry-pick 32259aa35d0702d2d05c648938798f9a5bd4b9e7

4.再次执行git log命令就可以看到目标提交已经被合并到master上了

$ git log
commit 845d18e1193e4ad4361c8065173ed9b96fcc5227 (HEAD -> master)
Author: 代码无止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:35:23 2019 +0800 第二次提交 commit e7f478807d478a0c3e0af8659e0733a9d5b32c8b
Author: 代码无止境 <gancy.programmer@gmail.com>
Date: Mon Jun 17 18:34:09 2019 +0800 第一次提交

git cherry-pick 相关参数

上面只是git cherry-pick命令的简单用法,其实这个命令还提供了不少的参数。

git cherry-pick [<options>] <commit-ish>...

常用options:
--quit 退出当前的chery-pick序列
--continue 继续当前的chery-pick序列
--abort 取消当前的chery-pick序列,恢复当前分支
-n, --no-commit 不自动提交
-e, --edit 编辑提交信息

如果我们执行git cherry-pick合并之后发生了冲突,这个时候Git会自动帮我们新建一个分支,如下所示:

MINGW64 ~/Desktop/p/write/笔记/git-test (master|CHERRY-PICKING)

如果我们想取消这次合并可以执行git cherry-pick --quit或者git cherry-pick --abort命令取消这次挑拣。

二者不同的地方在于前者会将当前分支中未冲突的内容状态变为modified,

而后者则会直接将当前分支的内容回退到挑拣之前的状态。当然如果我们也可以解决冲突之后执行如下命令继续合并:

git add *
git cherry-pick --continue

后面的-n和-e,就比较容易理解了,-n就是挑拣后不会自动提交,需要我们执行git commit命令进行提交,而-e则是可以改变挑拣的message信息。

Git使用小技巧之挑拣合并的更多相关文章

  1. 8 个 Git 的小技巧

    git 已经成为了我日常必备工具之一,我总结我几乎每天使用的8个有用(且简洁)的git技巧.   使用-p选择性添加 当你想提交内容时,你可以通过使用 git commit -am 来选择所有文件或使 ...

  2. Git使用小技巧之多个远程仓库

    想要获取更多文章可以访问我的博客 - 代码无止境. 这是一个普通的工作日,小代正在勤勤恳恳的写代码.这时陈BOSS走到小代身边,跟小代说:"我们的代码需要同时推送到Github和码云两个仓库 ...

  3. Git使用小技巧之免密登录

    想要获取更多文章可以访问我的博客 - 代码无止境. 小代同学在使用Git的过程中发现,每次向远程仓库推送代码的时候都需要输入账号密码.做为一个程序员,多多少少都会有偷懒的思维.那么如何才能避免每次都要 ...

  4. Android Studio|IntelliJ IDEA Git使用小技巧

    一 分支管理 1. 新建分支 在master的基础上创建新分支dev 2. 推送分支 将新建的分支dev推送到远程 3. 切换分支 4. 合并分支 当我们在dev分支完成代码修改并测试通过后 需要将d ...

  5. git使用小技巧

    1. 合并一个分支的某次提交到另一个分支上 例如 将dev的某次提交 asfdiwehfsalkdnva872383 合并到master # git checkout master # git che ...

  6. Git使用小技巧之回滚和撤销

    想要获取更多文章可以访问我的博客 - 代码无止境. 日常的开发,我们难免会创建错误的git提交记录,整个时候git给我们提供了两个命令来解决这个问题.一个命令是git reset,另一个是git re ...

  7. Git使用小技巧之Stash命令藏储零乱分支

     想要获取更多文章可以访问我的博客 - 代码无止境. 在开发的过程中可能会经常出现下面这种情况,我们正在开发某个功能,当前分支的内容比较乱,不太适合提交,而此时我们需要切换到其他分支上处理一些事情.这 ...

  8. git使用小技巧-忽略提交文件设置

    前言 我们可以把自己的代码放到github上,但是我们有的文件或者文件夹不想提交到github上,这时候用到一个忽略文件 操作方法 * 在项目根目录创建一个 .gitignore文件 * 打开.git ...

  9. Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具

    前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...

随机推荐

  1. [PHP7.0-PHP7.2]的新特性和新变更

    php7发布已经升级到7.2.里面发生了很多的变化.本文整理php7.0至php7.2的新特性和一些变化. 参考资料: http://php.net/manual/zh/migration70.new ...

  2. CentOS 7.3最小系统安装KVM

    一.准备工作 安装wget和vim yum install -y wget vim 修改yum源为阿里源 wget -O /etc/yum.repos.d/CentOS-Base.repo http: ...

  3. JS trim函数

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  4. 线性渐变、辐射渐变、角度渐变-QLinearGradient,QRadialGradient,QConicalGradient

    渐变,是指逐渐的,有规律性的变化,是一种规律性很强的现象.Qt提供了一个与渐变相关的QGradient类,目前支持三种渐变画刷,分别是线性渐变(QLinearGradient).辐射渐变(QRadia ...

  5. github中README.md文件写法解析,git指令速查表

    http://blog.csdn.net/u012234115/article/details/41778701 http://blog.csdn.net/u012234115/article/det ...

  6. 【C#】WixToolset快速入门教程

    原文:[C#]WixToolset快速入门教程 介绍 给windows系统做软件,常见的打包工具大家可能都听说过,如:大名鼎鼎的Installshield.Inno setup等.在遇见Wix之前In ...

  7. WPF使用WindowChrome实现自定义标题框功能

    代码: <Window x:Class="WpfDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx ...

  8. C#高性能大容量SOCKET并发(三):接收、发送

    原文:C#高性能大容量SOCKET并发(三):接收.发送 异步数据接收有可能收到的数据不是一个完整包,或者接收到的数据超过一个包的大小,因此我们需要把接收的数据进行缓存.异步发送我们也需要把每个发送的 ...

  9. PHP 文件操作的各种姿势

    使用 SPL 库 SPL 是 PHP 标准库,用于解决典型问题的一组接口与类的集合. 迭代器 FilesystemIterator 官方文档:http://php.net/manual/zh/clas ...

  10. 改善C#程序的建议6:在线程同步中使用信号量

    原文:改善C#程序的建议6:在线程同步中使用信号量 所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两 ...