git cherry pick

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 git cherry pick,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

概述

对于多分支的代码库,将提交记录从一个分支转移到另一个分支是常见需求。这时分两种情况:

  1. 需要另一个分支的所有提交记录,使用合并(git merge)
  2. 只需要部分提交记录,可使用cherry pick。

命令

git cherry pick是一个很强大的命令,支持从某次、多次提交、多次连续提交、分支及其他远程仓库中进行代码的应用操作。

  1. 某次提交
    $ git cherry-pick <commitHash>
    将指定的提交应用于当前分支。这会在当前分支产生一个新的提交,当然它们的哈希值会不一样。
  2. 某个分支
    $ git cherry-pick <branch>
    将指定分支的最后一次提交,应用到当前分支。
  3. 多次提交
    $ git cherry-pick <HashA> <HashB>
    将A和B两个提交应用到当前分支。这会在当前分支生成两个对应的新提交。
  4. 连续多次提交
    $ git cherry-pick A..B
    将从A(不包括A提交记录)到B的所有提交应用到当前分支,A提交必须要早于B提交。
    $ git cherry-pick A^..B
    将从A(包括A提交记录)到B的所有提交应用到当前分支,A提交必须要早于B提交。
  5. 其他远程仓库
    Cherry pick 也支持转移另一个代码库的提交,方法是先将该库加为远程仓库。
    $ git remote add target git://gitUrl
    将远程代码抓取到本地。
    $ git fetch target
    检查一下要从远程仓库转移的提交,获取它的哈希值。
    $ git log target/master
    最后,使用git cherry-pick命令转移提交。
    $ git cherry-pick <commitHash>

选项

  1. -e--edit
    打开外部编辑器,编辑提交信息。
  2. -n--no-commit
    只更新工作区和暂存区,不产生新的提交。
  3. -x
    在提交信息的末尾追加一行(cherry picked from commit …),方便追溯提交记录。
  4. -s--signoff
    在提交信息的末尾追加一行操作者的签名。
  5. -m parent-number--mainline parent-number
    如果原始提交是一个合并节点,来自于两个分支的合并,那么 Cherry pick 默认将失败,因为它不知道应该采用哪个分支的代码变动。
    -m配置项告诉 Git,应该采用哪个分支的变动。它的参数parent-number是一个从1开始的整数,代表原始提交的父分支编号。

$ git cherry-pick -m 1 <commitHash>
上面命令表示,Cherry pick 采用提交commitHash来自编号1的父分支的变动。
一般来说,1号父分支是接受变动的分支(the branch being merged into),2号父分支是作为变动来源的分支(the branch being merged from)。

代码冲突

如果操作过程中发生代码冲突,cherry-pick会被中断,让用户决定如何继续操作。

  1. --continue
    解决代码冲突后,将修改的文件重新加入暂存区(git add .),让cherry pick过程继续执行:
    $ git cherry-pick --continue
  2. --abort
    发生代码冲突后,放弃合并,回到操作前的样子。
  3. --quit
    发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。

常见问题

1.The previous cherry-pick is now empty, possibly due to conflict resolution.
原因:在cherry-pick时出现冲突,解决冲突后本地分支中内容和cherry-pick之前相比没有改变,因此当在以后的步骤中继续git cherry-pick或执行其他命令时,由于此时还处于上次cherry-pick,都会提示该信息,表示可能是由于解决冲突造成上一次cherry-pick内容是空的。
解决方案:

  1. 执行git cherry-pick --abort取消上次操作
  2. 执行git commit --allow-empty,表示允许空提交。

2.fatal: You are in the middle of a cherry-pick – cannot amend.
原因:在cherry-pick时出现冲突,没有解决冲突就执行git commit --amend命令,从而会提示该信息。
解决方案:在git commit --amend之前解决冲突,并完成这次cherry-pick:

$ git add .
$ git cherry-pick --continue

参考

https://www.git-scm.com/docs/git-cherry-pick
https://zhuanlan.zhihu.com/p/90816644

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142114.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!