版本控制
- 集中式版本控制工具:CVS、SVN、VSS等
- 分布式版本控制工具:Git、Mercurial、Bazaar、Darcs等
git相关
结构
- 工作区:写代码的地方
- 暂存区:临时存储
- 本地库:历史版本
代码托管中心
- 用来维护远程库,在局域网环境下使用GitLab 服务器;外网环境下,使用GitHub和码云。
容易混淆的命令
#版本回退
$ git reset --hard <commit_id>
#丢弃暂存区上的修改,将它放回到工作区 HEAD
$ git reset HEAD <file>
#撤销工作区修改 。直接使用git checkout -- file撤销工作区修改
$ git checkout -- file
#创建并切换分支
$ git checkout -b <name>
$ git switch -c <name>
#切换分支
$ git checkout <name>
$ git switch <name>
#提交历史 简洁版
$ git log --pretty=oneline
$ git log --oneline
#记录每一次命令
$ git reflog
#前进和后退
#1、根据索引值来回退
$ git reset --hard dea36(索引)
$ git reset --hard [局部索引值]
#2、使用^符号:只能后退 一个^表示后退一步,n 个表示后退 n 步 异或
$ git reset --hard HEAD^
#3、使用~符号:只能后退 表示后退 n 步 波浪线
$ git reset --hard HEAD~n
#比较文件差异
#1.git diff [文件名] 将工作区中的文件和暂存区进行比较
$ git diff good.txt
#2.git diff [本地库中历史版本] [文件名] 将工作区中的文件和本地库历史记录比较
$ git diff HEAD^ good.txt
reset 命令的三个参数对比
- soft 参数 : 仅仅在本地库移动 HEAD 指针; (暂存区和工作区未重置,需要commit)
- mixed 参数 : 在本地库移动 HEAD 指针 、重置暂存区;(工作区未重置,需要add、commit)
- hard 参数 : 在本地库移动 HEAD 指针 、重置暂存区 、重置工作区
#goog.txt文件,目前文件中内容如下: e7ab238版本没有ggggg这行
bbbbb
eeeee
fffff
ggggg
远程仓库命令
#查看当前所有远程地址别名
$ git remote -v
#创建远程库地址 git remote add [别名] [远程地址]
$ git remote add [别名origin] [远程地址]
#推送
$ git push [别名] [分支名]
#克隆 :
#1.完整的把远程库下载到本地2.创建 origin 远程地址别名 (git remote -v查看远程库别名)3.初始化本地库(就是:git init)
$ git clone [远程地址]
#pull是fetch(抓取)和merge(合并)的合并
$ git fetch [远程库地址别名origin] [远程分支名master]
$ git merge [远程库地址别名origin/master远程分支名]
#上面两行等价于
$ git pull [远程库地址别名] [远程分支名]
git基本原理
集中式版本控制工具的文件管理机制
-
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
-
每个版本之下只记录该文件的变化部分,最新版本要得到该文件只需将之前的版本的各个变化进行汇总之后,便可以得到该文件。
Git 的文件管理机制
-
Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改, Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的 工作方式可以称之为快照流。
-
git文件管理的细节
-
每次提交时,Git会生成一个“提交对象” (存储每个文件对应的hash值),本次提交时每个修改的文件会生成一个hash值,所有修改的文件会组合为一个tree,该tree中会存储着修改的文件以及该文件对应的ha sh值,并且自己也会生成一个hash值。提交对象中会有作者、日期、提交日志以及该tree的信息。所以提交对象通过tree可以知道本次所有的修改。提交对象也会生成一个hash值,用于记录本次的提交。
-
提交对象及其父对象形成的链条,每次提交的提交对象可以看作是一个快照,下一个快照中存储着上一个快照的hash值,即父对象。
-
分支管理机制
-
分支的创建(就是新建一个指针)
-
分支的切换 (HEAD指向发生变化)
-
HEAD指向切换的分支时提交了内容,版本会向前一步
-
切换回 master,HEAD指针指向master
-
HEAD指向master时 提交了数据,向前一个版本。
-
-