版本控制版本控制就是记录项目文件的历史变化。它为我们查阅日志,回退,协作等方面提供了有力的帮助。
版本控制一般分为集中化版本控制和分布式版本控制。
集中化主要的版本数据都保存服务端。
分布式版本数据分散在多端。
GitGit属于分布式版本控制,也是现在比较流行的一种版本管理工具。
Git项目有三个区块:工作区/暂存区/版本库
工作区存放从版本库提取出来的文件,供我们编辑修改;
暂存区保存了下一次要提交的目录信息;
版本库保存项目版本元数据和Objects数据,后文会详解。
Git工作流程
上传====add====commit====push发生冲突会出现冲突标记“HEAD40=======4141”发生冲突会出现冲突标记“HEAD40=======4141”重置到指定版本,之前提交内容将丢失gitreset--hardHEAD重置到指定版本,保留所有改动文件gitreset–softHEAD
特别注意当你使用“gitreset--hardHEAD”重置到某一版本,发现搞错了想回退。这时你可能会执行“gitlog”,但是发现已经没有以前的版本记录,怎么办?送你一瓶后悔药如下
找到最左边对应hash值就可以回退到任意位置gitreset--hard{index}如果想撤回文件修改内容且文件尚未提交,执行下面命令
gitcheckout--file
如果创建的分支名称需要更改
gitbranch-moldnew还原最近一个提交gitrevertHEAD还原倒数第第四个gitrevertHEAD~3
版本库Objects这一节介绍一下Git版本库的存储模型。
项目历史变动信息都记录在object文件。文件名称是通过哈希算法(这里是SHA1(对象内容))产生的40位字符。
这种做法的一个优点就是“在对比两对象是否相同时,只需要比较文件名称就能迅速得出结果”
object文件分blobtreecommittag四种类型
blob存储文件数据,一般是一个文件;
tree存储目录和树的引用(子文件目录);
commit存储单一树引用,时间点,提交作者,上一次提交指针;
tag标记特定的commit比如说发版。
BlobBlob是二进制数据块,不会引用其它东西。如果目录树(或存储库中多个不同版本)中的两个文件具有内容相同,它们将共享相同的Blob对象。
TreeTree存储blob和tree的引用。
指定生成的文件ssh-keygen-trsa-b4096-C"email@"-f~/.ssh/id_rsa_example配置多个远程仓库touch~/.ssh/config建议配置windowsmac换行符不统一问题配置全局忽略文件gitconfig–list罗列本地所有分支gitbranch--all罗列远程所有分支gitbranch-v切换分支gitcheckout-bnewbranchname推送新分支到远程gitcheckout-moldbranchnewbranch删除本地分支gitpushorigin--deletebranchname罗列本地所有标签gitshowtagname创建标签gitpushorigintagname删除本地标签gitpush--deleteorigintagname#删除远程标签
总结工作多年以来一直在使用Git,但是对Git没有一个系统了解,所以写这篇文章归整一下。