什么是git,为什么我们需要版本控制系统(Version controlling system)
想象这样一种情况
- A 第一次搭建博客,本来已经成功运行,现在想要添加一些功能,之后网站突然崩溃了。A 意识到是自己添加的代码出了问题。A想回到上一个 “版本”
- A 和 B 合作开发一款app,A先写好了一个部分,随后AB一起在此基础上开发。 在这里,频繁的同步两人的文件是繁琐的,怎么样才能让两人的“版本”合并。
由此,Linus 在2005年用 C写出了 一款分布式的版本控制系统 Git
如果你没有安装git,按照CS61B git guide配置即可。
1
2
3
4
| $ cd Developer
$ git init gitLearn
Initialized empty Git repository in /Users/luozhanpeng/Devloper/gitLearn/.git/
// 初始化了一个名叫 gitLearn 的 代码仓库
|
接下来,以一个简单的网站为例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| $ touch index.html style.css
// 意为,新建 一个 超文本标记语言 和一个层叠样式表文件
$ git status
// 以下为 git 给出的反应
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.html
style.css
nothing added to commit but untracked files present (use "git add" to track)
|
- git 提示说 没有东西可以提交,但是尚有未追踪的文件存在
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| $ git add index.html style.css
// 或者 git add . (.代表本文件夹)
$ git status
On branch main
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: index.html
new file: style.css
[main (root-commit) 314f4ac] something to say
2 files changed, 23 insertions(+)
create mode 100644 index.html
create mode 100644 style.css
$ git commit -m "something ot say"
[main (root-commit) 314f4ac] something to say
2 files changed, 23 insertions(+)
create mode 100644 index.html
create mode 100644 style.css
|
- 我们已经 “提交了”
index.html
和 style.css
到main - 接下来,我们为网站创建第一个版本0.01
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| $ git branch 0.01
$ git branch 0.02
// 为网页创建第一个版本 0.01 以及 第二个版本 0.02
$ git branch // 查看现有的分支
0.01
0.02
* main
$ git checkout 0.01 // 切换至 0.01 版本
$ git branch
* 0.01
0.02
main
// *号 已经到了 0.01前,意思是,现在在0.01这个版本开始操作git
|
1
2
3
4
5
6
7
8
|
$ touch script.js
$ git status
On branch 0.01
Untracked files:
(use "git add <file>..." to include in what will be committed)
script.js
|
- 接下来,使用
git add
和 git commit
提交至 0.01 版本 - 查看该文件夹,可以看到有3个文件
- 再使用
git checkout main
再此查看此文件夹,发现只有原先的两个文件 - 这就是版本控制系统
git 是如何存储这些版本的,几个版本迭代后,内存占用会很大吗
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
| $ cd gitLearn
$ find .git
.git
.git/config
.git/objects
.git/objects/92
.git/objects/92/3c3c0d66fa9b0e561827d9276b2c9f9bdba8dd
.git/objects/51
.git/objects/51/5b962f04b9f1aac794432044e7ab186f084a9a
.git/objects/33
.git/objects/33/61d2b3508e726e7827769303b39fd5d8f200e7
.git/objects/bd
.git/objects/bd/67d436f5b2f23101707532f2cc33fde5d5e637
.git/objects/pack
.git/objects/4c
.git/objects/4c/5bc2e4a223551079331046b632b3b7c1401800
.git/objects/info
.git/objects/99
.git/objects/99/2982e416aba904e46de16bfc79ec1cb2c71f13
.git/objects/52
.git/objects/52/65c0380d1e5071b9d382eab4d66b18e5fca1bd
.git/HEAD
.git/info
.git/info/exclude
.git/logs
.git/logs/HEAD
.git/logs/refs
.git/logs/refs/heads
.git/logs/refs/heads/0.01
.git/logs/refs/heads/0.2
.git/logs/refs/heads/main
.git/description
.git/hooks
.git/hooks/commit-msg.sample
.git/hooks/pre-rebase.sample
.git/hooks/pre-commit.sample
.git/hooks/applypatch-msg.sample
.git/hooks/fsmonitor-watchman.sample
.git/hooks/pre-receive.sample
.git/hooks/prepare-commit-msg.sample
.git/hooks/post-update.sample
.git/hooks/pre-merge-commit.sample
.git/hooks/pre-applypatch.sample
.git/hooks/pre-push.sample
.git/hooks/update.sample
.git/hooks/push-to-checkout.sample
.git/refs
.git/refs/heads
.git/refs/heads/0.01
.git/refs/heads/0.2
.git/refs/heads/main
.git/refs/tags
.git/index
.git/COMMIT_EDITMSG
|