https://missing.csail.mit.edu/https://missing-semester-cn.g...https://www.bilibili.com/video...笔记Git的数据模型Git通过一系列的快照来管理它的历史。快照是被跟踪的最顶层树。将gitcommit视为创建快照。类型对象=blob|树|commit//文件是一组数据类型blob=array//包含文件和目录的目录typetree=map//每个提交包含一个Parent,元数据和顶级树类型commit=struct{parent:arrayauthor:stringmessage:stringsnapshot:tree}//还有引用(reference),比如//HEAD,master,origin/HEAD,origin/master//都是引用//引用是指向提交的指针。与对象不同,它们是可变的(可以更新引用以指向新的提交)。事实上,当Git存储数据时,所有对象都会根据它们的SHA-1散列进行寻址。Blob、树、commit都是一样的,都是对象。当它们引用其他对象时,它们实际上并不将这些对象存储在磁盘上,而只是将它们的散列存储为引用。比如上面代码中的parent:array其实并不是一个commit数组,而是一个hash值数组,而这些hash值指向的是真实的对象,也就是一些commit。objects=mapdefstore(object):id=sha1(object)objects[id]=objectdefload(id):returnobjects[id]Forexample,gitcat-file-p698281b(698281bissometree,也就是某个文件夹的哈希值的一部分前缀)的结果是:100644blob4448adbf7ecd394f42ae135bbeed9676e894af85baz.txt040000treec68d233a33c5c06e0340e4c224f0afca87c8ce87foo而gitcat-file-p4448adb(4448adb是baz.txt的哈希值的一部分前缀)isthecontentofbaz.txte.Git的命令行界面历史:gitlog--all--graph--decorate--oneline:可视化历史(有向无环图),zsh的git插件定义了很多别名,比如这个命令的别名是gloga,别名为去掉--allisgloggitdiff:显示上次提交和gitdiff[]:显示一个文件两个版本之间的差异Difference,new-revision默认为HEADgitdiff--cached:不带cached标志的diff表示显示没有暂存的变化。添加后,是查看已经暂存的内容,下次提交时会添加修改、撤消、合并:gitadd-p:交互式暂存,例如可以按s键拆分交互过程,选择是否将文件中各处的变化暂存。gitcheckout--:Discard(Notyettemporarystored)修改gitreset[]:取消暂存,把文件从暂存区放回工作区,默认为HEADgit重置[--soft|--混合[-N]|--硬|--合并|--keep][]:(见下图)撤销commit,把commit放回暂存区(soft),或者放回工作区(mixed),或者丢弃(hard),本质就是移动HEAD。在过期分支上开发时,执行rebase同步master分支的最新变化。gitrebase-iHEAD~n:交互式rebase,可用于修改提交信息,合并提交等gitmergetool:使用工具处理合并冲突gitstash:临时存储工作空间,允许你切换到其他分支,博主有时走错了路修改完成后,会使用这个命令暂时保存修改,然后切换到正确的工作分支,使用gitstashpop远程操作:gitclone--shallow:克隆仓库,但不包括版本历史信息gitremoteadd:添加远程gitpush::将对象传到远程并更新远程引用gitbranch--set-upstream-to=/:建立本地和远程分支的关系others:.gitignore:指定故意不跟踪的文件gitblame:查看最后修改一行的人gitbisect:通过二分查找查找历史gitinit--bare:几乎没有用到,在课程视频中,讲师在一个空文件夹中使用这个命令,将这个文件夹作为远程,然后将一个已有的仓库推送到这个文件夹中gitconfig--globalcore.excludesfile~/.gitignore_global:在~/.gitignore_global中创建全局忽略规则从存储库中删除敏感数据杂项GUI:Git有许多GUI客户端,但我们自己不使用这些GUI客户端,我们选择使用命令行界面的Shell集成:它是将Git状态集成到您的shell(zsh、bash)中非常方便。此功能通常集成在OhMyZshEditorintegration之类的框架中:与上述类似,将Git集成到编辑器中有很多好处。fugitive.vim是在Vim中集成GIt的常用插件工作流程:我们已经解释了数据模型和一些基本命令,但是我们还没有讨论在处理大型项目时的一些约定(有很多不同的方式)GitHub:Git不等同于GitHub。在GitHub中你需要使用一种叫做拉取请求(pullrequest)的方法来为其他项目贡献代码OtherGitProviders:GitHub并不是唯一的。还有像GitLab和BitBucket这样的平台。资源ProGit,强烈推荐!学习前五章的内容可以教会你流利使用Git的大部分技巧,因为你已经了解了Git的数据模型,后面的章节提供了很多有趣的进阶话题(ProGit中文版)如何写出好的Git提交信息是一个高度可定制的工具OhShit,Git!?!,简短介绍如何从Git错误中恢复;GitforComputerScientists,简要介绍Git的数据模型GitfromtheBottomUp,详细介绍Git实现细节,不仅仅局限于数据模型HowtoexplaingitinsimplewordsLearnGitBranchingLearningGitthroughabrowser-basedgame家庭作业练习2谁最后修改了README.md文件?$gitlog--all-n1--pretty=format:"%an"README.md当最后修改_config.yml文件中的collections:行时,提交消息是什么?$gitblame_config.yml|grep“集合:”|头-n1|awk'{print$1}'|sed-E"s/\^//"|xargsgitshow#或$gitblame_config.yml|grep“集合:”|头-n1|awk'{print$1}'|sed-E"s/\^//"|xargsgitlog-n1--pretty=format:"%s%n%n%b"