版本控制系统
版本控制系统需要有以下功能:版本控制、主动提交、维护在中央仓库。
- 版本控制
在文件的修改过程中记录修改历史,便于随时撤销回之前的修改操作。
可以理解成用编辑器编辑文本一样,编辑器保存了我们的编辑历史。同时拥有撤销功能,使用撤销可以回到之前的状态。
-
主动提交
VCS和文本编辑器的区别在于,VCS的历史记录是我们主动提交的,而编辑器是自动保存历史的。如果采用自动保存历史,假如我们要把项目代码回溯到几个月前,那么改动历史非常频繁且无章可循。
-
中央仓库
在开发中经常都是多人协作,因此我们需要一个多用户共享的中央仓库。所有人的改动上传到这里,所有人也能看到别人的改动。
集中式(cvs/svn)VS分布式(git)
区别:
- 集中式版本控制系统:最大的毛病就是必须联网才能工作,版本库是集中存放在中央服务器的
- 分布式版本控制系统:
- 分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库(本地仓库),分布式版本控制系统的安全性要高很多
常见基本操作
1.添加远程库
- 要关联一个远程库git remote add origin git@server-name:path/repo-name.git(加粗部分为自己的远程程库)
- 关联后git push -u origin master第一次推送master分支的所有内容;
- 此后git push origin master (注意不用 -u)
2.从远程库克隆
- 上次我们讲了先有本地库,后有远程库的时候,如何关联远程库。
- 现在,假设我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆。
- git clone XXXX
3.理解工作区和暂存区
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
- 工作区:就是你在电脑里能看到的目录
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit (commit 为“保存一个快照”,这个快照在Git中被称为commit) 提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
4.版本回退:git reset HEAD ^
- git log
命令显示从最近到最远的提交日志
git log -p可以查看每个commit的改动细节(到改动文件的每一行)
git log --stat查看简要统计(哪几个文件改动了)
git show 指定commit 指定文件名查看指定commit的指定文件改动细节
- git reflog
想恢复到新版本怎么办?找不到新版本的commit id怎么办?Git提供了一个命令git reflog用来记录你的每一次命令.
- git reset
回退到上一个版本,就可以使用git reset --hard HEAD^命令(上一个版本就是HEAD^ ,上上一个版本就是HEAD^^)
注意:不再被引用直接或间接指向的 commits 会在一定时间后被 Git 回收,所以使用 reflog 来找回被删除的 branch 的操作一定要及时,不然有可能会由于 commit 被回收而再也找不回来。
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候移动指针
git reset --hard HEAD^ :重置stage区和工作目录
git reset --soft HEAD^ : 你的stage区和工作目录里的内容会被保留,并把重置 HEAD 所带来的新的差异放进暂存区 。repository 中的內容的更变需要与 reset 目标节点一致,因此原始节点与reset节点之间的差异变更集合会存在与index暂存区中(Staged files),所以我们可以直接执行 git commit 將 index暂存区中的內容提交至 repository 中。当我们想合并「当前节点」与「reset目标节点」之间不具太大意义的 commit 记录(可能是阶段性地频繁提交)時,可以考虑使用 Soft Res