git cherry-pick合并某个commit

git cherry-pick合并某个commit

1、使用方法及其作用

  git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作(操作的对象是commit)。例如,假设我们有个稳定版本的分支,叫v2.0,另外还有个开发版本的分支v3.0,我们不能直接把两个分支合并,这样会导致稳定版本混乱,但是又想增加一个v3.0中的功能到v2.0中,这里就可以使用cherry-pick了。

  就是对已经存在的commit 进行 再次提交;

使用方法如下:

git cherry-pick <commit id>

查询commit id 的查询可以使用git log查询(查询版本的历史),最简单的语法如下:

git log 

详细的git log 语法如下:

git log [<options>] [<since>..<until>] [[--] <path>...]

主要参数选项如下:

-p:按补丁显示每个更新间的差异

--stat:显示每次更新的修改文件的统计信息

--shortstat:只显示--stat中最后的行数添加修改删除统计

--name-only:尽在已修改的提交信息后显示文件清单

--name-status:显示新增、修改和删除的文件清单

--abbrev-commit:仅显示SHA-1的前几个字符,而非所有的40个字符

--relative-date:使用较短的相对时间显示(例如:"two weeks ago")

--graph:显示ASCII图形表示的分支合并历史

--pretty:使用其他格式显示历史提交信息

结果大概如下:

commit 0771a0c107dbf4c96806d22bbc6ef4c58dfe7075
Author: zhengcanrui <[email protected]>
Date:   Mon Aug 8 14:41:54 2016 +0800

    [modify] [what] commit的备注信息 

  其中0771a0c107dbf4c96806d22bbc6ef4c58dfe7075就是我们的commit id

  注意:当执行完 cherry-pick 以后,将会 生成一个新的提交;这个新的提交的哈希值和原来的不同,但标识名 一样;(commit id会变)

2、实践

  首先切换到你要添加commit的分支,如:你要将A分支上面的commit添加到B分支上面,我们可以要先切换到B分支上面。(注意:cherry-pick是一个本地的操作,假如你pull代码之后有人在A分支上有了新的commit,需要你先pull代码在进行cherry-pick,原因及其错误提示请见最后)。

git checkout B

  将0771a0c107dbf4c96806d22bbc6ef4c58dfe7075这个commit(提交)合并到B分支上面。正常情况下,可以给出全部的commit id,也可以只给出前面的一段,只要你提交中没有这一段重复的就好,剩下的部分git会帮你填充。

git cherry-pick 0771a0c107dbf4c  #将上面的commit id为0771a0c107dbf4c96806d22bbc6ef4c58dfe7075的提交添加到B分支上面

1.成功的情况

  顺利的话,出现下面的情况证明你已经成功了

Finished one cherry-pick.
# On branch B
# Your branch is ahead of ‘origin/B‘ by 1 commits. 

2.有冲突的情况

  下面是有文件冲突,和15a2b6c61927e5aed6718de89ad9dafba939a90b这个提交冲突

Automatic cherry-pick failed.  After resolving the conflicts,
mark the corrected paths with ‘git add <paths>‘ or ‘git rm <paths>‘
and commit the result with: 

        git commit -c 15a2b6c61927e5aed6718de89ad9dafba939a90b

  解决的冲突的方法也和普通的一样,手工检查。

1)查看冲突的文件

  使用git status

both modified:      app/models/user.rb

2)打开上面的那个文件,解决冲突。 执行add命令、执行commit命令,最后在提交即可了

3、遇到的一些错误

  使用下面cherry-pick命令执行某个commit (编号为:77c6905dcf7f946cff594a69a33d12e22bedfae4)

git cherry-pick 77c6905dcf7f946cff594a69a33d12e22bedfae4

  出现了如下的错误:

fatal: bad object 77c6905dcf7f946cff594a69a33d12e22bedfae4

场景及出现错误的原因:

我的情况是在B分支的同步A分支的一个commit,出现了如标题的错误。我是直接在web上看到A分支新提交的这个commit,然后我直接在本地的B分支中进行git cherry-pick xxx。就出现了这个问题。经过尝试问题是出在了我没有切到B分支pull一下。总结过来就是git cherry-pick是本地特性,本地要有这个commit才可以被git cherry-pick。

