Git使用技巧—保持开发分支上提交日志整洁 fixup rebase

当产品经理或者项目组的leader给你一个新任务时,要开发系统的一个新功能,譬如加一个用户留言功能。如果使用Git做版本管理的话,理所当然我们就会基于主分支新建一个开发分支:git checkout -b dev于是乎聪明的你劈劈啪啪地把这个功能写好了,喝了一口你早已用开水泡好的枸杞菊花之后在命令行中敲下 git commit -m 'message feature is done'
这时提交信息是:[dev (root-commit) 8a9dc39] message feature is done请注意提交的SHA是8a9dc39
你还醉心于自己这么牛逼很快地开发出这个功能的时候,产品经理mm来到你工位前笑眯眯地说:“帅哥,现在我们网站的首页需要改版,设计图我让设计师给你,么么哒”。做为一名全栈工程师,前端的活自然也不在话下,搞定git commit -m 'new homepage feature is done'
这时的提交信息是:[dev (root-commit) b4ef958] new homepage feature is done请注意提交的SHA是b4ef958
接下来手头没啥事做了,习惯性地浏览开源中国,看着动弹里面那些人水,大菲又上热门了!
看动弹正嗨时,测试发来QQ消息说给用户留言时个别用户收不到留言信息。果然,不过你很快就把这个bug修复。此时 --fixup option就派上用场了。
git commit --fixup 8a9dc39注意到8a9dc....这一串字符了没,这正是留言系统完成时你提交的SHA值。
这时我们git log --oneline一下

c281807 fixup! message feature is done
b4ef958 new homepage feature is done
8a9dc39 message feature is done

这两个功能的修改经过测试,确定能合并在主分支。处女座都是无法忍受提交记录里有c281807 fixup! message feature is done这个记录。那么--autosquash option就派上用场了,简直是处女座的福音。

git rebase -i --autosquash ac5db87

ac5db87是message feature is done提交的上一个提交SHA,在命令行中输入上述命令之后会进入一个编辑器(这要看你git配置里的编辑器是啥了)

pick  8a9dc39 message feature is done
fixup c281807 fixup! message feature is done
pick b4ef958 new homepage feature is done
# Rebase f1cd441..976f579 onto f1cd441 (3 command(s))
#
# Commands:
# p, pick = use commit  使用这个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   就是这个commit log不会在提交记录的意思
# 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

然后直接保存就好了。此时你git log --oneline看看。

b4ef958 new homepage feature is done
8a9dc39 message feature is done
ac5db87 previous commit

是不是很爽,fixup! message feature is done这个提交打印出来的log不见了,这保持了分支提交记录整洁。我挺喜欢的,这些小bug的提交log我并不喜欢它的存在,当然智者见智。
没啥事做可以合并到主分支了

git checkout master
git rebase dev

总结

学会了两个Git命令

git commit --fixup <commit> 把commit作为之前某个提交的一个修复
git rebase -i --autosquash <normal commit>
4 条评论
您想说点什么吗?
自己 评论于 2017-05-24 12:03

在自己的开发分支上使用真的是太方便了。

3 评论于 2017-01-04 19:40

3

2 评论于 2017-01-02 18:57

2

1 评论于 2017-01-02 18:57

1