下面是ThoughtBot 的Git使用规范流程。我从中学到了很多,推荐你也这样使用Git。
[img]http://files.jb51.net/file_images/article/201609/2016926162921327.jpg?2016826162940[/img]
[b]第一步:新建分支[/b]
首先,每次开发新功能,都应该新建一个单独的分支。
# 获取主干最新代码
$ git checkout master
$ git pull
# 新建一个开发分支myfeature
$ git checkout -b myfeature
[b]第二步:提交分支commit[/b]
分支修改后,就可以提交[code]commit[/code]了。
$ git add --all
$ git status
$ git commit --verbose
[code]git add[/code] 命令的all参数,表示保存所有变化(包括新建、修改和删除)。从Git 2.0开始,all是 [code]git add[/code] 的默认参数,所以也可以用 [code]git add [/code]. 代替。
[code]git status[/code] 命令,用来查看发生变动的文件。
[code]git commit [/code]命令的[code]verbose[/code]参数,会列出 diff 的结果。
[b]第三步:撰写提交信息[/b]
提交[code]commit[/code]时,必须给出完整扼要的提交信息,下面是一个范本。
Present-tense summary under 50 characters
* More information about commit (under 72 characters).
* More information about commit (under 72 characters).
[url=http://project.management-system.com/ticket/123]http://project.management-system.com/ticket/123[/url]
第一行是不超过50个字的提要,然后空一行,罗列出改动原因、主要变动、以及需要注意的问题。最后,提供对应的网址(比如Bug ticket)。
[b]第四步:与主干同步[/b]
分支的开发过程中,要经常与主干保持同步。
$ git fetch origin
$ git rebase origin/master
[b]第五步:合并commit[/b]
分支开发完成后,很可能有一堆[code]commit[/code],但是合并到主干的时候,往往希望只有一个(或最多两三个)[code]commit[/code],这样不仅清晰,也容易管理。
那么,怎样才能将多个[code]commit[/code]合并呢?这就要用到 [code]git rebase[/code] 命令。
$ git rebase -i origin/master
[code]git rebase[/code]命令的i参数表示互动(interactive),这时git会打开一个互动界面,进行下一步操作。
下面采用Tute Costa的例子,来解释怎么合并[code]commit[/code]。
pick 07c5abd Introduce OpenPGP and teach basic usage
pick de9b1eb Fix PostChecker::Post#urls
pick 3e7ee36 Hey kids, stop all the highlighting
pick fa20af3 git interactive rebase, squash, amend
# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# 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
上面的互动界面,先列出当前分支最新的4个[code]commit[/code](越下面越新)。每个[code]commit[/code]前面有一个操作命令,默认是[code]pick[/code],表示该行[code]commit[/code]被选中,要进行[code]rebase[/code]操作。
4个[code]commit[/code]的下面是一大堆注释,列出可以使用的命令。
[b]pick:[/b]正常选中
[b]reword:[/b]选中,并且修改提交信息;
[b]edit:[/b]选中,rebase时会暂停,允许你修改这个commit(参考这里)
[b]squash:[/b]选中,会将当前commit与上一个commit合并
[b]fixup:[/b]与squash相同,但不会保存当前commit的提交信息
[b]exec:[/b]执行其他shell命令
上面这6个命令当中,[code]squash[/code]和[code]fixup[/code]可以用来合并[code]commit[/code]。先把需要合并的[code]commit[/code]前面的动词,改成[code]squash[/code](或者s)。
pick 07c5abd Introduce OpenPGP and teach basic usage
s de9b1eb Fix PostChecker::Post#urls
s 3e7ee36 Hey kids, stop all the highlighting
pick fa20af3 git interactive rebase, squash, amend
这样一改,执行后,当前分支只会剩下两个[code]commit[/code]。第二行和第三行的[code]commit[/code],都会合并到第一行的[code]commit[/code]。提交信息会同时包含,这三个[code]commit[/code]的提交信息。
# This is a combination of 3 commits.
# The first commit's message is:
Introduce OpenPGP and teach basic usage
# This is the 2nd commit message:
Fix PostChecker::Post#urls
# This is the 3rd commit message:
Hey kids, stop all the highlighting
如果将第三行的[code]squash[/code]命令改成[code]fixup[/code]命令。
pick 07c5abd Introduce OpenPGP and teach basic usage
s de9b1eb Fix PostChecker::Post#urls
f 3e7ee36 Hey kids, stop all the highlighting
pick fa20af3 git interactive rebase, squash, amend
运行结果相同,还是会生成两个[code]commit[/code],第二行和第三行的[code]commit[/code],都合并到第一行的[code]commit[/code]。但是,新的提交信息里面,第三行[code]commit[/code]的提交信息,会被注释掉。
# This is a combination of 3 commits.
# The first commit's message is:
Introduce OpenPGP and teach basic usage
# This is the 2nd commit message:
Fix PostChecker::Post#urls
# This is the 3rd commit message:
# Hey kids, stop all the highlighting
[code]squash[/code]和[code]fixup[/code]命令,还可以当作命令行参数使用,自动合并[code]commit[/code]。
$ git commit --fixup
$ git rebase -i --autosquash
这个用法请参考这篇文章,这里就不解释了。
[b]第六步:推送到远程仓库[/b]
合并[code]commit[/code]后,就可以推送当前分支到远程仓库了。
$ git push --force origin myfeature
[code]git push[/code]命令要加上[code]force[/code]参数,因为[code]rebase[/code]以后,分支历史改变了,跟远程分支不一定兼容,有可能要强行推送(参见这里)。
[b]第七步:发出Pull Request[/b]
提交到远程仓库以后,就可以发出 [code]Pull Request [/code]到[code]master[/code]分支,然后请求别人进行代码[code]review[/code],确认可以合并到[code]master[/code]。
[b]总结[/b]
以上就是这篇文章的全部内容,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。