####介绍
Git本身是一个分布式的版本控制系统,也就是说你可以在任何一台机器作为仓库对代码或者文件进行管理。
当然真正使用时多数还是选择一台机器作为中心仓库用来托管代码,之后项目组成员从中心仓库pull代码到本地,然后以master分支为基础创建dev分支进行开发。测试通过后将dev分支merge到master,然后push到中心仓库。
####有关于Git,这里想要强调的大概三部分内容
- 本地Git环境
- 分支(Git branch)
- 协作开发
本地Git环境
本地的git环境可以分成三部分理解,首先是工作现场,你的所有修改删除等操作在这里完成,然后是缓存区,你要通过add命令将工作现场的文件提交到缓存区,此时这些被添加的文件状态会更改为Staged,最后是本地仓库,你要通过commit命令将缓存区的文件提交到本地仓库。
如果你要向远程提交代码的话,就通过push命令将本地仓库的代码提交到你配置好的远程代码库。
最后这里说明下git项目默认的主分支为master,一般通过remote add
命令添加远程代码库时命名为origin,所以git push origin master
其实就是将本地的master分支提交到远程代码库origin(默认也是master分支)。
Git Branch
CVS和SVN这类的版本控制系统,其原理是存储版本间文件的变化,而Git则是将各个版本的文件内容全部存储,但这并不意味着git会浪费大量存储空间,因为git所存储的不过是一个指向某之前版本的指针。
同理Git的分支其实也是指针,初始状态下Git会有一条master主线,除此之外还有一个HEAD指针用来标识当前工作现场关联到哪个分支,当你创建一个分支时会创建一个指针,这个指针会指向你作为基础点创建该分支的节点,当你将工作现场切换到该分支时,其实是HEAD指针指向该新建的分支指针,同样的道理当你merge一个分支的时候其实就是将两个分支都指向了那个最新的节点,删除分支也无非是删除了指向某节点的指针。
也正因为如此Git分支的创建合并删除是十分快的,而在SVN中由于分支创建删除耗时长的缘故几乎没人会在意并使用分支。
协作开发
第一种是比较容易接受的中心仓库方式,正如我之前所说的,Git本身是一个分布式的CVS,但是就像群聊QQ一样,你不会对群里每个人都发一次聊天内容,虽然聊天本身的灵活性允许你这么做。
道理是一样的Git允许任何人的任何机器作为仓库托管代码并相互提交,但是你不会把代码给项目组的几个人依次反复提交,所以在正常使用时我们还是会在一台服务器建立中心仓库,所有项目组成员把中心仓库作为基础进行代码的pull和push。这种开发模式是大家应该都比较容易入手的。这种方式下与SVN等传统的代码托管工具区别无非是你可以在本地建立分支,合并,删除,提交,这样会更灵活,自然也会更繁琐些。
另外一种协作方式是Pull-Request模式,也就是某人init一个项目,但其他人不能直接对项目进行修改提交,其他人想要contribute to这个项目,需通过fork将项目拷贝到自己的git仓库,然后在自己的仓库进行分支开发,当你想提交代码时就发出一个Pull-Request申请,源代码的所属人会根据你的申请选择是否同意merge项目。当你想要更新fork过来的项目时可以通过配置upstream进行更新。
####Git安装
以Ubuntu为例,安装命令为:
$ apt-get install git
安装结束,通过--version查看当前版本。
$ git --version
配置用户和邮箱
安装完成后,在使用git之前需要配置用户名和邮箱,查看版本日志的时候可以辨别谁提交了什么,怎么联系这个人。
$ git config --global user.name "Your username"
$ git config --global user.email "Your email@example.com"
设置推送模式
当push命令没有明确推送源和目标时,会按照push.default模式进行推送(这步也可以跳过),一般默认设置为simple即可。
$ git config --global push.default simple
Git创建一个版本库(repository)
在你要上传的文件夹执行init命令,创建版本库。
$ git int
远程库
用 $ remote -v
命令查看当前版本库关联的fetch和push路径(如果用github做代码库的话该路径一般为https://github.com/account/repository.git
,个人感觉-v应该是view的意思)。
$ git remote -v
在没有关联远程版本库的情况下,需要添加关联,用remote add
命令。
$ git remote add origin "https://github.com/account/repository.git"
如果想删除当前关联的远程版本库,可以用remote remove
命令。
$ git remote remove origin
其中origin为本地版本库的别名,系统默认采用origin。
####上传文件 将本地版本库文件上传到关联的远程版本库,需要添加需要上传的文件,提交上传请求,推送上传内容到远程。
以下上传版本库下所有文件到关联的远程版本库。
$ git add .
$ git commit -am "Input your message about this commit"
$ git push -u origin master
之后终端会要求输入github账号和密码,请求上传认证。
其中push命令后的参数origin为链接到远程的目标,master为本地的源
$ git add -u
更新本地修改,包括删除和新增。
####删除文件
通过rm命令删除文件,并通过commit提交。
$ git rm [文件名]
$ git commit
####查看信息
通过status查看本地版本库和远程版本库那些文件不一致(只显示两端不一致文件的名字,新增文件也会显示)。
$ git status
通过diff查看,远程版本库和本地版本库相比不一致的文件做了什么修改(注意本地新增的文件不会显示)。
$ git diff
通过log命令可以查看修改记录。
$ git log
####版本控制
将版本库中的readme.txt文件替换到当前工作区(可用来丢弃修改,恢复删除)。
$ git checkout --readme.txt
将已经提交到缓存区的readme.txt文件替换为本地仓库的readme.txt文件。
$ git reset HEAD --readme.txt
回退n个版本。
$ git reset —hard HEAD ~n
####Git分支(Branch)
查看本地分支。
$ git branch
创建一个分支,创建一个分支名字叫v1.0。
$ git branch v1.0
创建分支并切换。
$ git checkout -b branchname
切换分支,切换到分支v2.0。
$ git checkout v2.0
切换到指定的commit(根据commit id)。
$ git checkout bc5176d
删除分支,删除分支v1.0。
$ git branch -d v1.0
强制删除分支v1.0。
$ git branch -D v1.0
提交当前分支,提交v1.0到远程,如果远程没有则在远程创建此分支。
$ git push -u origin v1.0
合并分支,把v2.0和当前分支合并。
$ git merge v2.0
合并指定的commit 到当前(根据commit id)。
$ git merge bc5176d
合并2.0分支到当前分支,并作为一个新的任务提交。
$ git merge --no-ff -m “comment” V2.0
查看远程分支。
$ git branch --remote
删除远程分支,删除远程v1.0分支。
$ git push origin --delete v1.0
####暂存工作区
将当前修改状态暂存。
$ git stash
列出工作现场。
$ git stash list
恢复并删除工作现场。
$ git stash pop
####多人协作
从远程更新代码到本地代码库。
$ git pull
创建本地dev分支并与远程dev分支建立链接。
$ git branch —set-upstream-to=origin/dev dev
除此之外,当你fork别人的代码时,需要添加远程的上流。
$ git remote add upstream http://github.com/username/project.git
更新上流。
$ git remote update upstream
将上流master分支拷贝到本地代码库master分支。
$ git rebase upstream/master master
####SSH Key 每次上传下载项目的时候都需要输入git的账号和密码是一件很麻烦的事,这个时候就可以用SSH Key的方式进行版本的管理。
生成SSH Key。
$ ssh-keygen -t rsa -C "your_email@example.com"
这个时候会在你当前账户目录下创建一个.ssh目录,在这个目录下会有一个id_rsa和一个id_rsa.pub文件,复制pub文件内容。
$ pbcopy < ~/.ssh/id_rsa.pub
之后将你复制的内容粘贴到git工具下面的添加公钥中就可以了。
然后再你复制项目路径的时候选择SSH路径,而不是Https路径。
最后设置远程路径
$ git remote set-url origin git@example.com:<username>/<project>.git