欢迎来到天天文库
浏览记录
ID:63508187
大小:12.69 KB
页数:4页
时间:2021-09-08
《六百字读懂 Git_》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、六百字读懂Git_【译注】:来自HackerSchool的MaryRoseCook实现了一个纯JavaScript写就的Git:Gitlet,包含了最主要的一些指令。这个项目一是为了了解Git内部原理,二是盼望写一篇深化浅出说明Git核心概念的短文。学习一件东西的原理最好的方法就是去亲自实现它,而设计精致的Git核心功能代码也不过300行。这就是这篇精致的小文:Gitin600words,相应的代码在Github上。短文很好玩,思路清楚也足够深化,值得一看。设想你现在位于alpha/名目下,这里有一个文本文件number.txt,里面的内容只有一个词:“first”。现在执行giti
2、nit将这个alpha文件夹初始化为Git仓库。执行gitaddnumber.txt会将number.txt添加到Git的索引(index)中。这个索引记录了全部Git保持追踪的文件,现在它有了一个映射记录number.txt-first,同时add指令还会把一个包含了first字符串的二进制对象加入Git的对象数据库里。现在执行gitcommit-mfirst。这条指令会做三件事情。首先在对象数据库内创建一个树对象,用以记录alpha名目下的文件列表,这个对象有一个指针指向前面gitadd指令创建的first二进制对象;其次,这条指令还会创建一个commit对象用以代表刚刚提交的版
3、本,它包含一个指针指向刚刚的树对象;第三,master分支也会指向这个新创建的commit对象。现在执行gitclone.../beta。它会创建一个新名目beta并将其初始化为Git仓库,然后把alpha仓库的对象数据库中全部对象拷贝给beta的对象数据库,将beta的master分支像alpha的master一样指向相应的对象。它还依据first提交的内容配置索引,并依据索引更新名目下的文件——也就是number.txt。现在切换到beta名目,修改number.txt的内容为“second”,执行gitaddnumber.txt和gitcommit-msecond,新创建的提交
4、对象second(译注:姑且称之为second)会有一个指向父提交(first)的指针,表示second继承自first,而master分支则指向second提交。回到alpha名目,执行gitremoteaddbeta../beta,将beta仓库设为远程仓库。然后执行gitpullbetamaster。在这条指令背后,它其实会执行gitfetchbetamaster,从beta仓库中找到second提交的相关对象拷贝到alpha仓库;把alpha中关于beta的master分支记录指向这个second提交;更新FETCH_HEAD指向刚刚从beta仓库拉取的master分支,还是
5、这个second提交。此外,pull指令还会执行gitmergeFETCH_HEAD。从FETCH_HEAD得知最近拉取的分支是beta仓库的master分支,据此拿到相应的对象,也就是second提交对象。此时alpha的master分支指着first提交,正好是second的祖先提交,于是对于merge指令来说只需要将master分支指向second提交即可。接下来merge指令还会更新索引以匹配second提交的内容,并且相应更新工作名目中的文件。现在执行gitbranchred,创建一个名为“red”、指向second提交的新分支。然后执行gitcheckoutred。在ch
6、eckout之前,HEAD指向master分支,执行指令之后它就指向了red分支,使得red成为当前分支。接下来把number.txt的内容修改为“third”,执行gitaddnumbers.txt和rungitcommit-mthird。之后再执行gitpushbetared,这条指令会把alpha仓库内跟third提交相关的对象拷贝至beta仓库,并且将(alpha仓库内记录的)beta仓库red分支指向third提交。就酱。更多信息请查看IT技术专栏...
此文档下载收益归作者所有