12.2 多步悔棋
Git能够提供悔棋的奥秘在于Git的重置命令。实际上上面介绍的单步悔棋也可以用重置命令来实现,只不过Git提供了一个更好用更简洁的修补提交命令而已。多步悔棋顾名思义就是可以取消最新连续的多次提交。多次悔棋并非是所有分布式版本控制系统都具有的功能,像Mercurial/Hg只能对最新提交悔棋一次(除非使用MQ插件)。Git因为有了强大的重置命令,可以任意悔棋多次。
多步悔棋会在什么场合用到呢?软件开发中针对某个特性功能的开发就是一例。某个开发工程师领受某个特性开发的任务,于是在本地版本库进行了一系列开发、测试、修补、再测试的流程,最终特性功能开发完毕后可能在版本库中留下了多次提交。在将本地版本库改动推送(PUSH)到团队协同工作的核心版本库时,这个开发人员就想用多步悔棋的操作,将多个试验性的提交合并为一个完整的提交。
以DEMO版本库为例,看看版本库最近的三次提交。
$git log—stat—pretty=oneline-3 2b452066ef6e92bceb999cf94fcce24afb652259 commit with—amend test. README|1+ 1 files changed,1 insertions(+),0 deletions(-) 613486c17842d139871e0f1b0e9191d2b6177c9f偷懒了,直接用-a参数直接提交。 src/hello.h|1+ 1 files changed,1 insertions(+),0 deletions(-) 48456abfaeab706a44880eabcd63ea14317c0be9 add hello.h src/hello.h|1+ 1 files changed,1 insertions(+),0 deletions(-)
想要将最近的两个提交压缩为一个,并把提交说明改为"modify hello.h",可以使用如下方法进行操作。
(1)使用—soft参数调用重置命令,回到最近两次提交之前。
$git reset—soft HEAD^^
(2)查看版本状态和最新日志。
$git status #On branch master #Changes to be committed: #(use "git reset HEAD<file>…"to unstage) # #modified:README #modified:src/hello.h # $git log-1 commit 48456abfaeab706a44880eabcd63ea14317c0be9 Author:Jiang Xin<jiangxin@ossxp.com> Date:Tue Dec 7 19:39:10 2010+0800 add hello.h
(3)执行提交操作,即完成最新两个提交压缩为一个提交的操作。
$git commit-m "modify hello.h" [master b6f0b0a]modify hello.h 2 files changed,2 insertions(+),0 deletions(-)
(4)看看提交日志,“多步悔棋”操作成功。
$git log—stat—pretty=oneline-2 b6f0b0a5237bc85de1863dbd1c05820f8736c76f modify hello.h README|1+ src/hello.h|1+ 2 files changed,2 insertions(+),0 deletions(-) 48456abfaeab706a44880eabcd63ea14317c0be9 add hello.h src/hello.h|1+ 1 files changed,1 insertions(+),0 deletions(-)
