一、单步悔棋
考虑这样一种情况,你在工作区添加了若干个文件,且修改了若干个文件。此时,你认为工作区的内容可以提交了,于是进行了提交操作,但是,刚提交上去,发现有个文件不应该被提交,那么需要进行单步悔棋。
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
分享到:
相关推荐
Git的`cherry-pick`命令是开发人员的利器,特别是在需要从一个分支选择特定的改动并应用到另一个分支时。这个命令允许你挑选出一个或多个commit,并将其合并到当前工作分支,而不必合并整个分支的历史记录。下面将...
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 Guide 英文无水印pdf pdf所有页面使用FoxitReader和PDF-XChangeViewer测试都可以打开 本资源转载自网络,如有侵权,请联系上传者或csdn...
# Git Cherry-Pick 简单使用指南 Git 是一个分布式版本控制系统,广泛应用于软件开发中,用于跟踪和管理代码更改。在 Git 的众多功能中,`cherry-pick` 是一个非常有用的命令,它允许我们将一个或多个提交从一个...
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 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
如果您的cherry-pick 命令在复制命令中指定的提交之一时失败(例如,发生冲突时),您可以使用以下命令稍后继续/退出/中止下一个目标提交。 git cherry-pick --continue git cherry-pick --quit git cherry-pick -...
"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 ...
《Visual C# Step By Step》是一本经典的C#编程教程,旨在帮助初学者逐步掌握C#语言和.NET Framework的核心概念与应用。这本书通过实例和逐步指导的方式,让读者能够深入理解C#编程的基础以及高级特性。 1. **C#...
因为我在学习Git的过程中,买过书,也在网上Google了一堆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 命令 - ...
包含将一个分支的多次提交merge到另一个分支,(基于TortoiseGit客户端图文)的文档说明。使用TortoiseGit客户端,使用git的cherry pick 操作将提交到trunk分支的代码自动merge代码到ep-new分支
3. 命令行增强:可能添加或改进了一些命令,如`git rebase`、`git cherry-pick`等,以提高开发者效率。 4. 问题修复:修复了之前版本中发现的bug,增强了系统的稳定性和可靠性。 5. 兼容性提升:可能增加了对新...
cherry-pick : 精心挑选,挑选一个我们需要的 commit 进行操作。它可以用于将在==其他分支==上的 commit 移植到==当前的分支==。
因为我在学习Git的过程中,买过书,也在网上Google了一堆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与其他...
Head First Git不仅仅介绍了Git的基本概念,还详细介绍了Git的高级技术,包括:远程仓库(remote repository)、git flow、git hook、stash、 Cherry-pick等。这些技术可以帮助开发者更好地管理代码,提高开发效率。...
5. 高级命令:Git提供了一系列高级命令,如`git rebase`用于整理提交历史,`git cherry-pick`用于选取特定提交应用到其他分支,以及`git bisect`用于快速定位bug。 在Git 2.18.0中,值得注意的新特性和改进包括: ...
3. **Cherry-pick**:`git cherry-pick`可以将某个特定的提交应用到其他分支,用于共享或复制功能。 4. **Submodule**:Git的子模块功能允许你在项目中嵌入其他Git仓库,便于管理依赖的项目。 以上就是关于Git-...