盒子
盒子

Git本地操作

Git是一种目前十分流行的分布式版本控制系统,分布式的意思是客户端不只提取最新版本的文件快照,而是把原始的代码仓库完整的镜像下来,这样,任何一处协同工作的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。

Git使用SHA-1算法计算数据的校验和(又称指纹字符串)并将其作为数据的唯一索引和标识,Git中的操作完全依赖于这一串指纹字符串,所有保存在Git数据库中的数据都是以这一串哈希值来做索引而不是文件名。

三种状态

要理解Git,首先要清楚其中文件的三种状态:已提交(committed)、已修改(modified)和已暂存(staged)。

  • 已提交表示文件已被保存在了本地的数据库中
  • 已修改表示文件已被修改但仍未被提交
  • 已暂存表示对于要提交的文件放入了提交清单中等待提交处理

基本配置

1
2
3
4
5
6
7
git config --global user.name "EvilFinder"   #配置用户名
git config --global user.email "rootkitspace@gmail.com" #配置邮箱
git config --global core.editor vim #配置文本编辑器
git config --global merge.tool vimdiff #配置差异分析工具
git config --global color.ui auto #配置输出内容颜色
git config --list #查看配置信息
git help config #查看config命令用法

上面的配置命令中,--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
2
3
4
5
6
$ git log
commit b56393fbf0fa34dc95973114bfbcbb0f9d81f9e1
Author: EvilFinder <rootkitspace@gmail.com>
Date: Fri Aug 12 15:43:40 2016 +0800

First commit

其中包含的信息有只想本次提交的哈希值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
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git log -p
commit b56393fbf0fa34dc95973114bfbcbb0f9d81f9e1
Author: EvilFinder <rootkitspace@gmail.com>
Date: Fri Aug 12 15:43:40 2016 +0800

First commit

diff --git a/README b/README
new file mode 100644
index 0000000..dfd457e
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+哈哈哈

分支操作

再进行多个作业并行开发时我们会用到分支,例如你要为项目添加一个新的功能,而该功能如果在master分支上改动的话可能会对整个上线的项目造成影响,于是创建一个分支来开发这个功能,不同分支内的操作互不影响,在功能完成之后再将其合并到master分支上。

创建分支

创建名为fix-bug的分支。

1
$ git branch fix-bug

查看当前所有分支。

1
2
3
$ git branch
fix-bug
* master

表示目前有masterfix-bug两个分支,分支前如果有*号表示目前工作区处于该分支下。
切换到fix-bug分支。

1
git checkout fix-bug

创建并切换分支

1
git checkout -b fix-bug

相当于执行了

1
2
git branch fix-bug
git checkout fix-bug

合并分支

当你在fix-bug分支修改好了以后,需要将其合并到master分支,需要执行

1
2
git checkout master
git merge --no-ff fix-bug

切换回上一分支

1
git checkout -

查看提交内容(图表形式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git log --graph
* 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来进行历史版本的回溯。
回溯到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


未完待续