目录
一、版本控制器
所谓的版本控制器,就是能让你了解到每一个文件的修改历史。相应的,在企业级开发中,用来记录一个工程的每一次改动和管理版本迭代,同时方便多人协作开发。
git就是一种版本控制器,它还有一种特点,就是分布式。
需要注意的是,所有的版本控制器,只能跟踪文本文件的改动,比如TXT、网页、程序源代码。版本控制器可以告诉你当前文件的每次改动,比如在第5行加入了字符串"Linux",删除了第10行。
而图片、视频等这些二进制文件,虽然也能由版本控制器管理,但是无法跟踪其变动,只能把文件的每次变化记录下来,比如图片大小从100kb变到了150kb,但是具体图片内容,版本控制器无从得知。
1.安装git
- centos
sudo yum -y install git
查看安装的git的版本
git --version
- ubuntu
sudo apt-get install git -y
2.创建git本地仓库
在你的电脑上,新建一个文件夹,我们要对该目录下的所有文件进行版本控制,那么这个文件目录被称为仓库(本地仓库)。
进入这个目录后,使用下面这条命令创建仓库
git init
创建成功后,该目录下生成一个隐藏目录 ,该目录是
用来跟踪管理仓库的,切记不要改动该目录下的文件。
3.配置git
git config --global user.name "用户名(自填)"
git config --global user.email "绑定的邮箱"
其中, 是一个选项,使用该选项,表示当前这台机器的所有
仓库都使用这个配置。如果你希望在不同仓库中使用不同的用户名和邮箱,则无需使用
选项,但是要注意,执行命令时,当前路径必须是仓库路径。
- 查看配置的命令
git config -l
- 删除配置的命令
git config --global --unset user.name
git config --global --unset user.email
二、git操作(1)
1.工作区、暂存区、版本库
现在要纠正一下原来对“仓库”的解释,严格来讲,我们所创建的文件目录并不是 仓库。
在这个文件目录下,去掉 文件目录,其他文件目录均称为工作区,在工作区创建我们要版本控制的代码文件。
而所在的文件夹称为版本库(repository),即真正意义上的本地仓库。
在 目录下,有一个文件为
,这是一个索引文件,该文件内容是一个目录树,这个文件也被称为暂存区(stage)。
- 图中左侧为工作区,右侧为版本库。版本库中存有很多东西,其中最为重要的就是暂存区(stage)。
- 在创建
版本库的同时,git为我们自动创建唯一的一个master分支,以及指向master分指的HEAD指针。
- 工作区的一次修改(包括添加文件、删除文件、修改文件)在执行 git add 命令后,这条记录会被记入到暂存区,暂存区的目录树索引会更新。
- 当执行提交操作 git commit,master分支作出相应的更新,这才是真正意义上的暂存区的目录树写入到版本库中。
- 值得一提的是,每一次add记录,都对应着objects目录下的一个新git对象。
- 同时,不难看出来,在工作区新创建的文件,不能称为向版本库中新增文件,而是要经过添加命名git add和提交命令git commit 才能将文件添加到仓库进行管理。
2.添加文件
在包含
的目录,即工作区,新增一个文件,使用git add将文件添加到暂存区。
- 添加一个或多个文件到暂存区:
git add [file1] [file2] ···
- 添加指定目录到暂存区,包括子目录:
git add [dir]
- 添加当前目录下的所有改动到暂存区:
git add .
再执行 git commit 命令将暂存区内容添加到本地仓库:
- 提交暂存区全部内容到本地仓库:
git commit -m "提交信息"
- 提交暂存区的指定文件到本地仓库:
git commit [file1] [file2] ··· -m "提交信息"
注意,git commit通常都要使用 -m 选项,后面紧跟描述本次提交的信息,该部分绝对不要省略,并且要认真描述,用来记录每一个修改的细节,每一次提交信息外界都可以看到。
提交成功后,一般会显示本次提交的大致变动,比如有几个文件发生了修改。
也可以执行多次add 命令后,只执行一次commit命令。
git log命令可以查看历史提交信息,显示从最近到最远的提交日志,并且可以看到commit时的描述信息。可以加上选项 --pretty=oneline打印得更简洁。
git log --pretty=oneline
3.查看.git
[euto@VM-4-13-centos linux]$ tree .git
.git
|-- branches
|-- COMMIT_EDITMSG
|-- config
|-- description
|-- FETCH_HEAD
|-- HEAD
|-- hooks
| |-- applypatch-msg.sample
| |-- commit-msg.sample
| |-- post-update.sample
| |-- pre-applypatch.sample
| |-- pre-commit.sample
| |-- prepare-commit-msg.sample
| |-- pre-push.sample
| |-- pre-rebase.sample
| `-- update.sample
|-- index
|-- info
| `-- exclude
|-- logs
| |-- HEAD
| `-- refs
| |-- heads
| | `-- main
| `-- remotes
| `-- origin
| |-- HEAD
| `-- main
|-- objects
| |-- 00
| | |-- 471d97625e1da7be60c8330d5ee742ae3de972
| | `-- 5bd7898161cf689c01f8fe247d5b78bfb170d8
| |-- 03
| | |-- 0966c31fa8a450374183ddcfb3fa15ead743e3
| | `-- f787a22c2c0d4ba6a5e82b66854ee120569ec4
| |-- 04
| | `-- 4ce1b1b76cef2bf2807b4365904608f51f49f7
| |-- 06
| | `-- 7ab93d0eb926463be10ff5cf9499e7615795ef
| |-- 08
| | `-- b9dcc5629e232dad9fe08331efc7e9cfb0d586
| |-- 0c
| | |-- 1387f0456c58b21fee9b1bdb41e94e902b2b4f
| | `-- 5e13bb4abdfff62f93a30cb236c47ffafa0d6a
| |-- 0d
| | |-- 4c71acbe849b5d4293208ed3236dc5844793fa
| | `-- 4fc5e74b204a41129f8d66ea292552e00e877a
| |-- 12
| | `-- e59bd35202d7a58c67b408718b3d53891ac97c
| |-- 14
| | `-- 0e966c5da9e22bc46197b61a10730e97497332
| |-- 19
| | |-- 4bbc0e0736449d86cd61f3cd956080430f7588
| | `-- 8b19d2d6f6429981116f7adbad04a205cf672c
| |-- 1e
| | `-- 57d506173ac36614ad84205f0128b7a46c82d9
| |-- 27
| | |-- 43f50a6fb3c0bdcadf2b53473c52266f20f9d9
| | `-- d4d181f35233380f9a5b3666bcba845d40e8cc
| |-- 28
| | `-- 39432fa018ac3497ee3d75c547faad10d1f62e
| |-- 2d
| | `-- 2790a8fcac3a9049d0e21e6eb18f115563bbd2
| |-- 2e
| | `-- 2cb3315239d581ac7e8e837569aa4499804799
| |-- 32
| | `-- 9af3ddffc6dfff3dc00347618dba749b2c95ac
| |-- 33
| | |-- 3667bfc55fb2b6656cbf6396cf5c0e7c8949d3
| | `-- 8c0b0e4625d4a35890ded04f70326b968f6a99
| |-- 34
| | |-- 479b790db1fcb09030eb989087f82ae2449785
| | `-- 80f4138f12da89b1e0d673cf9861c7749e4538
| |-- 38
| | |-- 089b1c1209bf1a57b9b8bf97b1f219ef16a537
| | `-- d64333487dd9efacd9eedca1615d9a2e4785ff
| |-- 3a
| | `-- 295da335fee7e73412e794c19528a7a35883ba
| |-- 42
| | |-- aee1c57253456029768871eca1a7a75f8b73cb
| | `-- fd4d4cb51e4cd7937de117c7d923fe00a86761
| |-- 44
| | `-- fd6f6a23cf0f61f7f05352b9e654b09acf2733
| |-- 45
| | `-- 1800beac284115f2ba785758c60d8bad47a7ba
| |-- 46
| | `-- d21224ff78a7709b32d47e9a105ca4ad3f17a1
| |-- 4a
| | `-- 13445342dcac63cb4feb454d3d25af32a6238b
| |-- 54
| | `-- 69635c6cb8ff8bbc382b4aff24e75cfc6cbc94
| |-- 57
| | `-- 5ab719d5c4a7cbb1e253c5a84ff6f8d6f52507
| |-- 5c
| | `-- 5322d606be999bcf8ffa8c8d566caf0c623ff8
| |-- 5e
| | |-- 6569d78cd74d9ee7830db323e8d568daa2196a
| | `-- d0a69da953585cc58cf03861406e0e8b8d2c4f
| |-- 5f
| | `-- 8a3d11c4c3037246c458f59186df2f3b51e3b1
| |-- 62
| | `-- 24f291a3ab2532f482627ff0c88b7717bcd2b7
| |-- 63
| | `-- ad196b2d3ca300548364d335fafa8d77aee646
| |-- 64
| | |-- 92bf25a504595983ff71585b3d8b9e91f4c6c6
| | `-- d337de3a72a723443b1731999d2719b53fb7eb
| |-- 67
| | `-- 5f84131c79508c1edc4375bc4759d29f044d8b
| |-- 68
| | |-- 2ada5f995f3cae515a6d99f97e7a7b145ca733
| | `-- 7a85b539e7098e5f11173bb3b0965841524980
| |-- 6a
| | `-- 779fc3e200129fbafacff53b24208d353f0699
| |-- 71
| | `-- 2d21984a4ff70bdb0de2580556a1cfed756b3a
| |-- 78
| | `-- 3e34e5b527b2017d9c9bbf7e809533e3d35027
| |-- 79
| | `-- 4f2ecd521c823dd04c005c6f158628a5832c60
| |-- 7a
| | |-- 3219ce9e17a833d11421c72ce1a72fd2c14fe6
| | `-- 519e37d69cc75cf94ca61a7ac3255e71095fd3
| |-- 82
| | `-- 0ee450b3703159778a6928c201e0c194a55f64
| |-- 96
| | `-- aa6b23d2ec9a9c2303a97d692f353dc60eca2b
| |-- 98
| | `-- 52295b804994c7c90ba84fa1ce10de5845e95d
| |-- 9e
| | `-- e1751b21a33449b7c1fe9a2aabd7a2c09e1f11
| |-- 9f
| | `-- 2719e5efdc93384938f0c1903bc50872396f44
| |-- ad
| | |-- 5c4327c85081b62207bf268b687130c9790462
| | `-- c4df3f72a3ec3855e4f414e8d3bf6e817dabba
| |-- ae
| | `-- 22998d9a7cdd4183fedd92916238d2b551809b
| |-- af
| | `-- b5f3234eb68146ba559ba2e5294c5074b6ea50
| |-- b1
| | `-- fad596cb8799c5084bb931d7abf4ce54fdee8f
| |-- b4
| | `-- 781363f17c2bfd3e204c5bf93bd189f137bb60
| |-- b5
| | |-- 8b45a92c412792068414b62efd49d66e19b5d8
| | `-- fdfc70e3d67e6d3f679eb6a56f405a5dbe03dc
| |-- b6
| | `-- 18cda73c4b96d544ff4d4cfe6761babd044e23
| |-- bd
| | `-- 4471665031022b2e3a050ae784d90cde7152d3
| |-- c0
| | `-- 7feb66aed4a111add1bc612af7f27dc6081231
| |-- c6
| | `-- 127b38c1aa25968a88db3940604d41529e4cf5
| |-- ce
| | `-- 57ef9eee57b3c4608f3faa05584db445194b78
| |-- cf
| | `-- c581216c31e9317914f506432cc75d523a8e4f
| |-- d1
| | `-- 8e080c80870872840e6a5409cf1c6bb52b4fa3
| |-- d2
| | |-- 4660b353635f9c31e2c73ec6644254bd235ee0
| | `-- 8085ff8ac79f9c24e2addf140e483bdc5e5f83
| |-- d7
| | `-- ad7836b2ab00963be1504d50929d2b70e90dac
| |-- d8
| | `-- 2599595fd876ed7e2828d370da4167950f7568
| |-- dd
| | `-- 26317dc8be7964e970eec88e1a845808ebbb21
| |-- e5
| | `-- 20b7b9de20f289c5b9d80473f3a77ad6ff2176
| |-- ea
| | `-- 697bb66baaedc922fe5788b88abebb0b7725b0
| |-- ed
| | |-- a86fc6852005ae53e13f2469830c17eb20a051
| | `-- f206860392e5bc08d4136634d8710f546b3fd0
| |-- ee
| | `-- ff1409a04ba4ccaf3f8fd119de8ade1eaf8e31
| |-- f4
| | `-- ffd9071d165902fbbdf9c60f9a3b33ae079849
| |-- f5
| | `-- ecb77f858a338b8f67f01c81b9c147a81b12b6
| |-- fc
| | `-- 4be3706059fe7aac8bbe1a449b92a8e81a2792
| |-- fe
| | `-- a0c9178c67c00e9d5fd66538784c1de3fec302
| |-- info
| `-- pack
|-- ORIG_HEAD
|-- packed-refs
`-- refs
|-- heads
| `-- main
|-- remotes
| `-- origin
| |-- HEAD
| `-- main
`-- tags
86 directories, 113 files
[euto@VM-4-13-centos linux]$
这是我的一个git仓库,其中:
- index就是暂存区,add以后的内容都添加到了这里
- HEAD就是默认指向master分支的指针
//这里我修改我的默认分支为main
[euto@VM-4-13-centos linux]$ cat .git/HEAD
ref: refs/heads/main
[euto@VM-4-13-centos linux]$
而默认的master分支,其实就是最新一次提交的commit id
//最新的commit id
[euto@VM-4-13-centos linux]$ cat .git/refs/heads/main
afb5f3234eb68146ba559ba2e5294c5074b6ea50
[euto@VM-4-13-centos linux]$
- objects为git的对象库,里面包含着记录每一次修改的git对象。当执行git add命令时,暂存区的目录树被更新,同时工作区的修改内容被写入到对象库中新创建的一个git对象中。
[euto@VM-4-13-centos linux]$ ls .git/objects/
00 06 0d 19 28 32 38 44 4a 5c 62 67 71 7a 98 ad b1 b6 c6 d1 d8 ea f4 fe
03 08 12 1e 2d 33 3a 45 54 5e 63 68 78 82 9e ae b4 bd ce d2 dd ed f5 info
04 0c 14 27 2e 34 42 46 57 5f 64 6a 79 96 9f af b5 c0 cf d7 e5 ee fc pack
要查找objects中的git对象时,将每一次提交的commit id分为两部分,前2位是文件夹名称,后38位是文件名称。
找到该文件后,一般不能直接查看文件内容,该类文件是经过SHA(安全哈希算法)加密过的文件,不过可以使用 git cat-file 命令查看文件内容。
比如我们查看最新一次提交的commit id的git 对象。
[euto@VM-4-13-centos linux]$ git cat-file -p afb5f3234eb68146ba559ba2e5294c5074b6ea50
tree d18e080c80870872840e6a5409cf1c6bb52b4fa3
parent 2e2cb3315239d581ac7e8e837569aa4499804799
parent d7ad7836b2ab00963be1504d50929d2b70e90dac
author Euto <xydbws@163.com> 1710509194 +0800
committer Euto <xydbws@163.com> 1710509194 +0800
main
[euto@VM-4-13-centos linux]$
//"main"是最新一次提交的描述
其中,还有一行
tree d18e080c80870872840e6a5409cf1c6bb52b4fa3
也使用同样方法打印
[euto@VM-4-13-centos linux]$ git cat-file -p d18e080c80870872840e6a5409cf1c6bb52b4fa3
100644 blob c6127b38c1aa25968a88db3940604d41529e4cf5 .gitignore
040000 tree 0d4c71acbe849b5d4293208ed3236dc5844793fa 1121
040000 tree 675f84131c79508c1edc4375bc4759d29f044d8b 1123
040000 tree bd4471665031022b2e3a050ae784d90cde7152d3 27
040000 tree 338c0b0e4625d4a35890ded04f70326b968f6a99 313
040000 tree 08b9dcc5629e232dad9fe08331efc7e9cfb0d586 315
100644 blob b5fdfc70e3d67e6d3f679eb6a56f405a5dbe03dc README.en.md
100644 blob 64d337de3a72a723443b1731999d2719b53fb7eb README.md
[euto@VM-4-13-centos linux]$
//
打印目录 315
[euto@VM-4-13-centos linux]$ git cat-file -p 08b9dcc5629e232dad9fe08331efc7e9cfb0d586
100644 blob 5e6569d78cd74d9ee7830db323e8d568daa2196a test.cpp
[euto@VM-4-13-centos linux]$
为了便于对比,此处的test.cpp文件新增一行修改
E> 1 t 2 E> 3 dev cp 4 5 //这一行是新增的 6 "新增一行用于测试"
完成add和commit后,按照之前的步骤找到最新一次提交的git对象。对比不同git对象对同一个文件的记录:
[euto@VM-4-13-centos linux]$ git cat-file -p 8a476b2cdc47f29ec32b951dca2d035dc6103778
t
dev cp
"新增一行用于测试"
[euto@VM-4-13-centos linux]$ git cat-file -p 5e6569d78cd74d9ee7830db323e8d568daa2196a
t
dev cp
[euto@VM-4-13-centos linux]$
总结:
在add阶段,所有的add操作变动都被记录下来到一个git对象中,而git对象又是树状管理目录,这样发生修改的每一次add都被有条不紊的记录下来。
在完成commit提交操作后,只生成一个commit id,一个commit id对应一个git对象。一次提交会记录add操作后的所有文件内容,此时有的文件发生了修改,有的文件没有发生修改。
无论如何,本次提交都把当前状态的所有的文件保存下来,即git控制的一个版本。
4.修改文件
git比其他版本控制器设计给更优秀,是因为git跟踪并管理的,并非是文件,而是修改。
在工作区,对README文件作一些修改。
[euto@VM-4-13-centos linux]$ cat README.md
//新增一行修改
"========="
[euto@VM-4-13-centos linux]$
此时,本地仓库中README和工作区的README是不同的,可以使用git status查看当前仓库在上次提交后是否有文件被修改。
[euto@VM-4-13-centos linux]$ git status
# On branch main
# Your branch is ahead of 'origin/main' by 16 commits.
# (use "git push" to publish your local commits)
#
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: README.md
#
no changes added to commit (use "git add" and/or "git commit -a")
[euto@VM-4-13-centos linux]$
上面的结果显示,有哪些文件被修改了,需要添加和提交。但是如何知道修改的具体内容呢?可以使用 git diff [文件] 命令显示暂存区和工作区文件的差异,显示的格式正是Unix通用的diff格式,也可以使用git diff HEAD -- [file]查看版本库和工作区的差异。
[euto@VM-4-13-centos linux]$ git diff README.md
diff --git a/README.md b/README.md
index 64d337d..69b6c49 100644
--- a/README.md
+++ b/README.md
@@ -1,36 +1,2 @@
-# linux
-
-#### 介绍
-这个轮子用来学习linux
-
-#### 软件架构
-软件架构说明
-
-
-#### 安装教程
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### 使用说明
-
-1. xxxx
-2. xxxx
-3. xxxx
-
-#### 参与贡献
-
-1. Fork 本仓库
-2. 新建 Feat_xxx 分支
-3. 提交代码
-4. 新建 Pull Request
-
-
-#### 特技
-
-1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
-2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
-3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
-4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
-5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gite
+//新增一行修改
+"========="
(END)
git diff HEAD -- README.md