
Git是一种目前十分流行的分布式版本控制系统,分布式的意思是客户端不只提取最新版本的文件快照,而是把原始的代码仓库完整的镜像下来,这样,任何一处协同工作的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。
Git使用SHA-1算法计算数据的校验和(又称指纹字符串)并将其作为数据的唯一索引和标识,Git中的操作完全依赖于这一串指纹字符串,所有保存在Git数据库中的数据都是以这一串哈希值来做索引而不是文件名。
三种状态
要理解Git,首先要清楚其中文件的三种状态:已提交(committed)、已修改(modified)和已暂存(staged)。
- 已提交表示文件已被保存在了本地的数据库中
- 已修改表示文件已被修改但仍未被提交
- 已暂存表示对于要提交的文件放入了提交清单中等待提交处理
基本配置
1 | git config --global user.name "EvilFinder" #配置用户名 |
上面的配置命令中,--global表示目前的配置文件只适用于该用户,其修改内容保存在~/.gitconfig文件中,若想配置针对当前所有用户都适用的配置,需要将--global改为--system选项,此时修改的文件为/etc/gitconfig文件。
Git简单上手
这里介绍Git的一些基本操作。
初始化仓库
- mkdir giter
- cd giter
- git init
上面三步创建了一个名为giter的文件夹并进入该文件夹执行了git init命令,该命令执行后将会在其目录下生成.git目录,这个.git目录存储着管理当前目录内容所需的仓库数据,在Git中我们将其称之为附属于该仓库的目录树。
查看仓库状态
- git status
该命令用于显示当前Git仓库的状态,下面是一次执行结果的输出:1
2
3
4
5$ git status
On branch master #表示当前位于master分支
Initial commit
nothing to commit (create/copy files and use "git add" to track)
# 表示目前没有可供提交的数据
这是初始状态下的显示结果,创建文件README后显示状态如下:1
2
3
4
5
6
7
8
9$ git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
其中Untracked files:中显示有未跟踪的文件README,并提示我们可以使用git add README指令进行跟踪,将其转换为暂存状态,跟踪之后再次执行git status显示如下:1
2
3
4
5
6
7$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README
其中提示我们有文件等待提交,并提示可以使用·git rm --cached README对该文件取消暂存。
若该文件修改之后,查看状态会显示如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README
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
有没有注意到,上面显示了两个README文件,上面第一个表示上一次我们暂存但还未提交的README文件
,而下面的README文件表示我们本次修改了的README文件,我们如果在此时执行git commit -m '提交评论',此时保存到本地数据库中的是我们未修改README之前的文件状态,只有当我们使用git add README,之后再执行git commit -m '提交评论'才会保存最新的文件状态。
向暂存区添加文件
其实上面查看仓库状态里面已经提到了该命令,使用git add可以将当前文件存入暂存区。
提交更新
git commit命令可以将当前暂存区的文件实际保存到仓库的历史记录中,通过这些历史记录我们可以复原文件。
下面是一次执行git commit -m "First commit"后,查看状态现实的内容:1
2
3$ git status
On branch master
nothing to commit, working directory clean
表示目前我们的工作区是干净的。
查看提交日志
1 | $ git log |
其中包含的信息有只想本次提交的哈希值commit b56393fbf0fa34dc95973114bfbcbb0f9d81f9e1,提交者相关信息、提交时日期和提交评论。
执行git log --pretty=short显示简述信息。1
2
3
4
5$ git log --pretty=short
commit b56393fbf0fa34dc95973114bfbcbb0f9d81f9e1
Author: EvilFinder <rootkitspace@gmail.com>
First commit
执行git log -p显示提交所做的改动。
1 | $ git log -p |
分支操作
再进行多个作业并行开发时我们会用到分支,例如你要为项目添加一个新的功能,而该功能如果在master分支上改动的话可能会对整个上线的项目造成影响,于是创建一个分支来开发这个功能,不同分支内的操作互不影响,在功能完成之后再将其合并到master分支上。
创建分支
创建名为fix-bug的分支。
1 | $ git branch fix-bug |
查看当前所有分支。
1 | $ git branch |
表示目前有master和fix-bug两个分支,分支前如果有*号表示目前工作区处于该分支下。
切换到fix-bug分支。
1 | git checkout fix-bug |
创建并切换分支1
git checkout -b fix-bug
相当于执行了1
2git branch fix-bug
git checkout fix-bug
合并分支
当你在fix-bug分支修改好了以后,需要将其合并到master分支,需要执行1
2git checkout master
git merge --no-ff fix-bug
切换回上一分支1
git checkout -
查看提交内容(图表形式)
1 | $ git log --graph |
回溯历史版本
若希望项目回复到之前的某一状态,需要查看历史提交查看指向提交记录的哈希值,使用git reset来进行历史版本的回溯。
回溯到fix-bug分支创建前的状态,首先需要找到哈希值1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21$ git log
commit c767c54a9bdd2af3e1cf4d464ddceefbc3fa1222
Merge: b56393f 96c45a4
Author: EvilFinder <rootkitspace@gmail.com>
Date: Fri Aug 12 16:29:35 2016 +0800
Merge branch 'fix-bug'
commit 96c45a4fa6c7ae99d8c7564ec1758cdd3b8e4845
Author: EvilFinder <rootkitspace@gmail.com>
Date: Fri Aug 12 16:29:16 2016 +0800
Complete fix bug
commit b56393fbf0fa34dc95973114bfbcbb0f9d81f9e1
Author: EvilFinder <rootkitspace@gmail.com>
Date: Fri Aug 12 15:43:40 2016 +0800
First commit
$ git reset --hard b56393fbf0fa34dc95973114bfbcbb0f9d81f9e1
HEAD is now at b56393f First commit
未完待续