Git
什么是版本控制?
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。你可以把一个版本控制系统( Version Control System 缩写VCS)理解为一个“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照(称之 为“版本”)时,版本控制系统可以显示出当前版本与上一个版本之间的所有改动的细节。
为什么要使用版本控制系统?
1.协同合作
2.存储版本
3.恢复之前的版本
4.了解文件更改之前和之后的变化
Git是什么?
Git是目前世界上最先进的分布式版本控制系统。
分布式版本控制系统 VS 集中式版本控制系统
集中式版本控制系统(Centralized Version Control Systems,简称 CVCS)有一个很大的毛病(在没介绍之前先黑它一波)就是必须联网才能工作,而一旦遇到网不好的情况,就直接哭唧唧了。CVCS的版本库是集中存放在中央服务器的,而协同工作的人们都通过客户端连到中央服务器,取出最新的文件或者提交和更新。那么问题就来了,如果中央服务器所在的磁盘发生损坏,又没有做恰当备份,结果没有一丝悬念你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照,这就不是哭唧唧能解决的了。
分布式版本控制系统(Distributed Version Control System 缩写DVCS)不存在中央服务器,而客户端也并不只是提取最新版本的文件快照,而是把代码仓库完整地clone下来,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了。而且因为每个人电脑里都有完整的版本库,即使某一个人的电脑坏掉了,没有关系,不慌!我们只需要随便从其他人那里复制一个就可以了。那么我们在实际使用DVCS的时候,其实很少在几个人之间的电脑上推送版本库的修改,因为很不方便,可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。这个时候呢我们也需要一个东西去充当“中央服务器”(例如:GitHub,码云,GitLub),但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
分布式版本控制系统除了Git以及促使Git诞生的BitKeeper外,还有类似Git的Mercurial和Bazaar等。这些分布式版本控制系统各有特点,但最快、最简单也最流行的依然是Git!
Git的特点?
Git和其他版本控制系统的一个不同之处就是有暂存区的概念。下面是一些名词解释。
工作区:就是你在电脑里能看到的目录。
版本库:在可以通过Git管理的工作区有一个隐藏的.git目录,这个虽然在工作区中,但是不算工作区,而是Git的版本库。而Git的版本库中存了很多东西,其中最重要的就是叫做stage的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针 HEAD
。
Git的优势和特点不止上面说的那些,之后我们还会看到Git极其强大的分支管理功能。下面我们就正式开始。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
创建版本库
如果你现在正在着手开发一个项目,但是这个项目还没有被纳入版本控制系统的管理中,那就让我们从这个项目开始建立一个Git项目吧~
那把大象放进冰箱只需要三步:第一步打开冰箱门。第二步把大象放进去。第三部关上冰箱门。
同样的,新建一个Git项目也只需要三步
第一步:在这个文件下打开Git Bash Here。
第二步:输入
git init
第三步:回车。
哈哈。这样一个仓库就创建好了。
当然了,如果 你要得到一个存放在远程服务器并且被纳入版本控制系统中的项目,你只需要知道项目的远程仓库的url地址就可以啦~但是呢,url地址也是有区别的。
下面简单介绍一下。
1.HTTP地址。使用 HTTP 地址克隆项目对初学者来说会比较方便,复制HTTP URL 然后到命令行里面直接用 git clone 命令克隆到本地就好了,在执行 clone 命令之后需要输入你的GitLub的帐号和密码。
2.SSH地址。在clone之前(无论SSH URL是以 “ssh://” 开头的或者是一个简易格式的“user@server...”),你都必须要通过一个 “SSH 公钥(SSH Public Key)” 的认证。虽然它需要你做一点点额外的设置工作(生成SHH公钥),但是这是一个被广泛使用的安全有效的模式。
好,回到正题。
从远程仓库clone项目的命令
git clone <仓库地址>
clone完成就可以对项目进行操作啦!!!
我们把文件稍作修改,然后准备把文件添加到版本库中。
把文件添加到版本库
把单个文件添加到仓库(可多次执行,添加多个文件)
git add <文件名>
添加全部文件 (注:这样提交会把所有文件都提交上去,包括一些隐藏文件,一般不建议这么做。那是不是说我们只能一个一个文件的添加呢?当然不是了,我们可以在项目的根目录下建一个.gitignore文件,将不提交的文件写到里面。就ok啦。注意:.gitignore文件和其他文件一样是处在版本控制之下的,再push的时候同样会被推送到远程)
git add .
把文件提交到本地仓库
git commit -m '提交说明'
查看提交历史,可以看到我们每次向本地仓库提交的历史,包括内容更改,版本号,体检说明等信息。
git log
查看工作区的状态。
git status
版本回退。可以退到我们想退回的任何版本。
git reset --hard HEAD^ / git reset --hard HEAD~n / git reset --hard 版本号
查看输入的命令历史。
git reflog
查看工作区和版本库中最新版本的区别
git diff HEAD -- <文件名>
撤销更改
丢弃工作区的修改(没执行add之前)
git checkout -- <文件名>
撤销暂存区的修改,重新回到工作区(add之后,commit之前)
git reset HEAD <文件名>
删除版本库中的文件,执行
git rm <文件名>
再commit 提交到仓库
分支管理
分支在我们的过程中有很大的作用。
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
在版本回退里,你我们知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。
查看分支
git branch
创建分支
git branch <分支名>
切换分支
git checkout <分支名>
创建并切换分支
git checkout -b <分支名>
合并指定分支到当前分支
git merge <分支名>
删除分支
git branch -d <分支名>
查看分支合并情况
git log --graph
储藏工作现场
什么时候我们需要这样做?我有一段代码,不能提交到版本库,但是我还要切换到别的分支看一眼或者是要把远程的代码拉取下来,这个时候我们就是可以把工作区或者暂存区的代码储藏起来,使工作区回到清空的状态。
将当前工作现场”储藏“起来
git stash
恢复工作现场。恢复最近一次储藏起来的代码。(储藏之前在暂存区的代码,恢复之后会回到工作区)
git stash apply
查看stash内容。(全部的储藏列表都可以看见)
恢复指定的stash内容
恢复工作现场的同时删除stash内容
删除stash内容
git stash drop
删除全部stash内容
git stash clear
远程仓库
查看远程库的信息
推送分支内容
创建远程分支
将本地分支和远程分支连接起来
标签管理
创建标签
查看标签
给指定的commit打标签
查看标签信息
创建带有说明的标签
删除标签
推送标签到远程
删除推送到远程的标签