版本控制的主要目的就是把文件的所有更改详细地记录下来。这样我们就可以放心修改:改动后发现有问题,我们可以容易地查出改动过什么,甚至恢复到上一个没有问题的版本。
Git是现今最流行的版本控制系统。它本来是设计运行在Linux系统里的,后来有人把它也实现在Windows平台上了。
Git跟SVN虽同是版本控制系统,但是最大分别是:Git是分布式的,SVN则是集中式的。分布式就是说,每一个安装了Git的系统都是独立而且完整的一个版本控制系统,它不需要依赖一个中央系统作最终管理;相反,集中式必须依赖着一个中央系统生存,一旦与之离线,就不可以作版本控制了。另外就是架构和速度的分别:Git的设计是精简而强大的,版本控制的操作速度要比SVN快上N倍,而且占用的储存空间要比SVN小得多。
安装
这是Git的官网:https://git-scm.com,各位可以点【Downloads】下载。
- 记得钩选【Windows Explorer Integration】
- 我个人会选择Nodepad++作为预设的编辑器
- 其他的就不做改动了,点Next、Next。。。就好了。
创建一个新的Repository(版本库)
一个版本控制系统下面可以有很多的repository。一般情况下,我们会把同一项目下的所有文件都放在一个repository里,两个项目就会有两个repository。那么,我们怎么知道现在本机有多少个repository呢?
以上的问题先不说,让我们先打开Git的命令窗口测试一下。对,是Git的Bash命令窗口。
- 在桌面的空白处摁鼠标右键,点选【Git Bash Here】
- 在弹出的命令窗口输入
git --version
,摁【Enter】 - 这个命令是查询当前Git的版本
好了,接下来我们就在桌面新建立一个名为“git-test”的文件夹
- 在命令窗口键入
mkdir git-test
,摁【Enter】 - 接着键入
cd git-test
,把当前命令行的工作目录切换到“git-test”底下 - 重点命令来了,键入:
git init
- 这个命令把整个“git-test”文件夹都纳入版本控制系统的管理范围,怎么确定呢?你看看“git-test”底下是否有一个隐藏的“.git”文件夹?这就是repository的核心所在。如果把它删除了,版本控制就不存在了,跟一般的文件夹无异
- 不少人误认为“git-test”就是repository了,稍后你会发现,这个“.git”文件夹才是repository的真身;“git-test”实际上是混合了repository和working copy
新增一个文件到Repository
哪些文件需要、不需要版本控制,必须由我们手动控制,Git是不会自动把所有“git-test”里的东东全都加入“.git”里边的。
- 我们先建立一个纯文字文档:
echo hello world > readme.txt
- 键入
git status
查看working copy下的文件状态:你会发现readme.txt被列入到“Untracked files”的清单里了
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
readme.txt
nothing added to commit but untracked files present (use "git add" to track)
- 接着把这个readme.txt复制到Git的staging area(中转区域):
git add readme.txt
- 注意:Staging area并不是最终的库:它是一个可提存、没有版本记录的中转区域
- 好了,现在将staging area的内容推送到版本库:
git commit -m "this is my first comment"
,这会反馈相关修改的详细信息
$ git commit -m "this is my comment"
[master (root-commit) 93fa392] this is my comment
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 readme.txt
- 怎么知道commit成不成功?键入
git log
查看修改记录 - 还不相信吗?手动删除readme.txt,然后键入:
git checkout .
- 看!readme.txt又回来了!
修改文件
这跟新增一个文件差不多,除了可以在修改后用git add readme.txt
把readme.txt复制到staging area,还可以在commit的同时一并把所有已加入追踪的文件加入staging area,然后保存到仓库。
- 在readme.txt的结尾追加一行日期和时间:
date >> readme.txt
- 查看一下最新的内容:
cat readme.txt
,看见刚才追加的日期和时间咯
$ cat readme.txt
hello world
2017年12月28日 20:18:48
- 将所有已加入追踪的文件拷到staging area,然后提交更改:
git commit -a -m "appended date and time"
$ git commit -m "appended date and time"
[master 8d43e8c] appended date and time
1 file changed, 1 insertion(+)
查看修改记录
- 如果想看修改记录,键入
git log
$ git log
commit 8d43e8ccee8ca69134dc7584676055990d962ff5 (HEAD -> master)
Author: Freedigits <clarke@justore.tech>
Date: Thu Dec 28 20:20:32 2017 +0800
appended date and time
commit 6cf83d8e177c0d57ce8def96f01054ed52bbc145
Author: Freedigits <clarke@justore.tech>
Date: Thu Dec 28 20:03:45 2017 +0800
this is my comment
- 只看上一次的修改记录:
git log -1
$ git log -1
commit 8d43e8ccee8ca69134dc7584676055990d962ff5 (HEAD -> master)
Author: Freedigits <clarke@justore.tech>
Date: Thu Dec 28 20:20:32 2017 +0800
appended date and time
- 细看修改文件列表:
git log -1 --stat
$ git log -1 --stat
commit e38040d46925657acc1a37cb881ccc04b0d2acd0 (HEAD -> master)
Author: Freedigits <clarke@justore.tech>
Date: Thu Dec 28 20:20:32 2017 +0800
appended date and time
readme.txt | 1 +
1 file changed, 1 insertion(+)
- 对比上一次修改的内容:
git diff HEAD HEAD^
$ git diff HEAD HEAD^
diff --git a/readme.txt b/readme.txt
index f9a399c..3b18e51 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1 @@
hello world
-2017年12月28日 20:18:48
重新命名或移动文件
这个简单:git mv readme.txt README.md
,然后提交。
$ git mv readme.txt README.md && git commit -am "renamed to markdown type"
[master 5da4fac] renamed to markdown type
1 file changed, 0 insertions(+), 0 deletions(-)
rename readme.txt => README.md (100%)
删除文件
键入git mv readme.txt README.md
,然后提交。