时间: 2024-10-17 14:16:04

git cherry-pick合并某个commit的相关文章

git分支合并、撤销;git修改已push的commit信息; git 撤销操作;

git分支合并 1.分支代码提交 2.git branch 查询本地分支 3.git checkout 分支名1 切换分支到需要合并的分支上 4.git merge 分支名2  //选择要合并到 分支名1 的分支名2 eg: 如果develop_screen分支合并到develop分支上,这个时候切换到develop分支上, git merge develop_screen 5.合并之后可能会有冲突,可用git status 查看冲突代码 <<<<<<<  ===

git分支的合并

http://gitbook.liuhui998.com/3_3.html http://gitbook.liuhui998.com/5_3.html 一.如何分支的合并 在git中,可以使用git merge 和git rebase两个命令来进行分支的合并. git merge 和git rebase在大体上都差不多,下文主要以git merge来例来讲解分支的合并流程. 如果你想了解分支合并的更多内容,请阅读<git merge简介>,<git rebase简介(基本篇)>和&

git两种合并方法 比较merge和rebase

18:01 2015/11/18git两种合并方法 比较merge和rebase其实很简单,就是合并后每个commit提交的id记录的顺序而已注意:重要的是如果公司用了grrit,grrit不允许用merge,所以好像都是用rebase却别讲解,比如:在服务器上的develop分支有多人在开发,你们同时clone或pull下来最新代码,但是开发进度不一样,你在开发一个任务的时候其他人提交了编号为1,2的commit和push,你现在开发完了也要提交,你的提交编号是3,4(注意:编号不代表顺序现实

DICOM:开源DICOM书籍之“git版本库合并”

背景: 之前翻译的DICOM3.0标准是在本地创建的git仓库,并非在github上创建,此时别人是无法访问的,当初的目的是想待标准翻译初步完成后再提交到github上. 然而由于本地的翻译工作采用MarkDownPad进行编辑,文档中的图片需要有一个公网URL才能在文档中显示(注:马克飞象工具是可以直接将剪切板中的图像插入到MarkDown文档致中的,目前马克飞象已经出了Windows和IOS的客户端,下载),因此就在Github上创建了DICOM-Chinese的仓库,并在其中创建了Figu

随心所欲生成git仓库随意一段commit的专用patch应用小实践

 随心所欲生成git仓库随意一段commit的专用patch应用小实践 我们在开发中.时不时的可能要去做一个patch给你的下线,或者你的合作者.在git管理中,我们知道有git format-patch命令,那怎么使用呢? 笔者以下就以实际样例来记录一下这个过程: /*****************************************************************************************************/声明:本博内容均由http

eclipse git 主干代码合并到分支

https://blog.csdn.net/wwd0501/article/details/80676807 eclipse git 主干代码合并到分支: 1.项目切换至分支: 2.选中项目右键-->team-->merge-->orgin/master(Remote Tracking) 3.Merge options选择Squah(merge changes into working directory,......) Fast forward options选择默认的if a fas

git rebase -i 合并commit

每次可能修改一个小的bug就会有一个提交,或者写了一小段代码就提交了一次. 这样经常会有多个commit,对此我们用git rebase -i HEAD~n来合并多个commit为一个commit. 如下图所示: 先用git status 查看下有多少个commit,下图中提示 Your branch is ahead of 'origin/master' by 2 commits. 很明显是2个commits待push. git log 里的内容请忽略掉. 现在用git rebase -i H

[转] git merge 将多个commit合并为一条之--squash 选项

[FROM] https://blog.csdn.net/themagickeyjianan/article/details/80333645 1.一般的做法(直接git merge) Git相对于CVS和SVN的一大好处就是merge非常方便,只要指出branch的名字就好了,如: $ git merge another $ git checkout another # modify, commit, modify, commit ... $ git checkout master $ git

git 删除错误提交的commit

转自:http://www.douban.com/note/189603387/ 正好遇到进阶问题.试了一下,是我要的,直接把服务器主版本还原了.不过这样也挺危险的,自己用用还可以. 方法: git reset --hard <commit_id> git push origin HEAD --force 其他: 根据–soft –mixed –hard,会对working tree和index和HEAD进行重置:    git reset –mixed:此为默认方式,不带任何参数的git r