为啥要写这一篇呢?最近在整理过去1~2年的分享笔记,一方面可以温故而知新,另一方面希望在工作得以实践。随着最大的同性恋社区github的流行,很多公司已经放弃使用svn,而使用了gitlab。据悉Google, Facebook, Microsoft等世界级公司每天在用Git,而github和gitlab都在Git基础上得以发展及延伸。
笔者之前使用过非常多的版本控制工具,主要有CVS(09年左右)、VSS(微软的Visual Source Safe)、TFS(微软的Team Foundation Server)、SVN(Subversion)。这些都是集中式的版本控制系统,而TFS功能是最强大的,可以讲它已经到了极致。
什么是集中式?
版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。
什么是分布式?
首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。
那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
如果你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机?在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
分布式版本很多,Git(免费的)的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理。
Linus Torvalds是大牛中的大牛,它不但开创了Linux操作系统,而且他发明了Git版本控制系统。
在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码。2005年Linux 内核开发社区正面临严峻的挑战:他们不能继续使用 BitKeeper了(一个分布式版本控制系统),原因是当时Bitkeeper 著作权所有者决定收回授权,内核开发团队与其协商无果,而又没有其他的 SCM (Software Configuration Management)可满足他们的分布式系统的需求。
为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
Atlassian为Git做了一个10年的纪录图。
git | 它是一种开源的版本控制系统,可以高效的管理项目版本。同时也是一个版本控制软件。在Git中并不存在主库这样的概念,每一份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。 |
github | 它可以托管各种Git库,并提供web界面。GitHub的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为代码玩家的MySpace。 |
gitlab | 它是一个用于仓库管理系统的开源项目,使用git进行代码管理工具,可以自己搭建GitLab仓库服务器。 |
最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。安装比较简单,这里不解释了,看官方介绍吧
检出仓库 | $git clone git://github.com/jquery/jquery.git |
查看远程仓库 | $git remote –v $git remote show origin |
添加远程仓库 | $git remote add [name] [url] |
删除远程仓库 | $git remote rm [name] |
修改远程仓库 |
$git remote set-url --push[name][newUrl] |
拉取远程仓库 | $git pull [remoteName] [localBranchName] |
推送远程仓库 | $git push [remoteName] [localBranchName] $git push origin [name] 创建远程分支(本地分支push到远程) |
git branch #列出本地分支
git branch -a #列出local and remote branch
git branch -r #列出remote branch
git branch feture1 #新建一个分支feture1
git branch -d feture1 #删除分支feture1,d会检查feture1是否已经merge到其父分支,如果没有,不予删除。D直接删除
git checkout feture1 #切换到分支feture1
git checkout -b feture1 #创建新分支并立即切换到新分支
git merge feture1 #合并并提交feture1的所有版本到当前分支,如果当前分支自建立feture1后无更改,则启动fastforward,可以添加参数–no-ff关闭该效果
git status #查看目前分支下文件控制情况
git commit -v #可以查看diff内容
git log -1 #查看log信息,最近1条
git log --pretty=oneline #展示提交历史(用oneline 将每个提交放在一行显示)
git log --pretty=format:"%h - %an, %ar : %s" #可以定制要显示的记录格式
查看版本 | $git tag |
创建版本 | $git tag [name] |
删除版本 | $git tag -d [name] |
查看远程版本 | $git tag -r |
创建远程版本(本地版本push到远程) | $git push origin [name] |
删除远程版本 | $git push origin :refs/tags/[name] |
git submodule add [url] [path]
|
添加子模块,如: $git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs |
git submodule init |
初始化子模块,只在首次检出仓库时运行一次就行 |
git submodule update
|
更新子模块,每次更新或切换分支后都需要运行一下 |
git rm | 删除子模块, 1)$ git rm --cached [path] |
在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可。可以忽略自身。.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
.a #忽略.a的文件
!lib.a #不要忽略lib.a
/TODO #忽略此目录下的TODO文件,子目录下的TODO文件不忽略
build/ #忽略所有build/目录下的文件
doc/.txt #忽略文件入doc/notes.txt,但是子目录下的txt不被忽略
因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识
$git config --global user.name "alex2chen"
$git config --global user.email "[email protected]"
注意:git config –global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。
$cd D:
$mkdir git-test
$cd git-test
$pwd
$git init #把这个目录变成git可以管理的仓库,会多了一个.git的目录,是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了
$git add readme.txt #添加到暂存区
$git commit -m "readme.txt" #把文件提交到仓库
$git status #查看是否还有文件未提交
$git diff readme.txt #readme.txt文件已被修改,但是未被提交的修改,可以查看差异性
$git log #查看修改历史
$git log --pretty=oneline #查看简单的修改历史
$git reset --hard HEAD^ #回退到上一个版本的命令
我们前面说过使用Git提交文件到版本库有两步:
TortoiseGit是一个开放的git版本控制系统的源客户端,支持Winxp/vista/win7/Win10,下载地址。
…or create a new repository on the command line
echo "# osgi_javaModel_t1" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/alex2chen/osgi_javaModel_t1.git
git push -u origin master
…or push an existing repository from the command line
git remote add origin https://github.com/alex2chen/osgi_javaModel_t1.git
git push -u origin master
…or import code from another repository
You can initialize this repository with code from a Subversion, Mercurial, or TFS project.
工作区:就是你在电脑上看到的目录,比如目录下git-test里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。
版本库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。
如果你是window系统,可参阅window7下同时使用github和gitlab 。