`
songkang666
  • 浏览: 103052 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Git step by step 14 之cherry pick

    博客分类:
  • GIT
 
阅读更多
一、单步悔棋

        考虑这样一种情况,你在工作区添加了若干个文件,且修改了若干个文件。此时,你认为工作区的内容可以提交了,于是进行了提交操作,但是,刚提交上去,发现有个文件不应该被提交,那么需要进行单步悔棋。
        Git权威指南上对单步悔棋的操作建议是使用git commit --amend,修补式提交,字面上解释是将此次的错误提交进行修补,但是使用后可以发现,commit的SHA-1值变化了,是一个新的commit对象。所以感觉它实际上是,先进行重置reset,再进行一次新的commit。
故 ①修改 + ②git commit --amend -m "xxx" = ① git reset HEAD^ + ②修改 + ③ git commit -m "xxx"。
       
初始图——图1:

该图中,依次进行了commit 1、2、3、4。

        对于单步悔棋,基本上可以用下面的图进行说明,图2:


解释一下,commit 3有了新的孩子提交commit 5,commit 4和commit 3断绝了关系离家出走了。是简单的git log看不到它的存在,git reflog可以看到它。该commit对象在.git/objects/目录下好好的待着呢。
Ps:请无视图2中的Ps,这个Ps不该加到此图中,还有,本博客中的的所有图,箭头我都画反了,呃。。。。

二、多步悔棋

        多步悔棋可以应用于这种场合:某开发人员领受某个特性开发的任务,于是在本地版本库进行了一系列开发、测试、修补、再测试的流程,最终在本地版本库中留下了多次提交。在将本地版本库改动推送到团队协同工作的核心版本库时,这个开发人员就想用多步悔棋的操作,将多个试验性的提交合并为一个完整的提交。
        例如:从初始图1 中,合并commit 2,commit 3和commit 4,然后提交或修改一下再提交,新的提交为commit 5。
        具体的可以先 git reset --soft HEAD~3,然后修改或直接提交,git commit -m "xxx",完成,而初始图1,变为图3:


        git reset 如此强大,简直万能了。

三、git cherry-pick
        但是,还是有它做不了的,git cherry-pick(拣选),意义在于从众多的提交中挑选出一个提交应用在当前的工作分支中。
        Git权威指南中,对git cherry-pick是这么举例的,有了A、B、C、D、E、F六个提交,其中D是个“坏蛋”,于是想将提交变为A、B、C、E、F,那么 git cherry-pick 将发挥它的作用,但是有没有这种情况的实际应用,我表示怀疑,啊哈。
        顺应它的例子,可以用我们前面的初始图1来说明一下,假设commit 3就是它说的“坏蛋”,那么可以有:
git checkout commit2  // 将HEAD指向commit2
git cherry-pick commit4 // 将commit 4拣选出来,接到commit 2之后
git cherry-pick commit5 // 再将commit 5拣选出来,接到commit 4之后

        实际上在进行 git cherry-pick commit4 和 git cherry-pick commit5 这样的操作时,会产生新的commit对象,你可以将这个新的commit对象看作是commit 4对应的commit对象的一个复制体(尤里复制出来的)。       
Ps:这里再对上一篇《Git step by step 13之对象》作个补充,该篇中提到:“Git在处理提交时,会把每次提交的文件全部内容(snapshot)都记录下来。 例如,file在修改之后,再进行提交时,会新建一个完整地对应于它的blob对象,而不是覆盖掉之前提交时所产生的,也不是只对修改的部分(例如:添加了某些行)建立blob对象。 ”如果对file进行修改,那么Git会认为目录的内容也发生了变化,因此会新建tree对象,进一步的,提交时,commit对象也是新建的。
        在执行完上面的命令之后,会有图4:


四、git rebase
        git rebase是对提交执行变基操作,即可以实现将指定范围的提交“嫁接”到另外一个提交之上。其实它就是对git cherry-pick的一个扩展,git cherry-pick一次只能拣选一个commit,而git rebase一次可以拣选出连续的若干个commit。
例如前面的
git checkout commit2  // 将HEAD指向commit2
git cherry-pick commit4 // 将commit 4拣选出来,接到commit 2之后
git cherry-pick commit5 // 再将commit 5拣选出来,接到commit 4之后

用git rebase就这么执行:
git checkout commit2
git rebase --onto commit2 commit3^ commit5 // 注意commit3后面还有个“^”,commit3^也可以用commit2代替,即git rebase --onto commit2 commit2 commit5。

当然git rebase的用处不止于此,后面会对它再建专题。more:rebase
  • 大小: 5.3 KB
  • 大小: 10.4 KB
  • 大小: 10.5 KB
  • 大小: 11.9 KB
分享到:
评论
2 楼 songkang666 2013-04-26  
你说的图啊?
呃。。。
nonocast 写道
good job!
进步很大

1 楼 nonocast 2013-04-26  
good job!
进步很大

相关推荐

    Git Learn Version Control with Git A step-by-step Ultimate beginners Guide epub

    Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    Git Learn Version Control with Git A step-by-step Ultimate beginners 无水印pdf

    Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn...

    git 一个可以提高开发效率的命令:cherry-pick详解

    主要介绍了git 一个可以提高开发效率的命令:cherry-pick,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    Learn Version Control With Git A step-by-step course for the complete beginner

    Learn Version Control With Git A step-by-step course for the complete beginner(中文)。亚马逊接近满分书籍,中文版。图文并茂。学习Git的好资料。 从官网一页一页的复制过来的,花了不少时间。

    Git Learn Version Control with Git A step-by-step Ultimate beginners Guide azw3

    Git Learn Version Control with Git A step-by-step Ultimate beginners Guide 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    learn-git-cherry-pick:一个展示如何使用基本的cherry-pick 命令的repo

    如果您的cherry-pick 命令在复制命令中指定的提交之一时失败(例如,发生冲突时),您可以使用以下命令稍后继续/退出/中止下一个目标提交。 git cherry-pick --continue git cherry-pick --quit git cherry-pick -...

    Learn Version Control with Git: A step-by-step course for the complete

    "Learn Version Control with Git" is a beginner-friendly step-by-step course. The book doesn't require a deep technical background. Instead, it's aimed at beginners of version control and/or ...

    Git教程by廖雪峰.pdf

    因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得一笔带过,或者,只支离破碎地介绍Git的某几个命令,还有直接从Git手册粘贴帮助...

    git 视频教程

    git视频教程.8.1.Git 命令 - git cherry-pick.mp4 git视频教程.8.2.Git 命令 - git rebase.mp4 git视频教程.8.3.Git 命令 - git rebase.mp4 git视频教程.8.4.Git 命令 - git revert.mp4 git视频教程.9.Git 命令 - ...

    ZhongJinHacker#notes#git_cherry-pick总结1

    cherry-pick : 精心挑选,挑选一个我们需要的 commit 进行操作。它可以用于将在==其他分支==上的 commit 移植到==当前的分支==。

    Git学习笔记.pdf

    Git中关于rebase, merge, cherry-pick, rm等的深入讲解

    Git教程By廖雪峰

    因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得一笔带过,或者,只支离破碎地介绍Git的某几个命令,还有直接从Git手册粘贴帮助...

    Git详解教程

    Git详解之一 Git起步.doc Git详解之二 Git基础.doc Git详解之三 Git分支.doc Git详解之四 服务器上的Git.doc Git详解之五 分布式Git.doc Git详解之六 Git工具.doc Git详解之七 自定义Git.doc Git详解之八 Git与其他...

    git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记

    git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git...

    Git 魔法 by Ben Lynn

    这是学习Git的好办法:新手 不妨忽略 Git的内部机理,只当小把戏玩,借助Git其奇妙的能力,逗逗朋友,气气敌人。 为了不陷入细节,我们对特定功能提供大面上的讲解。在反复应用之后,慢慢地你会理 解每个 小技巧...

    Git-1.9.0 git

    git

    git工具git工具

    git工具git工具git工具git工具git工具git工具git工具git工具git工具git工具

    Git教程By廖雪峰.pdf

    因为我在学习Git的过程中,买过书,也在网上Google了一堆Git相关的文章和教程,但令人失望的是,这些教程不是难得令人发指,就是简单得一笔带过,或者,只支离破碎地介绍Git的某几个命令,还有直接从Git手册粘贴帮助...

    Git-2.21.0-64-bit.zip

    * When one step in multi step cherry-pick or revert is reset or committed, the command line prompt script failed to notice the current status, which has been improved. * Many GIT_TEST_* ...

    git 可视化工具

    git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git 可视化工具git ...

Global site tag (gtag.js) - Google Analytics