首页 > 编程笔记

git rebase -i命令:压缩历史

在合并特性分支之前,如果发现已提交的内容中有些许拼写错误等,不妨提交一个修改,然后将这个修改包含到前一个提交之中,压缩成一个历史记录。这是个会经常用到的技巧,让我们来实际操作体会一下。

创建feature-C分支

首先,新建一个 feature-C 特性分支。
$ git checkout -b feature-C
Switched to a new branch 'feature-C'
作为 feature-C 的功能实现,我们在 README.md 文件中添加一行文字,并且故意留下拼写错误,以便之后修正。
# Git教程
- feature-A
- fix-B
- faeture-C
提交这部分内容。这个小小的变更就没必要先执行 git add 命令再执行 git commit 命令了,我们用 git commit -am 命令来一次完成这两步操作。
$ git commit -am "Add feature-C"
[feature-C 7a34294] Add feature-C
1 file changed, 1 insertion(+)

修正拼写错误

现在来修正刚才预留的拼写错误。请各位自行修正 README.md 文件的内容,修正后的差别如下所示。
$ git diff
diff ——git a/README.md b/README.md
index ad19aba..af647fd 100644
—— a/README.md
+++ b/README.md
@@ -2,4 +2,4 @@
- feature-A
- fix-B
- - faeture-C
+ - feature-C
然后进行提交。
$ git commit -am "Fix typo"
[feature-C 6fba227] Fix typo
1 file changed, 1 insertion(+), 1 deletion(-)
错字漏字等失误称作 typo,所以我们将提交信息记为 " Fix typo"。

实际上,我们不希望在历史记录中看到这类提交,因为健全的历史记录并不需要它们。如果能在最初提交之前就发现并修正这些错误,也就不会出现这类提交了。

更改历史

因此,我们来更改历史。将 " Fix typo"修正的内容与之前一次的提交合并,在历史记录中合并为一次完美的提交。为此,我们要用到 git rebase 命令。
$ git rebase -i HEAD~2
用上述方式执行 git rebase 命令,可以选定当前分支中包含 HEAD(最新提交)在内的两个最新历史记录为对象,并在编辑器中打开。
pick 7a34294 Add feature-C
pick 6fba227 Fix typo
# Rebase 2e7db6f..6fba227 onto 2e7db6f
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out
我们将 6fba227 的 Fix typo 的历史记录压缩到 7a34294 的 Add feature-C 里。按照如下所示,将 6fba227 左侧的 pick 部分删除,改写为 fixup。
pick 7a34294 Add feature-C
fixup 6fba227 Fix typo
保存编辑器里的内容,关闭编辑器。
[detached HEAD 51440c5] Add feature-C
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/feature-C.
系统显示 rebase 成功。也就是以下面这两个提交作为对象,将 "Fix typo"的内容合并到了上一个提交 "Add feature-C"中,改写成了一个新的提交。
·7a34294 Add feature-C
·6fba227 Fix typo
现在再查看提交日志时会发现 Add feature-C 的哈希值已经不是 7a34294 了,这证明提交已经被更改。
$ git log ——graph
* commit 51440c55b23fa7fa50aedf20aa43c54138171137
| Author:hirocaster <hohtsuka@gmail.com>
| Date: Sun May 5 17:07:36 2013 +0900
|
|   Add feature-C
|
*  commit 2e7db6fb0b576e9946965ea680e4834ee889c9d8
|\ Merge:83b0b94 4096d9e
| | Author:hirocaster <hohtsuka@gmail.com>
| | Date: Sun May 5 16:58:27 2013 +0900
| |
| |   Merge branch 'fix-B'
| |
| * commit 4096d9e856995a1aafa982aabb52bfc0da656b74
| | Author:hirocaster <hohtsuka@gmail.com>
| | Date: Sun May 5 16:50:31 2013 +0900
| |
| |   Fix B
| |
......
这样一来,Fix typo 就从历史中被抹去,也就相当于 Add feature-C 中从来没有出现过拼写错误。这算是一种良性的历史改写。

合并至 master 分支

$ git checkout master
Switched to branch 'master'
$ git merge ——no-ff feature-C
Merge made by the 'recursive' strategy.
README.md | 1 +
1 file changed, 1 insertion(+)
master 分支整合了 feature-C 分支。开发进展顺利。

推荐阅读