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 分支。开发进展顺利。