本文共 6582 字,大约阅读时间需要 21 分钟。
git的对象类型,以及目录下的基本属性和说明 git目录中的内容变化后的追踪方式,工作目录一般以项目名称命名
可用直接yum安装,属于base仓库 创建一个目录作为项目 获取一个git的仓库,repo两种,第一种从头初始化创建,第二种把别人仓库拿过来 、从零开始创建用 git.init初始化一个git仓库,自动生成.git目录,git目录下会有很多内容,包括子目录 所有的对象都在objects目录下,多个文件如果属于同一个内容,可能会打包pack以后放在pack目录下 refs是引用,下面会有heads ,tags标签名称, 真正的分支branches,一个项目会有多个分支,主线分支称为master 基于稳定版,修改bug,继续提交做一个分支为特性开发,修bug,也是新起一个分支修改,毕竟也要添加新的代码,测试确定没问题了再确定到主干分支上,所以分支是还可以合并的,稳定版0.0.1的下一个版本0.0.2,这就叫branch 对于git而言开分支非常轻量,资源消耗非常小 也有可能 分支分开以后,从此一路狂奔,第一个分组织维护A类功能,第二个分支维护的是B类功能,分支也有可能不会合并1个项目可能会有很多很多的分支, 这些分支信息都在git库中,想为主干工作时,就需要把你的工作目录切换成主干,如果打算做新特性开发,就切换到dev分支上,主分支master hotfix 修复分支,工作目录再某一时刻只能反应一个分支内容,所以当前的工作目录时服务于dev分支的,这里显示的内容都是dev分支的内容,也可用服务于master分支,分支的切换使用git的checkout,捡出分支,切换分支 最核心的组件有4类对象 Git的对git的对象类型: .都保存再git/objects目录下 块(blob)对象:文件的每个版本表现为一个块(blob); 树(tree)对象:一个目录代表一层目录信息; 提交(commit)对象:用于保存版本库一次变化的元数据,包括作者、邮箱、提交日期、日志;每个提交对象都指定一个目录树对象; 标签(tag)对象:用于给一个特定对象一个易读的名称;每个项目反应再工作目录中,这个目录有两部分组成 1.工作区(自己编辑文件的地方) 2.,git目录,是对应的版本库,如果克隆的别人的项目,应该有.git目录,直接就有,如果自己从头新建一个项目,就需要我们自己初始化这个目录来,
config 配置文件,, head,hooks钩子(sample,可以理解为一些触发器,跟代码构建有关),info,objects,refs 工作区是我们真正工作的位置,一旦把内容编辑到工作区以后,就可以尝试把内容存到版本库里 工作目录中三个区,工作区,暂存区,对象库本地版本库 暂存区,索引文件 有两个区的版本再git版本库中 一个区域,对象库, 另外一个区域叫索引,也称为暂存区 state **刚刚初始化的时候再工作目录创建两个文件, ** 假如想要用版本库来追踪这两个文件,,就放到暂存区中,git add命令,可以实现把工作目录中的两个文件,添加到暂存区(索引),用于反应当前追踪的但还没提交的工作目录中的路径结构, 索引其实就是一个待提交的树状路径,保存是一个树状状态(目录子目录和文件内容,引用关系),但是这是一个未提交的状态信息,一旦提交就把索引中的目录路径,保存到对象库中去了, 因为提交本身也是个对象 **工作目录只要添加到了打算存储的对象当库,当前如果没有提交,待提交的树状结构就保存在索引(暂存区)当中,如果一旦使用git commit命令提交了,这个索引树状结构保存到对象库中,树状对象 ** 这个是提交对象,提交本身要指向你的工作目录,根树 加入有文件改变了,再次还需要保存下来,一旦文件发生变化,就需要暂存了,暂存时对应的索引中,改变的文件指向了新对象,原有文件指向原有的 意味着索引这棵数所反映 的指向状态,跟上次提交已经不一样了,换一个颜色来表示, 假如现在再次提交,对象又保存到对象库里去了,因此现在有了两个树对象,不同的是 第一个树对象指向的是第一个版本 第二个数对象指的是A文件的第二个版本,B文件的第一版本 这时候的提交对象指向第二个数 第一个对象是第二个对象的前任 所以在三个区域中,文件可以通过git add把文件从工作目录添加到暂存区 ,使用git commit可以把文件从暂存区放到版本库中去 ,在版本库中,从而可以创建 ,两个对象至少,一个跟树对象,一个提交对象, 如果一个文件放到暂存区,现在不想要了,可以使用git rm --cached 撤回放在此前放在暂存区中的操作, 现在有两个文件对象,有两个文件在工作区中,这两个文件要添加到版本库上,去追踪它们,如果想要版本库 中 git add 添加进来 man帮助,查看git-add是做什么的,add file contents to the index 只是放到缓存区里 **一次通常放一个文件,如果想要一下子把当前文件都放进去可以git -add +目录路径,会把指定目录下的所有文件,有些文件内容可能不想保存进去, 比如,vim编辑文件都会生成.xxx的临时文件,在.git目录下,创建一个.git ignore文件,里面列出哪些文件不需要存放到仓库里去,叫git的忽略文件 ** 用于更新索引,,current content 根据当前工作目录中所发现的文件(会扫描工作区,),利用工作目录中的文件,去更新队员的暂存区,接下来可提交了,一般都是吧当前目录中 的所有内容通通都添加进去,不过有时候也可以是单独的文件单独添加 暂存区维持一个当前工作目录的快照。一旦放到暂存区,就把整个工作目录的文件放对象库中,被做成快照,这个快照并没有保存下来,可以删除,要提交就放到对象库中, 事实上暂存区也是个快照,主要目的就是为了下次的提交,在工作目录中做了任何改变,在真正提交之前,先试用add命令,先放到暂存区中,然后一并提交 这个add命令可以在提交哦之前执行多次,暂存的快照是可以多次提交之后更新的,对git-add的多次重复添加,仅仅是吧同一个文件后续的变化添加进来此前的暂存文件中去 ,如果每一次变化都放到同一个提交当中 , 默认情况下git -add 命令不会忽略任何文件,如果想忽略,需要创建git-ignore文件 -a添加所有文件 现在去添加一个文件 .代表当前目录,这时候.git/objects就有两个路径,63,72 objects目录下多了两个文件对象,其实就是文件内容的哈希码(还包括对象类型和对象大小) 如果改变文件内容 改变一次可以再暂存一次 文件内容不同,对象就发生了改变。,现在还没有提交就保存这么多版本,这里其实是可以允许反悔的,一个对象一旦放到对象库里去,除了手动删除,否则将会一直存在 所以每次暂存都会在object中创建对象 从名字看,blob文件对象和tree对象,并没有什么区别 还可以创建一个docs目录 应该作为新对象被创建出来,但是却没有 要想把目录保存下来,要在里面创建文件,也是一个文件,不然目录没有内容。,就无法形成哈希码 就多了一个文件对象,这个文件对象只是目录的 这个目录下的文件没有内容也是不会被形成哈希码的,要想保存就需要添加内容 空目录和空文件都不会放进来做对象存储的 任何有内容的东西才会被作为对象存储 索引的内容每一次随着add不断发生变化,可以使用git status 发生变化,如果没有创建分支,默认都是master initial commit 首次提交, 不想要暂存某个文件目录,使用git rm --cached,文件删除命令,可以在三个区域中让你删除文件,与默认的rm命令有不同的地方 一旦提交了,在工作目录删除文件,是没有太大意义的,随时可以恢复回来,git rm 只删某个区域的文件 –cached 只从暂存区把文件 删除了,而不是删除工作目录中的内容的 删除文件,提示还有一个文件没暂存passwd,想要提交试用git add加进来 对于git,每一个人提价的时候,都需要标明个人信息,才能允许提交的git有三个配置文件
Git配置文件:git config 仓库特有:REPO/.git/config 仓库的 只对当前一个仓库有效 全局:~/.gitconfig, --global 全局的 当前用户的所有仓库都有效 系统:/etc/git/gitconfig, -system 系统级 对所有用户都有效 user.name, user.email
用户有很多仓库,每一个用户的配置对所有的仓库都有效,每一个仓库都有自己的专门配置
作用范围越大最终生效的优先级越低,同一配置,系统有,仓库有,全局有,以仓库为准 为了能提交必须添加两项配置 user.name用户名, user.email邮件地址 可以直接编辑文件来设定参数,也可以使用gitconfig命令 -l可以列出已有参数,这些内容可能是来自不同的配置文件 需要自己创建一个系统级的配置,现在还没有,所以上面这些配置来自于仓库配置文件 配置文件是一段段的INI格式的,user段的 name参数,user段的 email参数,用户名就就没必要配置成系统级的了,全局即可 全局的应该在用户的家目录下,自动生成.gitconfig文件 设定好了,接下来就可以提交了,查看 git-commit命令,把暂存区的快照存储到对象仓库中,并且将提交对象指向这个树,暂存区的是一个根树对象 -m提交注释,-F指定文件获取文件内容当提交注释,如果不给,git会打开一个编辑器,让你输入, 如果不想保存暂存区中的信息,使用-- no-status -a/ --interactive进入交互模式 如果后面没有任何信息,回车会打开编辑器让你编辑 只提交了两个文件和docs下的changelog 又多了对象 其实有一个就是提交对象 其实实在master分支的首部, 真正的首部再head上进行定义的 提示工作目录没有README 和chhangelog,如何知道是根据你的最近一次提交跑来决定的,现在想要拿到这个文件,用git checkout,就能把文件恢复了 这些文件其实都在 git checkout 可以把某个文件剪出来 可以剪分支,剪提交 只要有仓库,这些文件其实都可以恢复过来的,恢复的是文件本身没有恢复暂存区,恢复暂存区就需要做分支切换 再master分支上,没什么需要提交的,clean表示所有内容跟你提交的都是一致的,没什么需要再更改的,刚才没提交的passwd就恢复不了 随意你提交什么就可以利用版本控制器恢复什么 但是只要提交过,这个passd其实再.git/objects目录下是存在的 但是没有一个分支可以反应出它,所以没办法使用checkout来剪出这个文件对象库:内容寻址系统; 打包文件:pack file
git ls-files:列出文件; -s:列出暂存区(stage area)中的文件对象 git cat-file:查看文件; -p:美观排版显示文件内容; git hash-object:计算文件的hash码; git write-tree:根据当前索引中的内容创建树对象;
列出暂存区文件,暂存区就是你工作目录的快照,添加文件,如果没有添加暂存区,暂存区里是没有的 status会提示你有个文件还没有添加 add 就添加到暂存区去了 添加之后在暂存区里就有group了
这里面的肯定有一个文件是group对象生成的,可以使用git-hash来计算文件的哈希ma 现在想要知道1D文件内容是什么,git cat-file 一般最小长度6个 git write-tree:根据当前索引中的内容创建树对象;每一次提交都创建树对象,不想提交就创建树对象,给它保存到对象库里 git文件有三种分类 Git中的文件分类: 3类: 已追踪的(tracked):已经在版本库中,或者已经使用git add命令添加至索引中的文件; 被忽略的(Igored):在版本库中通过“忽略文件列表”明确声明为被忽略的文件;明确说明不要追踪的文件 未追踪的(untracked):上述两类之外的其它文件;在工作目录里有,但是还没有添加到暂存区里的如果添加到仓库里,想要做额外操作 add/rm/mv命令: git add:暂存文件; git ls-files: 默认显示索引中的文件列表的原始文件名; -s:显示暂存的文件信息:权限、对象名、暂存号及原始文件名; -o:显示未被追踪的文件;暂存区没有,但是工作目录里是有的
git rm: git rm:删除工作目录中的文件,及索引中的映射;(对象库无论任何时候,都无法被删除,必须留着给我们恢复) git rm --cached:只删除索引中的映射;
git mv: git mv:改变工作目录中的文件名,及索引中的映射;重命名直接用mv会提示是新文件,要想重命名,既要工作区重命名,又要暂存区重命名,git mv
当作同一个文件 所以放在git的文件就不能随意的重命名或者删除,必须使用git的专门的命令 git mv git rmgit checkout +标签名v0.1,要想给提交添加标签 git tag
添加标签,git tag+tagname +添加到哪个提交上去,也可以在提交的同时创建标签 git log 查看最近一次提交的, commit +提交名,git tag 添加标签 ! 查看标签在哪里 捡出结果,由于没有追踪,所以没有覆盖掉 工作区的文件反应的就是提交的文件】 、 添加到暂存区了,现在想回到过去某个时刻,告诉了你readme是M修改状态,再次使用git status,可能需要区add readme 因为这个是存在的文件,就基于所谓的修改状态来进行描述 如果提交过了,goup和readme可能就是另外的状态 如果提交过了,goup和readme可能就是另外的状态 捡出0。1,文件内容就发生改变了 所以提交过了,在对象库保存了,捡出提交的时候,要完整的反应出这个提交的内容来,现在的readme是没有第三行的 刚才的是暂存区的内容,是没有提交过 checkout 0.1其实就是i找对应标签指向的提交,就把或者提交树读出来 现在可以捡出0,3,readme就有第三行了 每一次提交都要指向前一次提交,其实有可能前任不止一个,分支是有可能合并的,这个提交的前任就有两个 分支是可以创建出和合并起来的,创建分支,使用branch命令或者 checkout -b,head就指向了这个新分支 接下来创建新内容,head就指向c2 还可以切换成master分支,使用checkout master c1上面可以继续想外演进 默认分支是master 使用使用checkout -b 指明你的new branch 默认创建分支的时候是不会切换的 -l login list 列出你的分支,创建一个分支,现在都属于当前的提交,创建分支的时候也可以从过去的位置开始 checkout是可以同时创建新分支,如果已经存在分支,可以直接切换 ** 号所在的表示当前分支,还可以切换回master 创建分支和分支切换的简单使用逻辑,以后可以在一个分支上往下继续提交了* 当前分支是master,创建一个文件,使用commit做一次新的提交 我们之前切换的时候v。0.1上,意味把v。0.2.0忽略掉了,等于往前开了一个新分支 每一次切换,当前工作目录反应的就是切换当前分支的那一次提交 分支也可以合并,使用git merge,一般是把外部的分支合并的当前分支上,以当前分支为准 dev有group文件,master分支有issue,现在可以合并,这个合并会一定产生一个新提交的 所在master分支合并了dev来生成的 master分支是有0.2.0的 这个master 已经是把dev合并后的master了,合并了的前任有两个了转载地址:http://uckgn.baihongyu.com/