On Thu, Oct 20, 2011 at 10:12:24AM +0800, Liu wrote: > 给我们公司的人做了git培训,顺便写了一个。 很不错。git的文档网上到处都是,我们能不能结合自己的工作,介绍 如何使用git。 比如,在gcc开发,如何使用git-svn git svn rebase git svn dcommit 等等。 > > \section{git基本配置} > 运行下列命令来配置你的git客户端,就是填写个人基本信息和基本工具。 > \begin{itemize} > \item git config --global user.name "Your Name" > \item git config --global user.email yournick@xxxxxxxxxxx > \item git config --global core.editor YourFavoriteEditor 这里需要说一下,core.editor 一般就是vim,但是可以设置为一些特殊 脚本。这样在你 git commit 的时候,那个脚本运行,可以自动生成 changelog entry等等。 > > \section{参与你没有写权限的开源项目} > 先说一下流程,把思路理清楚了,省得废话。 > \begin{itemize} > \item clone项目代码。 > \item 新建并切换到自己的分支。 > \item 修改,并提交到本地。 > \item 生成补丁。 > \item 把补丁发给maintainer。 > \item 你的补丁被接受之后,切换回主分支,删除自己的开发分支。 > \end{itemize} > > 按照上面的流程,我们来看对应的命令。 > \begin{itemize} > \item git clone URL > \item git co -b BRANCH\\ > 相当于\\ > git br BRANCH 新建分支\\ > git co BRANCH 切换到分支BRANCH > \item 修改代码,这个不用说了吧?\\ > git st 查看你对哪些文件做了修改\\ > git add MODIFIED\_FILE > git ci -m "MSG" 把你的修改提交到本地 > \item git format patch 会自动生成补丁 一般在format patch之前,最好 git rebase -i master 一下 1. 可以把一些小commit cmobine在一起, 2. 修改commit log,把changlog加入 commit log中,这样, git format patch出来的patch,就带changelog了。 > \item > 把补丁作为附件mail给maintainer,Linux内核开发最蛋疼的是Linus要求小补丁作为邮件正文,擦,蛋疼,反正我也不玩儿内核,不管那么多。 这里有两个办法 1. git send-mail 可以把patches发出去。我没有用过。 2. 手动inline patch到mail。这个需要mail client有一些修改。我以thunderbird为例子。 需要在thunderbird 中,关闭auto wrapping。 这个会自动把超过76个的字母的行给加上 换行。 在bash中 $ cat 0001-foo.patch | xclip 然后把光标放在邮件末尾,signature后边, 按下鼠标中键。patch就paste进来了。 > \item git co master 切换回主分支\\ > gir br -D BRANCH 删除自己的开发分支 > \end{itemize} > > \section{参与你有写权限的项目中使用git} > 这不是git-svn,有了git之后,Who fucking care about CVS/SVN? > > 同样先说一下流程,把思路理清楚了,省得废话。 > \begin{itemize} > \item clone项目代码。 > \item 新建并切换到自己的分支。 > \item 修改,并提交到本地。 > \item 把你的分支推送到服务器。 > \item 通知maintainer合并你的分支。 > \item 如果maintainer没有删除你的分支,切换回主分支,并自己删除自己的分支。 > \end{itemize} 这样的情况对于gcc/gdb,不多。能够把一个branch merge过来的人,都是少数,像Ian那样的。我们大多数工作的时候,是有自己 的branch,上边有若干local patches,每次review结束,可能只有一部分patch, 而不是整个branch的patch都被approve了。 这个时候需要git cherry-pick 从 你的branch挑选几个commit到master,然后push。 > > 下面的命令跟上一节相同的不再解释。 > \begin{itemize} > \item git clone username@URL\\ > 因为你有写权限了,所以clone的时候,加上你的username > \item git co -b BRANCH > \item git ci -a -m "MSG"\\ > 相当于\\ > git add ALL\_MODIFIED\_FILES\\ > git ci -m "MSG"\\ > 如果有新建的文件或者目录,你还是需要\\ > git add NEW\_FILE/DIR > \item git push origin BRANCH:BRANCH 把你的分支推送到服务器 > \item 通知maintainer合并你的分支,通讯基本靠吼,打电话,发邮件,都行吧。 > \item 如果maintainer没有删除你的分支\\ > git co master 切换回主分支\\ > git push origin :BRANCH 自己删除自己的远程分支\\ > git br -D BRANCH 自己删除自己的本地分支 > \end{itemize} > > \section{管理你的git项目} > 如果你的项目里面有contributor、maintainer、commiter,你还做什么?只有两件事情了,合并分支,打release标签。 > \begin{itemize} > \item git merge BRANCH\\ > 在master分支运行这个命令,就是合并了 > \item git tag TAG 1b2e1d63ff\\ > > 就是打标签了,虽然git的分支功能非常强大,但是我们每个release应该都是一个TAG,而不是一个branch啊,当然,也许有人希望继续维护某个release版本的branch的,可以建一个那样的分支,但是分支是不能取代TAG的。 这里是不是还要介绍一下,如果master修改了,你的branch怎么update。 一般是这样的: git checkout master // 切换到master branch git pull // git checkout your-branch git pull . master // update your-branch -- Yao Qi <qiyaoltc AT gmail DOT com> Your depth of comprehension may tend to make you lax in worldly ways.