版本管理 回溯
- Git使用全量存储版本回溯方案
- 项目根目录的.git目录中存放了不同版本文件及数据
- Git使用sha1函数对文件内容计算,生成的值作为文件名
- sha1将原始内容计算等到一个40位长16进制数值串
- 多份数据对应的sha1值有可能相同,但概率极小,所以一般认为它是唯一的
-
Git采用树结构来构造目录结构的对应关系,树结点为目录,叶子结点为文件;如下图所示:
- 树结构同时包含了【目录结构】、【文件名称】和【它们对应的sha值】,所以本质上讲它完整描述了一个目录或文件在某一时间点上的全部信息,就像【快照】一样
- Git的commit操作会创建这种【快照】
- 树结构除了记录目录的信息外,还会记录提交人信息和上次提交的sha1值;这样可以将每次提交以指针队列的形式记录下来,以形成完整的修改历史
- 通过在【提交】链节点间的切换,来实现版本【回溯】
- Git中,版本切换由HEAD文件指向实现
- Git中,代码目录和版本库之间有个暂存区(.git目录中的index文件)
版本管理 协同
- Git中使用[push]命令将本地版本库代码推送到服务器,通过[pull]将服务器代码拉取到本地
版本管理 并行分支
- Git采用【分支】概念来支持多种修改历史
- 初始化Git时,它会创建一个默认分支【master】
- Git合并分支包括:merge(合并)和rebase(变基)两种合并方式
- merge合并是将创建分支之前的共同祖先和各分支的最终提交,将他们进行一次性合并后,创新一个新的提交,master会指向这个新的提交
- rebase提交会将其中一个分支的修改生成补丁,然后在其他的分支上应用这个补丁,从而生成一个新的提交
Git常用命令
-
git init
初始化项目 -
git add filename
将指定文件或目录放入暂存区 -
git reset HEAD -- filename
从暂存区移除某个文件或目录 - .git目录中objects目录用来存放文件的全量历史数据
-
git cat-file
查看存储在objects目录下的所有对象 - .git目录中的index文件就是【暂存区】
-
git ls-files --stage
查看暂存区的内容,其中包含了暂存的文件名和其对应的sha1值 - .git目录中的【HEAD】文件描述了当前分支上的Head的位置
- HEAD文件中放置的是一个引用地址,在commit提交前,这个引用地址是不存在的
-
git commit -m 'message'
用于将暂存区内容提交到仓库,-m参数用来描述本次提交,提交前需设置好提交人的信息,否则提交会报错 -
git status
用于查看本地文件的修改和暂存区的情况 -
git branch name
创建新分支 -
git checkout name
切换到某个分支,-b选项可以创建一个新分支并进行切换 -
git merge branchname
合并某分支 -
git merge --abort
放弃上一次合并,使文件恢复到上次合并之前的状态 -
git log
查看git 操作日志,可以查看到每次提交记录
Git 远程操作
-
git clone repo
将远程仓库复制到本地,repo为远程仓库的地址 -
git remote
检查所有关联到当前仓库的远程仓库 -
git remote show name
查看名为name的远程仓库详细信息 -
git remote add name remoteUrl
关联远程仓库,name参数为仓库别名,remoteUrl为远程仓库URL -
git pull name branch
拉取远程仓库到本地,name参数为remote add时指定的name,branch为远程仓库的branch -
git push name branch
推送本地变更到远程仓库,参数同上 -
git stash
将当前进行到一半的工作保存到暂存区域,然后将当前目录回滚到上一次提交的状态 -
git stash apply
将之前git stash放到暂存区的修改切回来 -
git stash list
把所有放在暂存区的修改都列出来