📝 Writing docs.

pull/11/head
Zhang Peng 2017-12-08 23:34:41 +08:00
parent 531fdf0c43
commit 6fae3495a8
2 changed files with 130 additions and 95 deletions

View File

@ -15,6 +15,24 @@ tags:
Git 是一个开源的分布式版本控制系统。
### 什么是版本控制?
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
### 什么是分布式版本控制系统?
介绍分布式版本控制系统前,有必要先了解一下传统的集中式版本控制系统。
**集中化的版本控制系统**,诸如 CVSSubversion 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
这么做最显而易见的缺点是中央服务器的单点故障。如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。要是中央服务器的磁盘发生故障,碰巧没做备份,或者备份不够及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录。
![img](https://git-scm.com/figures/18333fig0102-tn.png)
**分布式版本控制系统**的客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
![img](https://git-scm.com/figures/18333fig0103-tn.png)
### 为什么使用 Git
Git 是分布式的。这是 Git 和其它非分布式的版本控制系统,例如 svncvs 等,最核心的区别。分布式带来以下好处:
@ -29,33 +47,67 @@ Git 是分布式的。这是 Git 和其它非分布式的版本控制系统,
分布式版本控制系统,每个人电脑中都有完整的版本库,所以某人的机器挂了,并不影响其它人。
### 原理
## 原理
![git-theory.png](http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-theory.png)
先介绍几个核心概念,介绍概念过程中的命令具体用法会在后面详述,这里暂不做介绍:
#### 版本库
### 版本库
当你一个项目到本地或创建一个 git 项目,项目目录下会有一个隐藏的 `.git` 子目录。这个目录是 git 用来跟踪管理版本库的,千万不要手动修改。
#### 工作区WORKING
### 哈希值
当你 `git clone` 一个项目到本地,本地的项目目录相当于一个工作副本,这就是工作区
Git 中所有数据在存储前都计算校验和,然后以校验和来引用。 这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。 这个功能建构在 Git 底层,是构成 Git 哲学不可或缺的部分。 若你在传送过程中丢失信息或损坏文件Git 就能发现
#### 暂存区STAGING
Git 用以计算校验和的机制叫做 SHA-1 散列hash哈希。 这是一个由 40 个十六进制字符0-9 和 a-f组成字符串基于 Git 中文件的内容或目录结构计算出来。 SHA-1 哈希看起来是这样:
当你在工作区上执行增删改操作,致使文件状态发生变化,可以通过 `git add` 暂存,存储的区域就是暂存区。
```
24b9da6552252987aa493b52f8696cd6d3b00373
```
#### 本地仓库LOCAL
Git 中使用这种哈希值的情况很多,你将经常看到这种哈希值。 实际上Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。
通过 `git commit` 命令,可以将所有暂存的记录提交到当前分支,这时内容被保存在了本地仓库。此时,工作区相当于是清空了。
### 文件状态
#### REMOTE远程仓库
在 GIt 中,你的文件可能会处于三种状态之一:
以上的所有版本控制都是在你的本地完成,远程仓库并没有保存你的修改,换句话说,其他人并不知道你的工作。为了让所以人都能看到你的修改,你需要使用 `git push` 将自己的修改推送到远程仓库上。
- **已修改modified**
同理,如果你想知道别人在远程仓库上做了什么修改,你可以使用 `git fetch``git pull` 同步别人的修改。
已修改表示修改了文件,但还没保存到数据库中。
- **已暂存staged**
已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
- **已提交committed**
已提交表示数据已经安全的保存在本地数据库中。 
### 工作区域
与文件状态对应的,不同状态的文件在 Git 中处于不同的工作区域。
- **工作区working**
当你 `git clone` 一个项目到本地,相当于在本地克隆了项目的一个副本。
工作区是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
- **暂存区staging**
暂存区是一个文件,保存了下次将提交的文件列表信息,一般在 Git 仓库目录中。 有时候也被称作`‘索引’',不过一般说法还是叫暂存区。
- **本地仓库local**
提交更新,找到暂存区域的文件,将快照永久性存储到 Git 本地仓库。
- **远程仓库remote**
以上几个工作区都是在本地。为了让别人可以看到你的修改,你需要将你的更新推送到远程仓库。
同理,如果你想同步别人的修改,你需要从远程仓库拉取更新。
![git-theory.png](http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-theory.png)
## 安装
@ -99,13 +151,15 @@ git version 1.7.1
国外网友制作了一张 Git Cheat Sheet总结很精炼各位不妨收藏一下。
本节选择性介绍 git 中比较常用的命令行场景。
![git-cheat-sheet.png](http://oyz7npk35.bkt.clouddn.com//image/linux/git/git-cheat-sheet.png)
### 创建
##### 复制一个已创建的仓库:
#### 克隆一个已创建的仓库
```
```sh
# 通过 SSH
$ git clone ssh://user@domain.com/repo.git
@ -113,14 +167,71 @@ $ git clone ssh://user@domain.com/repo.git
$ git clone http://domain.com/user/repo.git
```
##### 创建一个新的本地仓库:
#### 创建一个新的本地仓库
```
```sh
$ git init
```
### 本地修改
#### 添加修改到暂存区
##### 把指定文件添加到暂存区
```
$ git add xxx
```
##### 把当前所有修改添加到暂存区
```
$ git add .
```
##### 把所有修改添加到暂存区
```
$ git add -A
```
#### 提交修改到本地仓库
##### 提交本地的所有修改
```
$ git commit -a
```
##### 提交之前已标记的变化
```
$ git commit
```
##### 附加消息提交
```
$ git commit -m 'message here'
```
#### 储藏
我个人更喜欢称之为存草稿。
##### 将修改作为当前分支的草稿保存
```
git stash apply
```
##### 删除最新一次的 stashed changes
```
git stash drop
```
### 查看
##### 显示工作路径下已修改的文件:
```
@ -133,82 +244,6 @@ $ git status
$ git diff
```
##### 把当前所有修改添加到下次提交中:
```
$ git add .
```
##### 把对某个文件的修改添加到下次提交中:
```
$ git add -p <file>
```
##### 提交本地的所有修改:
```
$ git commit -a
```
##### 提交之前已标记的变化:
```
$ git commit
```
##### 附加消息提交:
```
$ git commit -m 'message here'
```
##### 提交,并将提交时间设置为之前的某个日期:
```
git commit --date="`date --date='n day ago'`" -am "Commit Message"
```
##### 修改上次提交
*请勿修改已发布的提交记录!*
```
$ git commit --amend
```
##### 修改上次提交的committer date
```
GIT_COMMITTER_DATE="date" git commit --amend
```
##### 修改上次提交的author date
```
git commit --amend --date="date"
```
##### 把当前分支中未提交的修改移动到其他分支:
```
git stash
git checkout branch2
git stash pop
```
##### 将 stashed changes 应用到当前分支:
```
git stash apply
```
##### 删除最新一次的 stashed changes
```
git stash drop
```
### 搜索
##### 从当前目录的所有文件中查找文本内容:

Binary file not shown.