Git 学习指南 第一部分(一)基础概念及入门
- 一. 基本概念
- 1.1 分布式版本控制
- 1.1.1 集中式版本控制系统
- 1.1.2 分布式版本控制系统
- 1.1.3 特型版本库
- 1.2 版本库,分布式工作的基础所在
- 1.2.1 散列值
- 1.3 分支的创建与合并
- 1.3.1 分支的其他操作
- 二. 入门
- 2.1 准备Git环境
- 2.2 创建版本库
- 2.2.1 初始化版本库
- 2.2.2 提交文件
- 2.2.3 检查状态
- 2.2.4 提交修改
- 2.2.5 显示历史
- 2.3 Git的协作功能
- 2.3.1 克隆版本库
- 2.3.2 从另一版本库中获取修改
- 2.3.3 从任意版本库中取回修改
- 2.3.4 创建共享版本库并应用
读前须知: 本篇章内容取自《Git 学习指南》 P1~P17,如需更多详细内容请购买正版书籍
下一章节:
一. 基本概念
1.1 分布式版本控制
1.1.1 集中式版本控制系统
1.1.2 分布式版本控制系统
优点 | 描述 |
---|---|
高性能 | 几乎所有的操作都无需进行网络访问,均可直接在本地执行 |
高效的工作方式 | 开发者可通过多个本地分支在不同任务之间进行快速切换 |
离线功能 | 开发者可以在没有服务器连接的情况下执行提交、创建分支、版本标签等操作,之后再将其上传服务器 |
灵活的开发进程 | 我们可以在团队和公司中为其他部门建立专用的版本库 |
备份作用 | 每个开发者都持有一份拥有完整历史版本的版本库副本 |
可维护性 | 对于那些难以对付的重构工作,可以将其成功传送给其原始版本之前,先在该版本库的副本上尝试一下 |
1.1.3 特型版本库
特型版本库 | 描述 |
---|---|
项目版本库 | 主要用于存储由“官方”创建并发行的版本 |
共享版本库 | 主要用于开发团队内人员之间的文件交换 |
工作流版本库 | 通常只用于填充那些代表工作流中某种特定进展状态的修改 |
派生版本库 | 主要用于从开发主线分离出某部分内容 |
1.2 版本库,分布式工作的基础所在
版本库组件 | 版本库本质上就是一个高效的数据存储结构 |
---|---|
文件(blob) | 既包含了文本也包含了二进制数据,这些数据将不以文件名的形式被保留 |
目录(Tree) | 目录中保存的是与文件名相关联的内容,其中也会包含其他目录 |
版本(commit) | 每一个版本所定义的都是相应目录的某个可恢复的状态 |
1.2.1 散列值
对于所有的数据,他们都会被计算成一个十六进制散列值,这个散列值将会被用作相关对象的引用,以及日后恢复数据时所需的键值
优势 | 描述 |
---|---|
高性能 | 通过散列值来访问数据非常快 |
冗余度–释放存储空间 | 相同的文件内容只需要存储一次即可 |
分布式版本号 | 由于相关散列值是根据文件,作者和日期来计算的,所以版本也可以“离线”产生,不用担心将来因此而发生版本冲突 |
版本间的高效同步 | 当我们将某一提交从一个版本库传递给另一个版本库时,只需要传送那些目标版本库中不存在的对象即可。而正是通过散列值的帮助,才能更快地判断相关对象是否已经存在 |
数据完整性 | 由于散列值是根据数据的内容来计算的,所以我们可以随时通过Git来查看某一散列值是否与相关数据匹配,以检测该数据上可能的意外变化或恶意操作 |
自动重命名 | 被重命名的文件可以被自动检测到,因为根据该文件内容计算出的散列值并没有发生变。也正因为如此,Git中并没有专用的重命名命令,只需要移动命令即可 |
1.3 分支的创建与合并
1.3.1 分支的其他操作
其他操作 | 描述 |
---|---|
移植分支 | 我们可以直接将某一分支中的提交转移到另一个版本库中 |
只传送特定修改 | 我们可以将某一分支中的某一次或某几次提交直接复制到另一个分支中(捡取处理) |
清理历史 | 我们可以对分支历史进行改造,排序和删除。有利于为该项目建立更好的历史文档(交互式重订) |
二. 入门
2.1 准备Git环境
git config --global user.email "jieKaMi@gmail.com"
2.2 创建版本库
2.2.1 初始化版本库
在F盘创建一个git文件夹,创建dev.txt和test.txt作为测试
$ cd /f/git-dev
$ git init
Initialized empty Git repository in F:/git-dev/.git/
2.2.2 提交文件
b563b27: 散列值(该值取决于文件内容)
$ git add src.txt test.txt
$ git commit --message "first commit"
[master (root-commit) b563b27] first commit2 files changed, 2 insertions(+)create mode 100644 dev.txtcreate mode 100644 test.txt
2.2.3 检查状态
操作:
(1)修改dev.txt
(2)删除test.txt
(3)新增prod.txt
更多细节: git diff src.txt
$ git status
On branch master
Changes not staged for commit:(use "git add/rm <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified: dev.txtdeleted: test.txtUntracked files:(use "git add <file>..." to include in what will be committed)prod.txtno changes added to commit (use "git add" and/or "git commit -a")
2.2.4 提交修改
操作:
(1)添加dev.txt和prod.txt到git上 ,移除git上的test.txt
(2)再次调用status
(3)使用commit提交
$ git add dev.txt prod.txt
$ git rm test.txt
rm 'test.txt'$ git status
On branch master
Changes to be committed:(use "git reset HEAD <file>..." to unstage)modified: dev.txtnew file: prod.txtdeleted: test.txt$ git commit --message "second commit"
[master 8a08078] second commit3 files changed, 2 insertions(+), 2 deletions(-)create mode 100644 prod.txtdelete mode 100644 test.txt
2.2.5 显示历史
log命令: 可用来显示项目的历史,所有提交都会按时间顺序被降序排列起来
$ git log
commit 8a08078e36778ae9506bf625054fb088ce708f59 (HEAD -> master)
Author: jieKaMi <l>
Date: Mon Nov 20 23:33:03 2023 +0800second commitcommit b563b27503fb3ac34624418666656ed5db7a855f
Author: jieKaMi <l>
Date: Mon Nov 20 23:29:22 2023 +0800first commit
2.3 Git的协作功能
2.3.1 克隆版本库
$ git clone /f/git-dev /f/git-clone
Cloning into 'F:/git-clone'...
done.
2.3.2 从另一版本库中获取修改
操作:
(1)修改dev.txt并在原版本库中提交
(2)修改prod.txt并在克隆版本库中提交
(3)在克隆库中pull一下
(4)可以在克隆库git log --graph查看记录
$ cd /f/git-dev/
$ git add dev.txt
$ git commit --message "three commit"
[master 2febc9b] three commit1 file changed, 1 insertion(+), 1 deletion(-)$ cd /f/git-clone/
$ git add prod.txt
$ git commit --message "four commit"
[master bf4f4fd] four commit1 file changed, 1 insertion(+), 1 deletion(-)$ git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From F:/git-dev8a08078..2febc9b master -> origin/master
Merge made by the 'recursive' strategy.dev.txt | 2 +-1 file changed, 1 insertion(+), 1 deletion(-)$ git log --graph
2.3.3 从任意版本库中取回修改
操作:(1)回到原版本库 (2)从克隆库中pull修改操作
$ cd /f/git-dev
$ git pull /f/git-clone master
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (5/5), done.
From F:/git-clone* branch master -> FETCH_HEAD
Updating 2febc9b..90d84a1
Fast-forwardprod.txt | 2 +-1 file changed, 1 insertion(+), 1 deletion(-)
2.3.4 创建共享版本库并应用
操作:(1)创建一个裸版本库 (2)修改原版本库dev.txt并提交 (3)向共享版本库使用push命令 (4)从共享库中同步到克隆库
裸版本库: 通常可被用来充当开发者们传递提交命令的汇聚点,以便其他人可从中拉回他们所做的修改
$ git clone --bare /f/git-dev /f/git-bare
Cloning into bare repository 'F:/git-bare'...
done.$ cd /f/git-dev/
$ git add dev.txt
$ git commit --message "five commit"$ git push /f/git-bare master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 255 bytes | 255.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To F:/git-bare90d84a1..600c3c3 master -> master$ cd /f/git-clone
$ git pull /f/git-bare master
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (6/6), done.
From F:/git-bare* branch master -> FETCH_HEAD
Updating 90d84a1..3d681ec
Fast-forwarddev.txt | 2 +-1 file changed, 1 insertion(+), 1 deletion(-)