Git 工作原理
一、Git 是什么
Git 是目前世界上最先进的分布式版本控制工具之一,下面我将通过数据的流向来介绍它。
二、从工作区到远程仓库
1、Workspace(工作区)
如果要对项目进行版本管理,在开始一个工程前,先执行 git init
命令来对工程进行初始化。
1 | git init |
git init
命令会在该项目下生成一个 .git
的目录(如下),用来保存版本信息。.git
目录的上一级就是工作区。
1 | branches/ |
2、Index / Stage(暂存区)
在 .git
目录下,有一个 index 文件,这个地方叫做暂存区。它实际上就是一个包含文件索引的目录树,记录了文件名、文件的状态信息。
当编写了一些代码后,我们可以执行 git add
命令,将当前项目所有变动的文件写入到对象库中的一个新的对象中,位于 “.git/objects” 目录下。并记录在暂存区。
1 | git add . |
如果要查看暂存区的状态。可以用如下命令,它会显示当前改动过的文件的状态。
1 | git status |
3、Repository(本地仓库或版本库)
将改动后的文件存于暂存区后,就可以将现在的信息提交到版本库,即暂存区的目录树写到对象库中,其中HEAD指向最新放入仓库的版本。提交命令如下,
1 | git commit -m "[XX]" |
并将当前项目作为一个快照保存起来。项目的历史就是由不同时期的快照构成的。Git 可以使项目回到历史的任何一个快照。要切到不同的点可以用如下命令:
1 | git checkout |
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 | git merge 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/