1、版本管理的演变
VCS出现之前
- 用目录拷贝区别不同版本
- 公共文件容易被覆盖
- 成员沟通成本高,代码集成效率低下
VCS集中式版本管理系统
- 有集中的版本管理服务器
- 具备文件版本管理和分支管理能力
- 集成效率有明显的提高
- 客户端必须时刻连接服务器
VCS分布式版本管理系统
- 服务端和客户端都有完整的版本库
- 脱离服务端、客户端照样可以管理版本
- 查看历史和版本比较等多数操作都不需要访问服务器,比集中式VCS更能提高版本管理效率
2、GIT的特点
- 最优的存储能力、非凡的性能、开源的、很容易做备份、支持离线操作、很容易制定工作流程
- 系列产品git、github、gitlab
- https://git-scm.com/downloads
git的使用
下载安装
https://git-scm.com/downloads
git --version
配置
git config --global user.name 'your_name'
git config --global user.email 'your_email@domain.com'
config 的三个作用域
git config --local ##缺省等同与local,只对某个仓库有效
git config --global ##对当前用户所有仓库有效
git config --system ##对系统所有登录用户有效
查看config的配置,加–list
git config --list
git config --list --local
git config --list --global
git config --list --system
建GIT仓库
- 把已有项目纳入到GIT管理
cd 项目代码所在路径
git init
- 新建项目直接使用git管理
$ git init your_project #会在当前路径下创建和项目名称同名的文件夹
$ cd your_project
$ touch readme.MD
$ git commit -m "add readme"
## 会给出提示信息
On branch master
Initial commit
Untracked files:
readme.MD
nothing added to commit but untracked files present ##暂存区没有暂存文件,列出没有被管理的文件
$ git add readme.MD #将readme文件加入暂存区
$ git status #查看暂存区状态
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: readme.MD #有新修改的文件提交到暂存区了
(base)
$ git commit -m "add readme"
[master (root-commit) 35185ab] add readme #master分支加入了readme文件,1文件个提交,0行代码加入,0行代码删除
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 readme.MD
(base)
$ git log #查看历史提交记录
commit 35185ab774e47269730759ef6d721972f6676d98 (HEAD -> master) #commit 的id
Author: llvvlv00 <llvvlv00@qq.com> #作者
Date: Wed May 31 23:31:58 2023 +0800
add readme
(END)
往仓库里添加文件
文件重命名在git里的简便方法
$ git mv readme readme.md
$ git status #可以看到git识别到了文件重命名
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
renamed: readme -> readme.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
.history/
(base)
$ git log #查看历史
git log 查看版本历史
$ git log --oneline #简洁的查看版本历史
06ae45d (HEAD -> master) Move readme to readme.md
1525d12 rename files
23e9483 Add refering projects
c2d5ebf add js
50e6f27 add styles
35185ab add readme
$ git log -n4 --oneline #简洁的查看最近4次的版本历史
$ git log -n2 #查看最近2次的历史版本
commit 06ae45dfe11631a3aa073588815fd895fe89c8fc (HEAD -> master)
Author: llvvlv00 <llvvlv00@qq.com>
Date: Thu Jun 1 03:52:42 2023 +0800
Move readme to readme.md
commit 1525d127cfaa39ad0ab089389c6bcad3cbd6ea0c
Author: llvvlv00 <llvvlv00@qq.com>
Date: Thu Jun 1 03:46:34 2023 +0800
rename files
$ git branch -v #查看所有分支
$ git checkout -b temp 23e9483 #指定版本创建分支
修改readme文件
$ git add readme
$ git commit -m"Add test"
$ git branch -av #查看所有分支
$ git log #查看到当前分支是temp
$ git log --all #查看所有分支版本信息
$ git log --all --graph #查看图形化的历史版本演进
* commit a81085d6870a7d5a8dc3414b78e656d2fe7ee467 (HEAD -> temp)
| Author: llvvlv00 <llvvlv00@qq.com>
| Date: Thu Jun 1 04:02:32 2023 +0800
|
| Add test
|
| * commit 06ae45dfe11631a3aa073588815fd895fe89c8fc (master)
| | Author: llvvlv00 <llvvlv00@qq.com>
| | Date: Thu Jun 1 03:52:42 2023 +0800
| |
| | Move readme to readme.md
| |
| * commit 1525d127cfaa39ad0ab089389c6bcad3cbd6ea0c
|/ Author: llvvlv00 <llvvlv00@qq.com>
| Date: Thu Jun 1 03:46:34 2023 +0800
|
| rename files
|
* commit 23e94839af2a35b235ec50306b47d0d9034ce8ba
| Author: llvvlv00 <llvvlv00@qq.com>
| Date: Thu Jun 1 03:37:56 2023 +0800
|
| Add refering projects
|
* commit c2d5ebf3bc09773e7167013780e1903b66adf50d
| Author: llvvlv00 <llvvlv00@qq.com>
| Date: Thu Jun 1 03:35:17 2023 +0800
|
| add js
|
* commit 50e6f274713dbe36e49baa6a5c6a361979ab187f
| Author: llvvlv00 <llvvlv00@qq.com>
| Date: Thu Jun 1 03:33:26 2023 +0800
|
| add styles
|
* commit 35185ab774e47269730759ef6d721972f6676d98
Author: llvvlv00 <llvvlv00@qq.com>
Date: Wed May 31 23:31:58 2023 +0800
add readme
$ git log --oneline --all -n4 --graph #简洁的查看最近4次的图形化的版本历史
$ git help --web log #web方式查看log命令的帮助参数
gitk 图形化看版本历史
$ gitk
View上可以定制化查看版本演进历史
3、git原理探究
1、深入到.git里面
$ cd .git
$ ll
total 48
-rw-r--r-- 1 llvvlv00 staff 9B 6 1 04:02 COMMIT_EDITMSG
-rw-r--r-- 1 llvvlv00 staff 21B 6 1 04:00 HEAD
-rw-r--r-- 1 llvvlv00 staff 41B 6 1 03:47 ORIG_HEAD
-rw-r--r-- 1 llvvlv00 staff 186B 5 31 23:23 config
-rw-r--r-- 1 llvvlv00 staff 73B 5 31 23:22 description
drwxr-xr-x 14 llvvlv00 staff 448B 5 31 23:22 hooks
-rw-r--r-- 1 llvvlv00 staff 626B 6 1 04:02 index
drwxr-xr-x 3 llvvlv00 staff 96B 5 31 23:22 info
drwxr-xr-x 4 llvvlv00 staff 128B 5 31 23:31 logs
drwxr-xr-x 30 llvvlv00 staff 960B 6 1 04:02 objects
drwxr-xr-x 4 llvvlv00 staff 128B 5 31 23:22 refs
$ cat HEAD #记录了当前工作环境的分支指向,如果切换到master分支,这里的内容也会改变
ref: refs/heads/temp
$ cat config #这里是当前项目的git配置信息,修改这里和执行 git config --local 是一样的
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
name = llvvlv00
email = llvvlv00@qq.com
$ cd refs && ll
drwxr-xr-x 4 llvvlv00 staff 128B 6 1 04:02 heads #这里存放的是版本分支, 独立的开发空间
drwxr-xr-x 2 llvvlv00 staff 64B 5 31 23:22 tags #这里是打包标签,也叫里程碑。项目进展到一定程度,可以打包标签
$ cd heads && ll
$ cat temp
a81085d6870a7d5a8dc3414b78e656d2fe7ee467 ##存放的是版本hash值,指的是temp指向 a81085d687 这个版本
$ git cat-file -t a81085d6870a7d5a8dc3414b78e656d2fe7ee467 #查看hash值的类型,它是一个commit
commit