读前须知: 本篇章内容取自《Git 学习指南》 P1~P17,如需更多详细内容请购买正版书籍
下一章节:
优点 | 描述 |
---|---|
高性能 | 几乎所有的操作都无需进行网络访问,均可直接在本地执行 |
高效的工作方式 | 开发者可通过多个本地分支在不同任务之间进行快速切换 |
离线功能 | 开发者可以在没有服务器连接的情况下执行提交、创建分支、版本标签等操作,之后再将其上传服务器 |
灵活的开发进程 | 我们可以在团队和公司中为其他部门建立专用的版本库 |
备份作用 | 每个开发者都持有一份拥有完整历史版本的版本库副本 |
可维护性 | 对于那些难以对付的重构工作,可以将其成功传送给其原始版本之前,先在该版本库的副本上尝试一下 |
特型版本库 | 描述 |
---|---|
项目版本库 | 主要用于存储由“官方”创建并发行的版本 |
共享版本库 | 主要用于开发团队内人员之间的文件交换 |
工作流版本库 | 通常只用于填充那些代表工作流中某种特定进展状态的修改 |
派生版本库 | 主要用于从开发主线分离出某部分内容 |
版本库组件 | 版本库本质上就是一个高效的数据存储结构 |
---|---|
文件(blob) | 既包含了文本也包含了二进制数据,这些数据将不以文件名的形式被保留 |
目录(Tree) | 目录中保存的是与文件名相关联的内容,其中也会包含其他目录 |
版本(commit) | 每一个版本所定义的都是相应目录的某个可恢复的状态 |
对于所有的数据,他们都会被计算成一个十六进制散列值,这个散列值将会被用作相关对象的引用,以及日后恢复数据时所需的键值
优势 | 描述 |
---|---|
高性能 | 通过散列值来访问数据非常快 |
冗余度–释放存储空间 | 相同的文件内容只需要存储一次即可 |
分布式版本号 | 由于相关散列值是根据文件,作者和日期来计算的,所以版本也可以“离线”产生,不用担心将来因此而发生版本冲突 |
版本间的高效同步 | 当我们将某一提交从一个版本库传递给另一个版本库时,只需要传送那些目标版本库中不存在的对象即可。而正是通过散列值的帮助,才能更快地判断相关对象是否已经存在 |
数据完整性 | 由于散列值是根据数据的内容来计算的,所以我们可以随时通过Git来查看某一散列值是否与相关数据匹配,以检测该数据上可能的意外变化或恶意操作 |
自动重命名 | 被重命名的文件可以被自动检测到,因为根据该文件内容计算出的散列值并没有发生变。也正因为如此,Git中并没有专用的重命名命令,只需要移动命令即可 |
其他操作 | 描述 |
---|---|
移植分支 | 我们可以直接将某一分支中的提交转移到另一个版本库中 |
只传送特定修改 | 我们可以将某一分支中的某一次或某几次提交直接复制到另一个分支中(捡取处理) |
清理历史 | 我们可以对分支历史进行改造,排序和删除。有利于为该项目建立更好的历史文档(交互式重订) |
git config --global user.email "jieKaMi@gmail.com"
在F盘创建一个git文件夹,创建dev.txt和test.txt作为测试
$ cd /f/git-dev
$ git init
Initialized empty Git repository in F:/git-dev/.git/
b563b27: 散列值(该值取决于文件内容)
$ git add src.txt test.txt
$ git commit --message "first commit"
[master (root-commit) b563b27] first commit
2 files changed, 2 insertions(+)
create mode 100644 dev.txt
create mode 100644 test.txt
操作:
(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 ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: dev.txt
deleted: test.txt
Untracked files:
(use "git add ..." to include in what will be committed)
prod.txt
no changes added to commit (use "git add" and/or "git commit -a")
操作:
(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 ..." to unstage)
modified: dev.txt
new file: prod.txt
deleted: test.txt
$ git commit --message "second commit"
[master 8a08078] second commit
3 files changed, 2 insertions(+), 2 deletions(-)
create mode 100644 prod.txt
delete mode 100644 test.txt
log命令: 可用来显示项目的历史,所有提交都会按时间顺序被降序排列起来
$ git log
commit 8a08078e36778ae9506bf625054fb088ce708f59 (HEAD -> master)
Author: jieKaMi
Date: Mon Nov 20 23:33:03 2023 +0800
second commit
commit b563b27503fb3ac34624418666656ed5db7a855f
Author: jieKaMi
Date: Mon Nov 20 23:29:22 2023 +0800
first commit
$ git clone /f/git-dev /f/git-clone
Cloning into 'F:/git-clone'...
done.
操作:
(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 commit
1 file changed, 1 insertion(+), 1 deletion(-)
$ cd /f/git-clone/
$ git add prod.txt
$ git commit --message "four commit"
[master bf4f4fd] four commit
1 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-dev
8a08078..2febc9b master -> origin/master
Merge made by the 'recursive' strategy.
dev.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ git log --graph
操作:(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-forward
prod.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
操作:(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-bare
90d84a1..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-forward
dev.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)