在团队开发中,遵循一个合理清晰的Git使用流程是非常重要的。否则,每个人都会把提交搞得一团糟,项目很快就会变得难以协调和维护。以下是ThoughtBot的Git使用规范流程。我从中学到了很多,并推荐你也使用Git。第一步:创建新分支首先,每开发一个新功能,都要创建一个单独的分支(这方面请参考《Git分支管理策略》)。#获取主干***代码$gitcheckoutmaster$gitpull#新建开发分支myfeature$gitcheckout-bmyfeature第二步:提交分支commit分支修改完成后,即可提交commit。$gitadd--all$gitstatus$gitcommit--verbosegitadd命令的all参数表示保存所有的更改(包括新增、修改和删除)。从Git2.0开始,all是gitadd的默认参数,所以你也可以使用gitadd。反而。gitstatus命令用于查看更改的文件。gitcommit命令的verbose参数会列出diff的结果。第三步:写提交信息提交commit时,一定要给出完整简洁的提交信息。以下是模板。现在时summaryunder50characters*Moreinformationaboutcommit(under72characters).*Moreinformationaboutcommit(under72characters).http://project.management-system.com/ticket/123***该行是summary,不超过50个字符,然后空一个linetolist变更原因、主要变更和需要注意的问题。***,提供相应的URL(如Bugticket)。第四步:与主干同步在分支开发过程中,需要经常与主干保持同步。$gitfetchorigin$gitrebaseorigin/master第五步:合并commit分支开发完成后,可能会有一堆commit,但是合并到trunk时,往往希望只有一个(或者最多两个)或三)commits,不仅清晰,而且易于管理。那么,如何合并多个提交呢?这需要gitrebase命令。$gitrebase-iorigin/mastergitrebase命令的i参数表示交互(interactive),然后git会打开一个交互界面进行下一步操作。下面以TuteCosta的例子来说明如何合并commit。pick07c5abdIntroduceOpenPGPandteachbasicusagepickde9b1ebFixPostChecker::Post#urlspick3e7ee36Heykids,stopallthehighlightingpickfa20af3gitinteractiverebase,squash,amend#Rebase8db7e8b..fa20af3onto8db7e8b##Commands:#p,pick=usecommit#r,reword=usecommit,buteditthecommitmessage#e,edit=usecommit,butstopforamending#s,squash=usecommit,butmeldintopreviouscommit#f,fixup=like"squash",butdiscardthiscommit'slogmessage#x,exec=runco??mmand(therestoftheline)usingshell##Theselinescanbere-ordered;theyareexecutedfromtoptobottom.##IfyouremovealinehereTHATCOMMITWILLBELOST.##However,ifyouremoveeverything,therebasewillbeaborted.##Notethatcommentedoutcommitsareemptyedoutcommits.##注意commitedoutcommits界面首先列出了当前分支***的4个commit(越低越新)。每次提交前都有一个操作命令。默认是pick,表示选择这一行的commit,进行rebase操作。4次提交下方是一堆注释,列出了可以使用的命令。pick:正常选择reword:选择,修改提交信息;edit:select,rebase时会暂停,允许修改本次commit(参考这里)currentcommitexec:执行其他shell命令上面六个命令中,squash和fixup可以用来合并commit。先把需要合并的commit前面的动词改成squash(或s)。pick07c5abdIntroduceOpenPGPandteachbasicusagesde9b1ebFixPostChecker::Post#urlss3e7ee36Heykids,stopallthehighlightingpickfa20af3gitinteractiverebase,squash,amend这样的改动,执行后,当前分支只会剩下两个commit。第二行和第三行的提交将合并到***行的提交中。提交信息中也会包含这三个commit的提交信息。#Thisisacombinationof3commits.#Thefirstcommit'smessageis:IntroduceOpenPGPandteachbasicusage#Thisisthe2ndcommitmessage:FixPostChecker::Post#urls#Thisisthe3rdcommitmessage:Heykids,stopallthehighlighting如果你把第三行的squash命令改成fixup命令。pick07c5abdIntroduceOpenPGPandteachbasicusagesde9b1ebFixPostChecker::Post#urlsf3e7ee36Heykids,stopallthehighlightingpickfa20af3gitinteractiverebase,squash,amend运行结果相同,但还是生成了两个commit,将第二行和第三行的commit合并到***行的commit中。但是在新的提交信息中,第三行commit的提交信息会被注释掉。#Thisisacombinationof3commits.#Thefirstcommit的消息是:IntroduceOpenPGPandteachbasicusage#Thisisthe2ndcommitmessage:FixPostChecker::Post#urls#Thisisthe3rdcommitmessage:#Heykids,stopallthehighlightingsquash和fixup命令也可以用作命令行参数来自动合并提交。$gitcommit--fixup$gitrebase-i--autosquash的用法请参考这篇文章,这里不再赘述。第六步:推送到远程仓库并合并commit后,就可以将当前分支推送到远程仓库了。$gitpush--forceoriginmyfeaturegitpush命令需要加上force参数,因为rebase之后,分支历史发生了变化,可能与远程分支不兼容,可能会被强制推送(见这里)。第七步:发出PullRequest并提交到远程仓库后,可以向master分支发出PullRequest,然后请其他人review代码,确认是否可以合并到master中。
