Git诞生
Git是linux社区开发的分布式版本控制系统,特点是:
- 速度
- 简单的设计
- 对非线性开发模式的强力支持(允许上千个并行开发的分支)
- 完全分布式
- 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)。
2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等
版本控制系统
- 集中式版本控制系统,版本库是集中存放在中央服务器的,而大家工作的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始工作,工作完成,再把自己的修订推送给中央服务器。这类系统,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
那分布式版本控制系统与集中式版本控制系统有何不同呢?
首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
基本用法(一)
如何创建和使用 git 仓库
创建
- git初始化(git配置你的名字和邮箱)
- 获得一个git新仓库(clone一个或新建一个新仓库——git init获得.git文件夹)
使用
正常的工作流程
- 创建或修改文件(touch,vim或直接echo 添加——echo “ ” >> file)
- 使用git add命令添加新创建或修改的文件到本地的缓存区(Index)
- mkdir project在当前目录下创建一个新的文件夹
- –m参数是注释信息:“ ”
- 使用git commit命令提交到本地代码库
- (可选,有的时候并没有可以同步的远端代码库)使用git push命令将本地代码库同步到远端代码库
分支与合并
Git的分支可以让你在主线(master分支)之外进行代码提交,同时又不会影响代码库主线。
分支的作用体现在多人协作开发中,比如一个团队开发软件,你负责独立的一个功能需要一个月的时间来完成,你就可以创建一个分支,只把该功能的代码提交到这个分支,而其他同事仍然可以继续使用主线开发,你每天的提交不会对他们造成任何影响。当你完成功能后,测试通过再把你的功能分支合并到主线。
一个Git仓库可以维护很多开发分支
创建分支
git branch 分支名:创建新分支
git branch :查看当前的分支列表
master分支是Git系统默认创建的主分支,星号标识了你当工作在哪个分支下
git checkout 分支名:切换到其他分支
- 查看下file1中的内容会发现刚才做的修改已经看不到了。因为刚才的修改时在experimental分支下,现在切换回了master分支,目录下的文件都是master分支上的文件了。
- 这时,两个分支就有了各自不同的修改,分支的内容都已经不同,如何将多个分支进行合并呢?
合并
- git merge命令合并分支到主线分支
- 合并后删除分支 :git branch -d只能删除那些已经被当前分支的合并的分支. 如果你要强制删除某个分支的话就用git branch –D
- 撤销一个合并 git reset –hard HEAD^
快速向前合并
还有一种需要特殊对待的情况,在前面没有提到。通常,一个合并会产生一个合并提交(commit), 把两个父分支里的每一行内容都合并进来。但是,如果当前的分支和另一个分支没有内容上的差异,就是说当前分支的每一个提交(commit)都已经存在另一个分支里了,git 就会执行一个“快速向前”(fast forward)操作;git 不创建任何新的提交(commit),只是将当前分支指向合并进来的分支。
git日志
git log:显示所有的提交
git log –stat : 如果用–stat选项使用’git log’,它会显示在每个提交(commit)中哪些文件被修改了, 这些文件分别添加或删除了多少行内容,这个命令相当于打印详细的提交记录
基本用法(二)
- git diff命令的作用是比较修改的或提交的文件内容
- git diff –cached:查看缓存区内与上次提交之间的差别(使用–cached参数)
-add 将修改加到缓存区,commit将缓存区东西提交到本地代码库
查看分支之间区别
- git diff master test:查看分支test与主线分支master之间的区别
- git diff 是一个难以置信的有用的工具,可以找出你项目上任意两个提交点间的差异
分布式的工作流程
- git pull命令执行两个操作: 它从远程分支(remote branch)抓取修改git fetch的内容,然后把它合并git merge进当前的分支。
- 如果我们在myrepo目录下执行git pull会发生什么呢?
myrepo会从克隆的位置拉取代码并更新本地仓库,就是把gitproject(远程分支)上的修改同步到本地
公共git仓库
开发过程中,通常大家都会使用一个公共的仓库,并clone到自己的开发环境中,完成一个阶段的代码后可以告诉目标仓库的维护者来pull自己的代码。
如果你和维护者都在同一台机器上有帐号,那么你们可以互相从对 方的仓库目录里直接拉所作的修改,git命令里的仓库地址也可以是本地的某个目录名
将修改推到一个公共仓库
通过http或是git协议,其它维护者可以通过远程访问的方式抓取(fetch)你最近的修改,但是他们没有写权限。
如何将本地私有仓库的最近修改主动上传到公共仓库中呢?
最简单的办法就是用git push命令,推送本地的修改到远程Git仓库
git push命令的目地仓库可以是ssh或http/https协议访问
当推送代码失败时要怎么办
先git pull 再git push
Git 标签
- 我们可以用 git tag不带任何参数创建一个标签(tag)指定某个提交(commit)