1.版本控制工具
跟踪源代码或其他文件的修改记录的工具
支持多人协作
原理:通过维护一系列快照实现;额外维护了作者及提交时间戳等元数据
1.1 底层数据模型
git将历史记录建模为某个顶层目录中的文件和文件夹的集合。
目录称为“tree”,文件称为“blob”
(1)使用有向无环图来模拟历史。
之所以使用图结构而非线性结构,是因为可以并行进行不同功能的开发工作,例如,有一个可以正常运行的基础版本,有人进行添加新功能的工作,有人进行修复bug的工作,这些最好可以并行进行,不互相打扰。最后再进行合并工作。
- 出现合并冲突如何解决(修复bug的工作影响到新特性或新特性的实现掩盖了之前的bug)?
会报告合并冲突,需要用户自己决定
(2)git内部如何表示这个数据结构
Commit代表快照,合并提交有多个父节点,额外元数据,snapshot里面存放真正的内容
git维护了一个对象的哈希表objects
。对象可以是blob、tree和commit(快照)。通过哈希表存储对象或检索对象。对象id通过哈希函数(例如SHA-1)生成。
哈希表负责实际对象的存储,在commit的数据结构中的元素,实际上都是指针形式,指向实际元素,因此代价不高。
(3)SHA-1生成的是40大小的16进制字符串,这些ID对人类来说不易查看。
使用哈希表映射一个人们便于理解的字符串。称为引用(refs)
1.2 常用命令
-
git init ,初始化仓库,会创建.git目录,所有的仓库数据将存放在objects和refs两个目录下。
默认会创建一个名为"master"的引用,代表代码中的主开发分支
“HEAD”是git中的特殊引用,指向你当前正在查看的提交 -
git status ,查看仓库状态
-
git add filename;添加跟踪文件
(1)git有一个称为staging area(暂存区)来保存下一次创建快照时应该保存的更改;新创建的文件一般是Untracked files(未跟踪),即在下次快照中不会保存此文件。
(2)跟踪的文件修改后,也需要暂存 -
git commit, 创建快照,会启动文本编辑器,编写提交消息
并且会输出结点的哈希值,例如a15cebf -
git cat-file -p 哈希值,可以查看该哈希值对应对象
-
git log,可以查看版本历史记录(以线性形式)
git log --all --graph --decorate;以图的形式显示
git log --all --graph --decorate --oneline;信息更精简 -
git checkout 哈希值;改变当前工作目录的状态到指定的那个提交
git checkout 其他引用(例如master);实际上是移动了HEAD指针,并根据该指针改变了当前工作目录的内容 -
git diff filename;显示自HEAD指向的快照以来发生了哪些改变
git diff 哈希值 filename;显示自指定快照以来发生的改变
git diff 哈希值 哈希值 filename;显示两个指定快照之间发生的改变 -
git branch;列出本地所有分支;访问分支作用
git branch 新分支名;创建一个新的分支,新分支名目前只是一个指向当前位置的引用
需要注意的是:若像向上面一样的结点图,进行并行开发,需要在master处创建两个分支,分别修改后,master对这些分支逐一合并。 -
分支切换
git checkout 分支名;切换到其他分支
git checkout -b 新分支名;创建并切换到新分支 -
git merge;分支合并
出现分支冲突,需要手动调整,注意修改文件后需要重新添加到暂存区
git merge --continue;解决分支冲突后继续执行
1.3 远程仓库
-
git remote;列出当前仓库所知道的所有远程仓库
git remote add < name> < url>;添加远程仓库,如果只使用一个仓库,使用名称为origin -
git push < remote> < local branch >:< remote branch >;在远程仓库创建一个新分支或更新上面的分支,改为本地指定分支的内容
-
git fetch;获取仓库最新更改,不会更改本地历史记录及本地引用