目前公司使用gitlab搭建了git服务器,在此记录一下工作中经常要用的命令。
git介绍最权威的当然还是官网,下面调重点来说:
参考链接http://git-scm.com/book/zh/%E8%B5%B7%E6%AD%A5-Git-%E5%9F%BA%E7%A1%80
- 理念
git的理念是速度、完全分布式,git的速度速度得益于其独创的以文件快照的形式保存不同版本之间的文件,完全分布是因为git在每个client端都保存着和server端同样的数据,这样git可以很快的比较版本之间的差异,在没有网络的情况下也能正常工作,这么做一个最大的好处是,避免了server宕机的问题,因为每个client都保存这全部信息,恢复比较容易。
- git中文件的三种状态
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。
已提交:是说该文件已经被保存到本地仓库中
已修改:是说该文件被修改了,但是还没有被保存的本地仓库中
已暂存:是说该文件在下次提交时,会被保存到本地仓库中(提交的git命令后面在命令讲解部分会提到)
所以我们在本地操作时经常是在这三种情况下转换:下面一张图说明这三种状态的转换
woking directory存放的是已修改的文件,也就是工作目录
staging area存放的是已暂存的文件,也就是暂存区域
git directory存放的是已提交的文件,也就是本地仓库
每个项目都有一个git目录(如果 git clone 出来的话,就是其中 .git 的目录;如果 git clone --bare 的话,新建的目录本身就是 Git 目录),它是 Git 用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。可以看出这也就是本地仓库。
工作目录就是从项目的git目录中取出某个版本的所有文件和目录用以后续工作的目录。
暂存区域其实是个简单的文件,一般都放在git目录中,有时也会称之为索引文件
- 安装git
ubuntu等类Debian系统一行命令搞定
sudo apt-get install git
- 初始化
git和其他linux系统的软件一样,配置文件分为全局的,和每个用户级别的。
系统级别的是/etc/gitconfig文件,git config 时用 --system 选项,读写的就是这个文件。
用户级别的是~/.gitconfig文件,git config 时用 --global 选项,读写的就是这个文件。
除了这两个之外,git还可以为每个单独的项目提供特有的配置,在项目的git目录下的config文件
距离项目近的配置文件会覆盖上一级配置文件
一般来说必须要配置的是user.name和user.email这两个属性,可以使用下面的命令
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
git config --global user.email johndoe@example.com
由于使用了--global参数,所以设置的配置是用户级别的
查看设置的参数可以使用git config --list 命令,也可以查具体的属性值git config user.name
git的所有命令都可以通过git help <cmd>来查看用法。
到这里,你就已经完成了git所具备的基础知识了。
下面将要介绍的是完成上述理念所使用的具体命令
------add 2014-5-8 --
上面这些都是花架子,不能实用,下面重点说说最近一直比较迷糊的概念git push与git pull相关代码:
git remote add origin git@github.com/jiacai2050/ssss.git要想push代码,首先要先有个远程repository,这个命令中origin相当于本地的指针,指向github上的git@github.com/jiacai2050/ssss.git
之后再执行
git push origin master这样就是本地的当前所在分支上的修改push到了origin仓库的master分支
多人协作时的大概流程:(角色jiacai2050:普通开发者, leader:项目组长)
假设现在在leader的github中有个ssss的项目,现在jiacai2050想开发个add_log功能,流程如下
1.开个本地分支,这样才有写权限
2.
git checkout -b add_log #添加新功能添加一个新分支,用于添加新功能
3.做一些修改后,执行
然后就可以发个pull request
git push origin add_log这样就将本地的add_log分支(假设你目前就是在add_log分支上)推向github上fork的仓库中,并且新创建一个add_log分支
然后就可以发个pull request
leader看到这个pull request后,想要merge 这个请求的大概流程:
git remote add jiacai2050 git@github.com/jiacai2050/ssss.git #创建一个指向我的指针之后再
git fetch jiacai2050 #把jiacai2050的代码拉下来
git branch -b test #再创建一个新的test分支,用于测试,这里不直接使用master分支是为了保持master的安全性
git checkout -b test git merge jiacai2050/ssss #切换到test分支后,把jiacai2050的ssss合并过来,进行测试
git checkout master git merge test #测试通过后在回到master分支上,
#到现在为止,test特殊分支没有用了,删除 git branch -D test #然后再推到github的仓库中 git push origin master
这样,leader就完成了合并操作。
#到现在为止,jiacai2050的贡献就算是做完了。删除我的add_log分支 git remove -D add_log git push origin :add_log #删除jiacai2050的github上的add_log分支 如果jiacai2050还想做修改,之后可以这么做 git remote add upstream git@github.com/others/ssss.git #在本地建立一个指向leader仓库的指针 git checkout master git pull upstream #拉回最新的修改,这个需要经常做 git checkout -b new_idea #重复add_log的操作即可
以上流程参照http://happycasts.net/episodes/60?autoplay=true,欢迎大家去看这个视频,真的是浅显易懂,这个老师的声音也有好磁性的说。