init git
在项目根目录下面创建一个.git子目录,用来保存版本信息
-
branches:
-
config: 仓库配置。比如远程url,账号
-
description: 仓库描述
-
hooks
可以在commit、rebase、pull等阶段自动运行
- pre-commit.sample
- pre-push.sample
- …
-
info:可以将不想被git管理的文件记录到.gitignore
-
objects
- info
- pack
-
refs
- heads
- tags
-
HEAD
指向当前分支
add
工作区便是我们项目所在的文件夹,.git文件夹便存储着版本库。add命令主要过程是
-
保存变更文件:压缩变更文件为二进制文件,并保存在git版本库中的objects下(还会重新计算当前内容的SHA1哈希值为文件名)
git hash-object -w test.txt
-
记录变动:git将所有变更文件记录在暂存区stage
git update-index
合起来就是保存变更文件以及变更记录到版本库
commit
git commit -m "first commit"
commit可以认为是生成保存了项目的快照,项目的历史正是由这一个个的快照组成,拥有了快照,git可以将项目恢复到任意一个快照。
-
记录谁提交:设置一下用户名和 Email
$ git config user.name "用户名" $ git config user.email "Email 地址"
-
保存当前目录结构:
# 将当前目录结构生成git对象 $ git write-tree
-
将目录结构,提交者、说明写入版本历史
branch
分支是指向某个快照的指针,使用HEAD指向当前分支最近一次快照(每一个分支指针都是一个文本文件,保存在refs/heads)
HEAD^: HEAD前一个快照
HEAD~6: 前第6个快照
merge
merge
假设存在下面节点,并且当前在master
那么git merge topic
就会从topic、master重合点E开始将topic E之后的A,B,C与master中E节点之后的F、G合并为H节点
git merge --abort: 尝试重建合并前的状态(无法恢复未commit文件)
可以使用
git stash
将未commit文件暂时存储,在解决冲突之后使用git stash pop
将commit文件还原
pull
pull实际上可以等于fetch+merge
git pull remoteHostName remoteBranch:localBranch
fetch
就是将远程分支的最新commit的commit_id记录到本地的.git/FETCH_HEAD文件
git fetch origin originBranch:localBranch
实际操作中,pull会比对本地以及远程FETCH_HEAD版本号,若相同才会pull代码下来,并与本地分支合并。
Ref
- https://www.jianshu.com/p/58a166f24c81
- https://www.daolf.com/posts/git-series-part-1/