一篇文章入门Git
Git前世今生
大家可能听说过CVS、SVN这些免费的版本控制系统。但是集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统虽然好用,但是是付费的。LInus(Linux的创始人)本来是使用BitKeeper来管理庞大的linux代码库,但是因为手下的人师徒**BitKeeper的协议,被BitMover公司逮住了,收回Linux社区的免费使用权。Linus因此花了两周时间自己用C写了一个分布式的版本控制系统,这就是Git的诞生。之后Linux系统的源码就由GIt管理了。08年,GitHub网站上线,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
集中式vs分布式
集中式版本控制系统,版本库是集中存放在*服务器的,,所以你在操作时,先从*服务器把最新的版本下载过来,再操作,然后再把操作好的推送给*服务器。所以这样就存在不少弊端。首先是必须要互联网才能工作,如果在局域网中,带宽够大,速度就够快,但是在互联网中,网速慢的话,根本无法满足现在的速度需求。同时安全性也不好,如果*处理器坏掉了,GG。
分布式版本控制系统,没有*服务器,所以工作的时候就不用联网了,安全性也得到保证。
linux下使用git
首先看看自己有没有装git
$ git
如果没装,linux会告诉你怎么安装,或者直接
$ sudo apt-get install git
接下来创建版本库
$ mkdir gitrep
$ cd gitrep
$ pwd //pwd命令用于显示当前目录。
$ git init //把这个目录变成Git可以管理的仓库
Initialized empty Git repository in /home/tbs/test/gitrep/.git/
$ touch readme.txt
$ gedit readme.txt
$ git add readme.txt //告诉git把文件添加到仓库
$ git config --global user,email "aaa@qq.com" //输入配置信息
$ git config --global user.name "youname" //输入配置信息
$ git commit -m "write a readme file" //输入本次提交的说明,可以从历史记录中找到改动记录 一次可以提交多个文件
//接下来我们修改一下txt文件试试
//把文件内容随便改改
$ gedit readme.txt
$ git status //查看现在的状况,发现现在有更改但是没有提交
$ git diff //查看更改了个啥
$ git add readme.txt
$ git commit -m "new change"
工作区和暂存区
工作区:working directory 就是在电脑中能看到的目录
版本库:repository 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,最重要的就是称为stage(index)的暂存区,还有自动创建的第一个分之master,以及指向master的一个指针HEAD
所以我们上面的操作,就可以解释清楚了。git add就是把文件添加到暂存区。git commit就是把暂存区的所有内容提交到当前的分支里面去。
修改
版本回退
$ git log //告诉版本的历史记录
//接下来会退到上一个版本
$ git reset --hard HEAD^ //HEAD表示当前版本,HEAD^表示上一个版本,一次类推,HEAD~100表示上一百个版本。或者直接输入commit_id
撤销修改
$ git checkout -- readme.txt
//这句话的意思,把readme.txt文件在工作区的修改全部撤销,有两种情况:
//1.是readme.txt自动修改还没有被放到暂存区,现在,撤销修改就回到版本库一模一样的状态。
//2.是readme.txt已经添加到暂存区后,又做了修改,现在撤销修改就回到添加到暂存区后的状态。
$ git reset HEAD readme.txt //可以把暂存区的修改撤销掉unstage,重新放回工作区。
删除
$ rm test.txt //删除某个文件
//确实要删除这个文件
$ git rm test.txt //删除该文件
$ git commit -m "remove test.txt"
//删错了
$ git checkout -- test.txt //因为在版本库里还有,所以可以很轻松的把误删的文件回复到最新的版本中去
//git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以一键还原。
远程仓库
由于本地Git仓库和Github仓库之间的传输是用过SSH加密的。所以需要一点设置:
第一步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看有没有id_rsa和id_rsa.pub这两个文件,如果没有
$ ssh-****** -t rsa -C "aaa@qq.com"
//在用户主目录中找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的密匙对。前一个是私钥,后一个是公钥。
第二步:登录github,打开account setting,“SSH Keys”页面,然后,点“Add SSH Key”,填上任意title,在Key文本框中粘贴id_rsa.pub文件的内容
添加远程库
之后在自己的github账号下创建一个库。
然后我们就可以把本地库关联到github上了。首先进入我们的本地库的目录下。之后建立远程连接。
$ git remote add origin aaa@qq.com:yourusername/test.git //github.com不能丢
$ git push -u origin master //把本地库的所有文件关联到github上
克隆远程库
对已经存在github上的库进行克隆,我们可以克隆到本地。
$ git clone aaa@qq.com:yourusername/test.git
分支管理
创建和合并分支
步骤如下:
首先创建dev分支,然后切换到dev分支
$ git checkout -b dev //checkout + -b表示创建并切换
$ git branch //查看当前分支
//之后对里面的文件做一些修改
$ git add readme.txt
$git commit -m "branch test"
//dev分支修改完毕,切回master
$ git checkout master
//然后把dev分支的成果合并到master分支上
$ git merge dev //用于合并指定分支到当前分支。
//合并完成后,可以删除dev分支
$ git branch -d dev
因为创建合并删除分支非常块,而且更安全,所以推荐使用分支完成某个任务,合并后再删掉分支。
//还有其他的命令可以完成这个切换行为
$ git switch -c dev //创建并切换到dev分支
$ git switch master //直接切换到已经有的master分支
分支管理策略
通常,合并分支的时候,git会用fast forward,但是这种模式删掉分支后,会丢失分支信息。
$ git switch -c dev //创建分支
$ git add readme.txt
$ git commit -m "new change"
$ git switch master //回到主干
$ git merge --no-ff -m "merge without delete" dev //禁用fast forward
//我们查看分支历史
$ git log //分支就如下图所示
所以我们有分支策略:最好不要在master上干活,在dev上干活就好。
bug分支
Git提供了一个stash功能,可以把当前工作现场储藏起来,等以后恢复后继续工作。
$ git stash //把自己的工作进程保存下来,后面可以进行bug的修改
//修改完成后
$ git switch dev
$ git status
$ git stash list //Git把stash存在某个地方了,需要恢复
$ git stash pop //恢复的同事把stash内容也删掉了
你在主分支上修改的bug,在这时并没有同样在dev上修改,所以我们需要把对应bug修复的提交到dev分支
$ git branch
$ git cherry-pick 4c8053e2 //bug对应的commit_id
自定义Git
忽略特殊文件
.gitignore文件,把想要忽略的文件名填进去,Git就会自动忽略这些文件。忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
上一篇: Java设计模式(22)之中介者模式
下一篇: 状态模式——java设计模式(二十二)