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>