##引言
鉴于使用Git有一点点门槛(比SVN稍微高一点),我写了个实用教程,如果想更进一步了解Git,或者觉得我写的太懶,推荐参考书 Progit,这本书是开源的,前四章就足够用了。
组内我和晓天、汤韬都会使用git,有问题可以线下直接问。
至于为什么要用Git,其实用SVN也是挺好的,但是SVN是集中式提交,同一时刻只能有一个人修改一个文件,这个在很多时候会比较蛋疼,另一方面SVN提交时要求联网,这样碰上断网什么的话SVN就废了。
至于为什么要使用版本控制,主要是为了方便团队合作以及代码管理,并且每个人都可以知道其他人在某一段时间对代码做出了怎样的修改,这个对于Debug非常重要,另外,也能方便地进行代码质量控制,写的难看的代码是会被别人看到并吐槽的…… ( git 有一个 git blame,可以知道任意一行代码是谁写的 - - )
Ubuntu下 apt-get install git
即可
组内需要在Windows里开发的内容主要是电路板和文档,不需要使用Git :)
初始配置
git config --global user.name "John Doe" #设置自己的用户名
git config --global user.email "[email protected]" #设置自己的邮件地址
一般到这里就足够了,我个人还打开了自动色彩的支持,这样做代码对比的时候比较好看些。这些配置最终是写到 ~/.gitconfig 里的,我的gitconfig在 这里 。
初始化一个仓库: git init
, 此后就可以运行各类git命令了
最常用的几个命令:
git status
查看仓库当前状态git add some_file
将某个文件加入版本系统,或缓存(后文会具体描述git commit -m "i did some changes
进行一次提交,Git是本地提交,不要求连网git push origin master
将本地的master分支推送到origin服务器的master分支git pull origin master
将服务器上的master分支同步到本地
Git中的文件有三个状态:
- untracked : Git不会管理这个文件,默认是这个状态
- unstaged: 当对一个被track的文件进行改动后即为此状态,Git默认不会对此状态的文件进行提交
- staged: Git已经缓存这个文件的修改,提交时将永久保存
三个状态比SVN的两个状态略复杂一些,但是实际应用中灵活性好很多。
对于一个 unstaged 的文件,使用 git add file
将其转为 staged 态,有一个技巧,就是在提交的时候,使用 git commit -a -m "some ooxx"
,Git会自动对unstaged的文件执行add操作。
以组内的TinyOS代码开发为例
git clone [email protected]:tinyos.git
这一步将服务器上的仓库 clone 下来cd tinyos
- 写代码,测试,调试,写代码,写代码,终于写完了
- 如果写代码过程中有新建文件,则使用
git add file
让git去track它,否则/然后git commit -a -m "我写了一些代码"
提交即可 - 如果还要写代码,则返回前两步,否则将代码同步到服务器
git pull origin master
在推送之前先看看别人有没有提交代码,同步下来,这是个好习惯git push origin master
OK,就这么简单。
需要明确注意的一点是在 pull 的时候,别人写的代码可能跟自己的会有冲突,git会把双方的代码 都放在一个文件里,并警报,这时 一定要打开文件去手动解决冲突 !冲突解决完了再提交一次,然后push。
上一节讲到的开发流程是都在 master 分支下进行的,这个不是很利于代码的维护以及仓库的整洁(虽然他是可行的),一个更好的方式是,本地有 master 和 dev 两个分支,每次都在 dev 分支下修改和提交,在master分支合并dev的修改并推送到服务器。所以开发流程修改为:
git clone [email protected]:tinyos.git
这一步将服务器上的仓库 clone 下来cd tinyos
git branch dev
新建dev分支,一次即可git checkout dev
切换到dev分支- 写代码,测试,调试,写代码,写代码,终于写完了
- 如果写代码过程中有新建文件,则使用
git add file
让git去track它,否则/然后git commit -a -m "我写了一些代码"
提交即可 - 如果还要写代码,则返回前两步,进行下一步
git checkout master
切换回master分支git pull origin master
同步其他人的代码,可能处理冲突git merge dev
将自己的修改合并进来,可能需要处理冲突git push origin master
这样一次开发就完成了,下次还要回dev分支,就 git checkout dev
,并且 git merge master
,将其他人的代码合并进来,这里一般不会有冲突 //因为之前已经处理过一次。
得益于活跃的社区,Git 有一大票参考资料,而且几乎都有中文版,在此推荐:
- Pro Git: 楼主的入门教材,Git社区官方推荐的开源书籍,官网喜迎十八大中,pdf放在了 samba的 Documents/WSN小组资料 中
- Git Magic: 链接 Yet Another 经典教程
- 阮一峰: Git分支管理策略
- 我的Delecious: 这是楼主的收藏夹中跟git有关的部分 //楼主收藏夹里还有其他好玩的东东欢迎翻阅
好了有这些基本知识使用Git已经足够,遇到别的问题的时候欢迎找楼主面基
P.S. 本文也是用Git管理的,使用Markdown排版,地址在此,欢迎fork,欢迎pull request