Git进阶系列 | 7. Git中的Cherry-pick提交

Git是最流行的代码版本控制系统,这一系列文章介绍了一些Git的高阶使用方式,从而帮助我们可以更好的利用Git的能力。本系列一共8篇文章,这是第7篇。原文:Cherry-Picking Commits in Git[1]

本系列的第5部分中,讨论了rebase和merge。虽然git mergegit rebase之间有一些不同,但这两个命令的目标是相同的: 将一个分支的更改集成到另一个分支。

今天我们来看看git cherry-pick,理解它是怎样允许我们将任何分支中被选中的、单独的提交集成到当前的HEAD分支中。这与git mergegit rebase有很大的区别,两者都只能集成来自指定分支的所有新提交。

那么为什么要从一个分支中只选择一个提交集成到另一个分支呢?当然会有不同的原因,但其中一个特别的原因是撤消变更。假设我们不小心在错误的分支上做了一个提交,使用cherry-pick处理就不会有什么大问题。我们可以切换到正确的分支,然后cherry-pick对应的提交。

Git进阶系列:

  1. 创建完美的提交
  2. Git中的分支策略
  3. 基于Pull Request实现更好的协作
  4. 合并冲突
  5. Rebase vs Merge
  6. 交互式Rebase
    7. Git中的Cherry-pick提交(本文)
  7. 用Reflog恢复丢失的提交

在看实例之前,先警告一下: 不要对cherry-pick太过兴奋。你的主要目标应该是在分支级别工作,git mergegit rebase都是为此构建的。cherry pick只是为了特殊场合,而不是为了代替merge和rebase。

将提交移到另一个分支

我们通过一个真实的场景来解释什么时候cherry pick才是正确的。假设我们向master分支提交了一些本打算用于feature/newsletter的内容。现在怎么办?需要打电话给团队成员或老板来解释这个“错误”吗?

下面的截图显示了这个问题,以及在master分支上意外提交的26bf1b48

或者,如果在终端输入git log,可以在命令行看到这一情况:

$ git log
commit 26bf1b4808ba9783e4fabb19ec81e7a4c8160194 (HEAD -> master)
Author: Tobias Günther
Date:   Fri Oct 5 09:58:03 2018 +0200

    Newsletter signup page

可以看到,ID为26bf1b48的提交最终合并到了master中,但其实应该提交到分支feature/newsletter中。我们需要选择特定的提交并将其移到正确的分支。首先切换分支,然后选择提交:

$ git checkout feature/newsletter
Switched to branch 'feature/newsletter'
$ git status
On branch feature/newsletter
nothing to commit, working tree clean
$ git cherry-pick 26bf1b48
[feature/newsletter 7fb55d0] Newsletter signup page
 Author: Tobias Günther <tg@fournova.com>
 Date: Fri Oct 5 09:58:03 2018 +0200
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 signup.html

再次运行git log,可以在feature/newsletter分支上看到新的提交:

$ git log
commit 7fb55d06a8e70fdce46921a8a3d3a9de7f7fb8d7 (HEAD -> feature/newsletter)
Author: Tobias Günther <tg@fournova.com>
Date:   Fri Oct 5 09:58:03 2018 +0200

    Newsletter signup page

这背后发生了什么?Git在feature/newsletter分支上创建了一个具有相同更改的提交副本以及相同的提交信息。然而,这是一个有着新ID的全新提交。那么最初的提交呢?

清理其他分支

如果检查master分支,仍然可以看到“错误的”提交。这意味着cherry pick不会从原来的分支“移动”被选中的提交,而只是创建一个副本,不会影响原始文件。

现在,为了清理和撤销提交,可以使用git reset

$ git checkout master
Switched to branch 'master'
$ git reset --hard HEAD~1
HEAD is now at 776f8ca Change about title and delete error page

就像什么都没发生过一样。

如果使用像Tower这样的GUI应用,整个过程是这样的:

用于特殊情况的工具,而不是日常的集成

只要可以使用传统的merge或rebase,就应该这样做。Cherry pick应该只在git mergegit rebase没用的情况下才用,比方说想要从一个分支把某个提交移到另一个。记住,git cherry-pick创建了“重复”的提交,应该在之后进行清理。

如果想更深入了解高级Git工具,可以免费查看“Advanced Git Kit[3]”: 这是关于分支策略、交互式Rebase、Reflog、子模块等主题的短视频集合。

References:
[1] Cherry-Picking Commits in Git: https://css-tricks.com/cherry-picking-commits-in-git/

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容