Git 工作原理

一、Git 是什么

Git 是目前世界上最先进的分布式版本控制工具之一,下面我将通过数据的流向来介绍它。

二、从工作区到远程仓库

1、Workspace(工作区)

如果要对项目进行版本管理,在开始一个工程前,先执行 git init 命令来对工程进行初始化。

1
git init

git init 命令会在该项目下生成一个 .git 的目录(如下),用来保存版本信息。.git 目录的上一级就是工作区。

1
2
3
4
5
6
7
8
branches/
config
description
HEAD
hooks/
info/
objects/
refs/

2、Index / Stage(暂存区)

.git 目录下,有一个 index 文件,这个地方叫做暂存区。它实际上就是一个包含文件索引的目录树,记录了文件名、文件的状态信息。

当编写了一些代码后,我们可以执行 git add 命令,将当前项目所有变动的文件写入到对象库中的一个新的对象中,位于 “.git/objects” 目录下。并记录在暂存区。

1
git add .

如果要查看暂存区的状态。可以用如下命令,它会显示当前改动过的文件的状态。

1
2
3
4
git status
// modified:已修改
// staged:已暂存。可以看到你要提交的东西有哪些
// committed:已提交

3、Repository(本地仓库或版本库)

将改动后的文件存于暂存区后,就可以将现在的信息提交到版本库,即暂存区的目录树写到对象库中,其中HEAD指向最新放入仓库的版本。提交命令如下,

1
git commit -m "[XX]"

并将当前项目作为一个快照保存起来。项目的历史就是由不同时期的快照构成的。Git 可以使项目回到历史的任何一个快照。要切到不同的点可以用如下命令:

1
2
3
4
5
git checkout

git reset

git revert

4、Remote(远程仓库)

但是要实现对代码更好的管理,是要将它存在远程仓库,所以当版本库存放了已提交的代码后,就可以将其推到远程仓库了。要将代码推到远程仓库,首先要知道要向远程仓库的哪里提交,即要知道分支,而分支(branch)就是指向某个快照的指针,分支名就是指针名。分支使得用户可以为快照起别名。而且,分支会自动更新,如果当前分支有新的快照,指针就会自动指向它。

1
git push

上面命令用于将本地分支的更新推送到远程仓库。

而要查看快照可以用下面命令

1
git log

三、从远程仓库到工作区

从远程主机克隆一个版本库,要用到如下命令。该命令会在本地主机生成一个目录,与远程主机的版本库同名。

1
git clone <版本库的网址>

当远程主机的版本库有了更新(新的 commit),需要将这些更新取回本地,这时就要用到git fetch命令。默认情况下,git fetch取回所有分支(branch)的更新。如果只想取回特定分支的更新,可以指定分支名。

1
git fetch <远程主机名> <分支名>

取回远程主机的更新以后,可以在它的基础上,使用git checkout命令创建一个新的分支。

1
git checkout -b newBrach // 在当前分支上新建一个分支

此外,也可以使用git merge命令或者git rebase命令,在本地分支上合并远程分支。

1
2
3
git merge origin/master

git rebase origin/master

或者可以用个更快的命令,直接git pull命令取回远程主机某个分支的更新,再与本地的指定分支合并。

1
git pull <远程主机名> <远程分支名>:<本地分支名> // 取回远程主机名的分支,与本地的分支合并

等同于先做 git fetch,再做 git merge

四、Git 常用命令

扩展阅读

Git Book - https://git-scm.com/book/zh/
git 简明指南 - http://rogerdudler.github.io/git-guide/index.zh.html
常用 Git 命令清单 - http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
猴子都能懂的 GIT 入门 - http://backlogtool.com/git-guide/cn/
Git 教程 - http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

参考链接

https://wsgzao.github.io/post/git/

微信打赏