先想想一个情况,现在我们有一个功能急需要发布到线上,但是这个功能相关的代码所在的测试分(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. SICP 1.11-1.13

    1.11 递归版本 (define (f n) (cond ((< n ) n) ()) (* (f (- n )) ) (* (f (- n )) ))))) 迭代版本 (define (f ...

  2. RestSharp 封状实例

    1 public class Rest<T> { private static Logger logger = LogManager.GetCurrentClassLogger(); pr ...

  3. discuz电脑访问手机版域名怎么跳转到电脑版本

    用discuz论坛访问手机版本的域名不会自动跳转到电脑版本,而是会跳转到域名+misc.php?mod=mobile体验很不好.现提供修改方法:打开论坛根目录找到文件./source/class/di ...

  4. Linux学习之“exit函数”

    先看下"_exit"和"exit": exit被调用时,将冲刷所有的标准I/O流,关闭所有打开的文件描述符.在传统实现中,同时也将关闭标准I/O流.即表示标准输 ...

  5. Win10《芒果TV》商店版更新v3.2.1:优化手机版卡顿,修复推送故障

    此版本是小版本更新,主要是修复上一版本发布后暴露的部分体验问题,以免进一步扩大影响,小幅修复后更新上线. 芒果TV UWP V3.2.1更新内容清单: 1.优化和修复列表预加载机制的本地保存丢失导致的 ...

  6. 零元学Expression Blend 4 - Chapter 45 ListBox里的物件不能换行吗?

    原文:零元学Expression Blend 4 - Chapter 45 ListBox里的物件不能换行吗? ListBox里的排列不是垂直就是水平,觉得这样的排列很枯燥乏味吗? 想要它变聪明吗? ...

  7. ${FUNCNAME[@]}和$LINENO使用

    $LINENO代表shell脚本的当前行号 [root@mysql-B ~]# cat test1.sh #!/bin/bash trap 'echo “before execute line:$LI ...

  8. python 动态调用模块&类&方法

    转载自:http://www.cnblogs.com/bluefrog/archive/2012/05/11/2496439.html 一直想知道python里有没有类似php中的 $classnam ...

  9. C#图片旋转

    这里以Bitmap为例说明问题. 可以看到,旋转方法需要传入一个参数,而这个参数是一个枚举类型,RotateFlipType. 系统提供了两大类型的旋转, 1.旋转后不翻转. 2.旋转后接着翻转.翻转 ...

  10. 开源代码分析工具 good

    checkstyle - static code analysis tool for JavaPMD - A source code analyzer