`
songkang666
  • 浏览: 105504 次
  • 性别: 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 一个可以提高开发效率的命令:cherry-pick详解

    Git的`cherry-pick`命令是开发人员的利器,特别是在需要从一个分支选择特定的改动并应用到另一个分支时。这个命令允许你挑选出一个或多个commit,并将其合并到当前工作分支,而不必合并整个分支的历史记录。下面将...

    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 简单使用md,学习代码

    # Git Cherry-Pick 简单使用指南 Git 是一个分布式版本控制系统,广泛应用于软件开发中,用于跟踪和管理代码更改。在 Git 的众多功能中,`cherry-pick` 是一个非常有用的命令,它允许我们将一个或多个提交从一个...

    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 命令 - ...

    cherry pick操作git 将一个分支的多次提交merge到另一个分支(基于TortoiseGit客户端图文)

    包含将一个分支的多次提交merge到另一个分支,(基于TortoiseGit客户端图文)的文档说明。使用TortoiseGit客户端,使用git的cherry pick 操作将提交到trunk分支的代码自动merge代码到ep-new分支

    Git for Windows 2017 最新版,Git-2.15.0

    3. 命令行增强:可能添加或改进了一些命令,如`git rebase`、`git cherry-pick`等,以提高开发者效率。 4. 问题修复:修复了之前版本中发现的bug,增强了系统的稳定性和可靠性。 5. 兼容性提升:可能增加了对新...

    ZhongJinHacker#notes#git_cherry-pick总结1

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

    Git详解教程

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

    head first git

    Head First Git不仅仅介绍了Git的基本概念,还详细介绍了Git的高级技术,包括:远程仓库(remote repository)、git flow、git hook、stash、 Cherry-pick等。这些技术可以帮助开发者更好地管理代码,提高开发效率。...

    git-2.18.0-3264合集

    5. 高级命令:Git提供了一系列高级命令,如`git rebase`用于整理提交历史,`git cherry-pick`用于选取特定提交应用到其他分支,以及`git bisect`用于快速定位bug。 在Git 2.18.0中,值得注意的新特性和改进包括: ...

    git命令git命令git命令git命令

    12. 选择性合并特定commit:`git cherry-pick [commit]` 13. 删除分支:`git branch -d [branch-name]` 14. 删除远程分支:`git push origin --delete [branch-name]` 或 `git branch -dr [remote/branch]` ### ...

    Git-2.28.0-64-bit git安装包windos64位官方下载

    3. **Cherry-pick**:`git cherry-pick`可以将某个特定的提交应用到其他分支,用于共享或复制功能。 4. **Submodule**:Git的子模块功能允许你在项目中嵌入其他Git仓库,便于管理依赖的项目。 以上就是关于Git-...

    Git教程By廖雪峰 高清完整 完整目录PDF版.pdf

    Git是⺫⽬目前世界上最先进的分布式版本控制系统(没有之⼀一)。 Git有什么特点?简单来说就是:⾼高端⼤大⽓气上档次! 那什么是版本控制系统? 如果你⽤用Microsoft Word写过⻓长篇⼤大论,那你⼀一定有这样的...

    git压缩包下载git下载

    Git是世界上最流行的分布式版本控制系统,它允许开发人员协作开发代码并跟踪每一次更改。"git压缩包下载git下载"这个标题和描述可能指的是提供Git的安装程序压缩包的下载服务。在本篇中,我们将深入探讨Git的核心...

Global site tag (gtag.js) - Google Analytics