Git基本理论
工作区
Git本地有三个工作区,再加上远程的git仓库共四个工作区:
- 工作目录(Working Directory)
工作区,就是你平时存放项目代码的地方 - 暂存区(Stage/Index)
暂存区,用于临时存放你的改动 - 资源库(Repository)
仓库区,就是安全存放数据的位置 - git仓库(Remote Directory)
远程仓库,托管代码的服务器
工作流程
在工作目录中添加或修改文件
将需要进行版本管理的文件放入暂存区–add操作
将暂存区的文件提交到仓库–commit
将修改的文件推送到远程仓库–push
分支
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。 在很多版本控制系统中,这是一个略微低效的过程——常常需要完全创建一个源代码目录的副本。对于大项目来说,这样的过程会耗费很多时间。
有人把 Git 的分支模型称为它的“必杀技特性”,也正因为这一特性,使得 Git 从众多版本控制系统中脱颖而出。 为何 Git 的分支模型如此出众呢? Git 处理分支的方式可谓是难以置信的轻量,创建新分支这一操作几乎能在瞬间完成,并且在不同分支之间的切换操作也是一样便捷
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 新建一个分支,但依然停留在当前分支
git branch [branch-name]
# 新建一个分支,并切换到该分支
git checkout -b [branch-name]
# 合并指定分支到当前分支
$ git merge [branch-name]
#切换分支
$ git checkout [branch-name]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
note:
分支切换会改变你工作目录中的文件
在切换分支时,一定要注意你工作目录里的文件会被改变。 如果是切换到一个较旧的分支,你的工作目录会恢复到该分支最后一次提交时的样子。 如果 Git 不能干净利落地完成这个任务,它将禁止切换分支。
HEAD指针与reset和checkout
- HEAD指针
Git中存在一个HEAD指针,在每次提交时HEAD指针会向前进一位,同时HEAD指针只存在于暂存区和仓库区。也就是说如果我们使用git add命令,那么此时HEAD指针会进入到暂存区,继续用git commit,此时会进入到仓库区。 - git reset
git reset其实就是把HEAD指针回退一位。即如果你在仓库区,那么你回退一位就是暂存区,如果你在暂存区,那么指针会回退到上一次的仓库区。reset命令提供了三种使用方法。分别是–soft --mixed --hard:
git reset --soft #移动指针
git reset --mixed #移动指针+清空暂存区
git reset --hard #移动指针+清空暂存区+清空工作区
- git checkout
简单说,checkout就是把当前代码更新成HEAD指针指向的提交。除了前面提到的git checkout [branch-name]切换分支,其原理就是将HEAD指针指向另一个分支,同时将其覆盖。还可以git checkout [file-name],把内容更新成上一版提交,但前提是HEAD指针指向的提交与当前你所在的区域不同。
reset | checkout | |
---|---|---|
原理 | 头指针回退到上一个 | 更新当前代码为头指针指向的提交 |
异同 | 还原本地文件(撤销) | 还原本地文件(替换) |
fetch、clone和pull
fetch | clone | pull | |
---|---|---|---|
适合场景 | 有本地仓库主分支,下载其他分支 | 没有本地仓库 | 本地仓库和远程仓库不同步 |
异同 | 从远程获取最新到本地,不会自动merg | 把仓库克隆到本地 ,无需有本地仓库(即git init) | 从远程获取最新并merge到本地 |
note
git pull = git fetch + git merge,这样fetch就比较有优势,可以下载后根据情况再选择是否合并,而clone就是从无到有的过程