还剩23页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
Git学习总结电脑资料支持离线工作;本地提交可以稍后提交到效劳器上,Git中的每个工作树都包含一个具有完整工程历史的仓库没有哪一个Git仓库会天生比其他仓库更重要Git跟SVN一样有自己的集中式版本库或效劳器Git是分布式的,SVN不是,这是Git和其它非分布式的版本控制系统(SVN,CVS)最核心的区别每个开发人员从中心版本库的效劳器上checkout代码后会在自己的机器上克隆一个自己的版本库如果你被困在一个不能连接网络的地方时,就像在飞机上,地下室,电梯里等,你仍然能够提交文件,查看历史版本记录,创立工程分支等(无网络也能)开源软件:创立一个分支,向工程团队发送一个推请求就能将你的代码发送给工程团队.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签、分支、版本记录等Git分支和SVN的分支不同分支在SVN中一点不特别,就是版本库中的另外的一个目录如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svnpropgetsvn:mergeinfo,来确认代码是否被合并git你可以从同一个工作目录下快速的在几个分支间切换你很容易发现未被合并的分支,你能简单而快捷的合并这些文件SVN的版本号实际是任何一个相应时间的源代码快照,它是从CVS进化到SVN的最大的一个突破Git可以使用SHA-1来唯一的标识一个代码快照Git的内容完整性要优于SVNGit的内容存储使用的是SHA-1哈希算法这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏
(1)版本库模型:有客户端/效劳器和分布式两种模式在客户端/效劳器模式下,每一用户通过客户端访问位于效劳器的主版本库,每一客户机只需保存它所关注的文件副本,对当前工作副本(workingcopy)的更改只有在提交到效劳器之后,其它用户才能看到对应文件的修改分布式模式下,这些源码版本库副本间是对等的实体,用户的机器出了保存他们的工作副本外,还拥有本地版本库的历史信息历史版本信息
(2)并发模式描述了当同时对同一工作副本/文件进行更改或时,如何这种冲突以防止产生无意义的数据,有排它锁和合并模式在排它锁模式下,只有发出请求并获得当前文件排它锁的用户才能对对该文件进行更改而在合并模式下,用户可以随意或更改文件,但可能随时会被通知存在冲突(两个或多个用户同时同一文件),于是版本控制工具或用户需要合并更改以解决这种冲突
(3)历史模式描述了如何在版本库中存贮文件的更改信息,有快照和改变集两种模式在快照模式下,版本库会分别存储更改发生前后的工作副本;在改变集模式下,版本库除了保存更改发生前的工作副本外,只保存更改发生后的改变信息
(4)变更范围描述了版本编号是针对单个文件还是整个目录树
(5)网络协议描述了多个版本库间进行同步时采用的网络协议
(6)原子提交性描述了在提交更改时,能否保证所有更改要么全部提交或合并,要么不会发生任何改变
(7)局部克隆是否支持只拷贝版本库中特定的子目录名称版本库模型并发模式历史模式变更范围网络协议原子提交性局部克隆CVSClient-serverMergeChangesetFilePserversshNoYesSVNClient-server3-waymergerecursiveChangesetandcustomsvncustomsvnoversshmergeoctopusmergeSnapshotTreeandSSLusingWebDAVYesYesGitDistributedMergeorlockSnapshotTreecustomcustomoversshrsync/SemailbundlesYesNo第一种是在现存的目录下,通过导入所有文件来创立新的Git仓库在工作目录中初始化新仓库要对现有的某个工程开始用Git管理,只需到此工程所在的目录,执行$gitinit第二种是从已有的Git仓库克隆出一个新的镜像仓库来初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改这里克隆,Git会自动为你将此远程仓库命名为origin,并下载其中所有的数据,建立一个指向它的master分支的指针,在本地命名为origin/master,但你无法在本地更改其(远程仓库)数据在克隆仓库时,Git通常会自动创立一个名为master的分支来跟踪origin/master这正是gitpush和gitpull一开始就能正常工作的原因接着,Git建立一个属于你自己的本地master分支,始于origin上master分支相同的位置,你可以就此开始工作从现有仓库克隆,这里使用的是clone而不是checkoutGit收取的是工程历史的所有数据(每一个文件的每一个版本),效劳器上有的数据克隆之后本地也都有了命令格式为gitclone[url],当前目录下创立一个名为“grit”的目录,其中包含一个.git的目录gitclone命令本质上就是自动创立了本地的master分支用于跟踪远程仓库中的master分支(假设远程仓库确实有master分支)(克隆操作会自动使用默认的master和origin名字)拷贝一个Git仓库到本地,让自己能够查看该工程,或者进行修改$gitclonegit://github./schacon/grit.git如果希望在克隆的时候,自己定义要新建的工程目录名称,可以在上面的命令末尾指定新的名字$gitclonegit://github./schacon/grit.gitmygrit开始或停止跟踪某些文件如果当前目录下有几个文件想要纳入版本控制,需要先用gitadd命令告诉Git开始对这些文件进行跟踪,然后提交$gitadd*.c$gitaddREADME$gitmit-minitialprojectversiongitadd的潜台词就是把目标文件快照放入暂存区域,也就是addfileintostagedarea,同时未曾跟踪过的文件标记为需要跟踪我们手上已经有了一个真实工程的Git仓库,并从这个仓库中取出了所有文件的工作拷贝接下来,对这些文件作些修改,在完成了一个阶段的目标之后,提交本次更新到仓库要确定哪些文件当前处于什么状态,可以用gitstatus命令如果在克隆仓库之后立即执行此命令,会看到类似这样的输出$gitstatus#Onbranchmasternothingtomitworkingdirectoryclean当前没有任何跟踪着的文件也没有任何文件在上次提交后更改正当前目录下没有出现任何处于未跟踪的新文件,否那么Git会在这里列出来显示了当前所在的分支会有以下两种状态Changestobemitted:处于staged的文件Changedbutnotupdated:处于modified的文件注一个文件可以同时处于上面两种状态,就是在参加staged的文件又被修改后修改下之前已跟踪过的文件,出现在“Changedbutnotupdated”这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区要暂存这次更新,需要运行gitadd命令(这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等)$gitaddbenchmarks.rb提交更新在此之前,请一定要确认还有什么修改正的或新建的文件还没有gitadd过,否那么提交的时候不会记录这些还没暂存起来的变化提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理每一次运行提交操作,都是对你工程作一次快照,以后可以回到这个状态,或者进行比拟Git提供了一个跳过使用暂存区域的方式,只要在提交的时候,给gitmit加上-a选项,Git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过gitadd步骤$gitmit$gitmit-minitialprojectversion$gitmit-a-maddednewbenchmarksgitstatus的显示比拟简单,仅仅是列出了修改正的文件如果要查看具体修改了什么地方,可以用gitdiff命令它已经能答复我们的两个问题了当前做的哪些更新还没有暂存?有哪些更新已经暂存起来准备好了下次提交?gitdiff会使用文件补丁的格式显示具体添加和删除的行$gitdiff此命令比拟的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容$gitdiff--cached要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用gitdiff--cached命令要从Git中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交用gitrm命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了如果只是简单地从工作目录中手工删除文件,运行gitstatus时就会在“Changedbutnotupdated”局部(也就是未暂存清单)$gitrmgrit.gemspecrmgrit.gemspec$gitstatus删除之前修改正并且已经放到暂存区域的话,那么必须要用强制删除选项-f$gitrm-fgrit.gemspec要移除跟踪但不删除文件,以便稍后在.gitignore文件中补上,用--cached选项即可$gitrm--cachedreadme.txt后面可以列出文件或者目录的名字,也可以使用glob模式比方说$gitrmlog/\*.log递归删除当前目录及其子目录中所有~结尾的文件$gitrm\*~仅仅删除指定目录下的文件而不会递归匹配$gitrmlog/\*.log要在Git中对文件改名$gitmvfilefromfileto运行gitmv就相当于运行了下面三条命令$mvREADME.txtREADME$gitrmREADME.txt$gitaddREADME让Git忽略某些文件,或是名称符合特定模式的文件我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表可以创立一个名为.gitignore的文件,列出要忽略的文件模式要养成一开始就设置好.gitignore文件的习惯,以免将来误提交这类无用的文件$cat.gitignore*.[oa]*~第一行告诉Git忽略所有以.o或.a结尾的文件第二行告诉Git忽略所有以波浪符(~)结尾的文件文件.gitignore的格式标准如下#此为注释–将被Git忽略*.a#忽略所有.a结尾的文件!lib.a#但lib.a除外/TODO#仅仅忽略工程根目录下的TODO文件,不包括subdir/TODObuild/#忽略build/目录下的所有文件doc/*.txt#会忽略doc/notes.txt但不包括doc/server/arch.txt●所有空行或者以注释符号#开头的行都会被Git忽略●可以使用标准的glob模式匹配*匹配模式最后跟反斜杠(/)说明要忽略的是目录*要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反修改最后一次提交,我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了想要撤消刚刚的提交操作,可以使用--amend选项重新提交$gitmit--amend刚刚提交完没有作任何改动,直接运行此命令的话,相当于有时机重新提交说明,但将要提交的文件快照和之前的一样$gitmit--amend-mmessage如果刚刚提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行--amend提交$gitmit-minitialmit$gitaddforgottenfile$gitmit--amend上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容取消已经暂存的文件$gitresetHEADbenchmarks.rbbenchmarks.rb:locallymodified取消对文件的修改该如何取消修改,回到之前的状态(也就是修改之前的版本)呢?$gitcheckout--benchmarks.rb任何已经提交到Git的都可以被恢复即便在已经删除的分支中的提交,或者用--amend重新改写的提交,都可以被恢复查看提交历史,在提交了假设干更新之后,又或者克隆了某个工程,想回忆下提交历史,可以使用gitlog命令查看$gitlog常用-p选项展开显示每次提交的内容差异,用-2那么仅显示最近的两次更新$gitlog-p-2仅显示简要的增改行数统计$gitlog--stat--pretty选项,可以指定使用完全不同于默认格式的方式展示提交历史另外还有short,full和fuller可以用$gitlog--pretty=oneline定制要显示的记录格式$gitlog--pretty=format:%h-%an%ar:%s其他常用的选项及其释义选项说明-p按补丁格式显示每个更新之间的差异--stat显示每次更新的文件修改统计信息--shortstat只显示--stat中最后的行数修改添加移除统计--name-only仅在提交信息后显示已修改的文件清单--name-status显示新增、修改、删除的文件清单--abbrev-mit仅显示SHA-1的前几个字符,而非所有的40个字符--relative-date使用较短的相对时间显示(比方,“2weeksago”)--graph显示ASCII图形表示的分支合并历史--pretty使用其他格式显示历史提交信息可用的选项包括oneline,short,full,fuller和format(后跟指定格式)以及如何从远程仓库拉数据下来或者推数据上去使用图形化工具查阅提交历史相当于gitlog命令的可视化版本在工程工作目录中输入gitk命令后,就会启动,上半个窗口显示的是历次提交的分支祖先图谱,下半个窗口显示当前点选的提交对应的具体差异查看当前配置有哪些远程仓库,可以用gitremote命令,它会列出每个远程库的简短名字在克隆完某个工程后,至少可以看到一个名为origin的远程库,Git默认使用这个名字来标识你所克隆的原始仓库$gitclonegit://github./schacon/ticgit.gitInitializedemptyGitrepositoryin/private/tmp/ticgit/.git/remote:Countingobjects:595done.remote:Compressingobjects:100%269/269done.remote:Total595delta255reused589delta253Receivingobjects:100%595/
59573.31KiB|1KiB/sdone.Resolvingdeltas:100%255/255done.$cdticgit$gitremoteorigin显示对应的克隆地址$gitremote-vorigingit://github./schacon/ticgit.git有多个远程仓库,此命令将全部列出比方在我的Grit工程中,可以看到$cdgrit$gitremote-vbakkdoorgit://github./bakkdoor/grit.gitcho45git://github./cho45/grit.gitdefunktgit://github./defunkt/grit.gitkokegit://github./koke/grit.gitorigingit@github.:mojombo/grit.git要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行gitremoteadd[shortname][url]clone克隆就是默认名字为origin远程仓库名的远程仓库,$gitremoteaddpbgit://github./paulboone/ticgit.git要抓取所有远程仓库有的,但本地仓库没有的信息,可以运行gitfetchpb fetch命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并$gitfetch[remote-name]自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支gitpull命令在跟踪分支里运行gitpull会获取所有远程索引,并把它们的数据都合并到本地分支中来$gitpull要同别人分享目前的成果,可以将本地仓库中的数据推送到远程仓库实现这个任务的命令很简单gitpush[remote-name][branch-name]如果要把本地的master分支推送到origin效劳器上,可以运行下面的命令(克隆操作会自动使用默认的master和origin名字)$gitpushoriginmaster条件只有在所克隆的效劳器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务如果在你推数据前,已经有其他人推送了假设干更新,那你的推送操作就会被驳回你必须先把他们的更新抓取到本地,合并到自己的工程中,然后才可以再次推送跟踪远程分支从远程分支checkout出来的本地分支,称为跟踪分支在跟踪分支里输入gitpush,Git会自行推断应该向哪个效劳器的哪个分支推送数据$gitpush可以通过命令gitremoteshow[remote-name]查看某个远程仓库的详细信息,比方要看所克隆的origin仓库$gitremoteshoworigin它告诉我们运行gitpush时缺省推送的分支是什么Localbranchpushedwithgitpush哪些远端分支还没有同步到本地Newremotebranchesnextfetchwillstoreinremotes/origin哪些已同步到本地的远端分支在远端效劳器上已被删除Staletrackingbranchesusegitremoteprune运行gitpull时将自动合并哪些分支Remotebranchmergedwithgitpullwhileonbranchmaster运行gitpush时缺省推送的分支是什么Localbranchpushedwithgitpush可以用gitremoterename命令修改某个远程仓库在本地的简短名称$gitremoterenamepbpaul移除对应的远端仓库$gitremotermpaul可以在不同分支里反复切换,并在时机成熟时把它们合并到一起而所有这些工作,仅仅需要branch和checkout这两条命令就可以完成因为每次提交时都记录了祖先信息(译注即parent对象),将来要合并分支时,寻找恰当的合并根底(译注即共同祖先)的工作其实已经自然而然地摆在那里了,所以实现起来非常容易新建一个testing分支$gitbranchtesting切换到其他分支,可以执行gitcheckout命令切换分支的时候最好保持一个清洁的工作区域$gitcheckouttesting切换回主分支$gitcheckoutmaster把HEAD指针移回到master分支,并把工作目录中的文件换成了master分支所指向的快照内容Git会把工作目录的内容恢复为检出某分支时它所指向的那个提交对象的快照它会自动添加、删除和修改文件以确保目录的内容和你当时提交时完全一样根据本分支新建并切换到该分支,运行gitcheckout并加上-b参数$gitcheckout-biss53根据对应分支新建并切换到该分支,(origin/serverfix对应分支的名称,也可为远程分支)$gitcheckout-bserverfixorigin/serverfix删除已合并的分支$gitbranch-dhotfix删除尚未合并的分支(强制删除)$gitbranch-dtesting给出当前所有分支的清单$gitbranch查看各个分支最后一个提交对象的信息$gitbranch-v要从该清单中筛选出你已经(或尚未)与当前分支合并的分支,可以用--merge和--no-merged选项查看哪些分支已被并入当前分支(译注也就是说哪些分支是当前分支的直接上游)$gitbranch--merged列表中没有*的分支通常都可以用gitbranch-d来删掉原因很简单,既然已经把它们所包含的工作整合到了其他分支,删掉也不会损失什么查看尚未合并的工作$gitbranch--no-merged由于这些分支中还包含着尚未合并进来的工作成果,所以简单地用gitbranch-d删除该分支会提示错误,因为那样做会丧失数据快进(Fastforward)直接祖先(需要合并的分支是需要被合并分支的直接祖先),如果顺着一个分支走下去可以到达另一个分支的话,那么Git在合并两者时,只会简单地把指针右移非直接祖先需要合并的分支和需要被合并分支分别在两条分支上,Git会用两个分支的末端以及它们的共同祖先进行一次简单的三方合并计算对三方合并后的结果重新做一个新的快照,并自动创立一个指向它的提交对象,它有两个祖先分别指向两条分支$gitcheckoutmaster$gitmergeiss53遇到冲突时的分支合并如果在不同的分支中都修改了同一个文件的同一局部,Git就无法干净地把两者合到一起$gitmergeiss53$gitstatusGit作了合并,但没有提交,它会停下来等你解决冲突要看看哪些文件在合并时发生冲突,可以用gitstatus查阅任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出Git会在有冲突的文件里参加标准的冲突解决标记,可以通过它们来手工定位并解决这些冲突解决冲突的方法无非是二者选其一或者由你亲自整合到一起在解决了所有文件里的所有冲突后,运行gitadd将把它们标记为已解决状态(译注实际上就是来一次快照保存到暂存区域)因为一旦暂存,就表示冲突已经解决认所有冲突都已解决,也就是进入了暂存区,就可以用gitmit来完成这次合并提交合并远程仓库(远程仓库名/分支名)$gitmergeorigin/serverfix实际工作中大体也会用到这样的工作流程
1.开发某个网站
2.为实现某个新的需求,创立一个分支
3.在这个分支上开展工作假设此时,你突然接到一个说有个很严重的问题需要紧急修补,那么可以按照下面的方式处理
1.返回到原先已经到生产效劳器上的分支
2.为这次紧急修补建立一个新分支,并在其中修复问题
3.通过测试后,回到生产效劳器所在的分支,将修补分支合并进来,然后再推送到生产效劳器上
4.切换到之前实现新需求的分支,继续工作(注)当你在使用分支及合并的时候,一切都是在你自己的Git仓库中进行的—完全不涉及与效劳器的交互长期分支,工作流水线(经过测试的提交对象集合被遴选到更稳定的流水线)这么做的目的是拥有不同层次的稳定性当这些分支进入到更稳定的水平时,再把它们合并到更高层分支中去master仅在master分支中保存完全稳定的代码,即已经或即将的代码develop(next)有一个名为develop或next的平行分支,专门用于后续的开发,或仅用于稳定性测试—当然并不是说一定要绝对稳定,不过一旦进入某种稳定状态,便可以把它合并到master里在确保这些已完成的特性分支(短期分支)能够通过所有测试,并且不会引入更多错误之后,就可以并到主干分支中,等待下一次的topic指一个短期的,用来实现单一特性或与其相关工作的分支在提交了假设干更新后,把它们合并到主干分支,然后删除是对远程仓库中的分支的索引它们是一些无法移动的本地分支;只有在Git进行网络交互时才会更新远程分支就像是书签,提醒着你上次连接远程仓库时上面各分支的位置我们用远程仓库名/分支名这样的形式表示远程分支比方我们想看看上次同origin仓库通讯时master分支的样子,就应该查看origin/master分支同步远程效劳器上的数据到本地$gitfetchorigin该命令首先找到origin是哪个效劳器,从上面获取你尚未拥有的数据,更新你本地的数据库,然后把origin/master的指针移到它最新的位置上.要想和其他人分享某个本地分支,你需要把它推送到一个你拥有写权限的远程仓库你创立的本地分支不会因为你的写入操作而被自动同步到你引入的远程效劳器上,你需要明确地执行推送分支的操作对于无意分享的分支,你尽管保存为私人分支好了,而只推送那些协同工作要用到的特性分支运行gitpush远程仓库名分支名$gitpushoriginserverfix取出我在本地的serverfix分支,推送到远程仓库的serverfix分支中去$gitpush[远程名][本地分支]:[远程分支]$gitpushoriginserverfix:serverfix上传我本地的serverfix分支到远程仓库中去,仍旧称它为serverfix分支$gitpushoriginserverfix:awesomebranch通过此语法,你可以把本地分支推送到某个命名不同的远程分支从远程分支checkout出来的本地分支,称为跟踪分支跟踪分支是一种和某个远程分支有直接联系的本地分支在跟踪分支里输入gitpush,Git会自行推断应该向哪个效劳器的哪个分支推送数据在这些分支里运行gitpull会获取所有远程索引,并把它们的数据都合并到本地分支中来Git通常会自动创立一个名为master的分支来跟踪origin/master这正是gitpush和gitpull一开始就能正常工作的原因跟踪分支$gitcheckout-b[分支名][远程名]/[分支名]$gitcheckout--trackorigin/serverfix为本地分支设定不同于远程分支的名字$gitcheckout-bsforigin/serverfix你的本地分支sf会自动将推送和抓取数据的位置定位到origin/serverfix了在效劳器上删除serverfix分支$gitpush[远程名]:[分支名]$gitpushorigin:serverfix用衍合的目的比方某些工程你不是维护者,但想帮点忙的话,最好用衍合先在自己的一个分支里进行开发,当准备向主工程提交补丁的时候,根据最新的origin/master进行一次衍合操作然后再提交,这样维护者就不需要做任何整合工作(如果是merge的话)衍合的分支还是跟在master后面,不会创立新的分支,而且已经merge到了主分支后面(已经整合好了),所以维护者观看后可以直接merge主分支,或者抛弃这次衍合而如果是使用merge的话,你提交的另一个分支,维护者还需要merge到主分支,然后删除这个分支实际上是把解决分支补丁同最新主干代码之间冲突的责任,化转为由提交补丁的人来解决只需根据你提供的仓库地址作一次快进合并,或者直接采纳你提交的补丁有了rebase命令,就可以把在一个分支里提交的改变移到另一个分支里重放一遍$gitcheckoutexperiment$gitrebasemaster衍合也可以放到其他分支进行,并不一定非得根据分化之前的分支但这需要用gitrebase的--onto选项指定新的基底分支master$gitrebase--ontomasterserverclient取出client分支,找出client分支和server分支的共同祖先之后的变化,然后把它们在master上重演一遍先取出特性分支server,然后在主分支master上重演gitrebase[主分支][特性分支]$gitrebasemasterserver使用衍合的原那么一旦分支中的提交对象到公共仓库,就千万不要对该分支进行衍合操作如果把衍合当成一种在推送之前清理提交历史的手段,而且仅仅衍合那些尚未公开的提交对象,就没问题如果衍合那些已经公开的提交对象,并且已经有人基于这些提交对象开展了后续开发工作的话,就会出现叫人沮丧的麻烦checkout Checkoutabranchorpathstotheworkingtree切换到其他分支Trunk软件开发过程中的主线,开发时版本存放的目录,即在开发阶段的代码都提交到该目录上,保存了从版本库建立到当前的信息Branches软件开发过程中的分支,版本存放的目录,即工程上线时的稳定版本存放在该目录中,保存了从版本库的某一特定点(不一定是版本库建立时)到当前的信息分支主要用于在不影响Trunk其它用户情况下进行一些关于新功能的探索性或实验性的开发,待新功能完善后它也可以合并到Trunk中Tagsstagerebase:衍合mit已暂存的文件,staged的文件,下次提交会一并记录到仓库mitted:表示该文件已经被平安地保存在本地数据库中了,Git目录中保存着的特定版本文件,就属于已提交状态modified:已修改表示修改了某个文件,但还没有提交保存,如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态staged:已暂存表示把已修改的文件放在下次提交时要保存的清单中,如果作了修改并已放入暂存区域,就属于已暂存状态;workingdirectory:Git的工作目录从Git目录中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录接下来就可以在工作目录中对这些文件进行stagingarea:暂存区域暂存区域只不过是个简单的文件索引文件,一般都放在Git目录中gitdirectoryrepositoryGit目录:本地仓库该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据gitclone出来的话,就是其中.git的目录;如果gitclone--bare的话,新建的目录本身就是Git目录它是Git用来保存元数据和对象数据库的地方Git工作流程
1.在工作目录中修改某些文件
2.对修改后的文件进行快照,然后保存到暂存区域
3.提交更新,将保存在暂存区域的文件快照永久转储到Git目录中本地版本控制系统诸如rcs集中化的版本控制系统,简称CVCS诸如CVS,Subversion以及Perforce等可以在一定程度上看到工程中的其他人正在做些什么而管理员也可以轻松掌控每个开发者的权限,并且管理一个CVCS要远比在各个客户端上维护本地数据库来得轻松容易分布式版本控制系统,简称DVCS:像Git,Mercurial,Bazaar以及Darcs等.客户端并不只提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来这么一来,任何一处协同工作用的效劳器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复因为每一次的提取操作,实际上都是一次对代码仓库的完整备份(见图1-3)merge JointwoormoredevelopmenthistoriestogetherpullFetchfromandmergewithanotherrepositoryoralocalbranchpush Updateremoterefsalongwithassociatedobjectstrackingbranch:从远程分支checkout出来的本地分支,称为跟踪分支PullRequest在派生工程中创立的提交,可以非常方便地利用GitHub的PullRequest工具向原始工程的维护者发送PullRequest获取帮助githelporgithelpconfigorgit--helpormangit-glob模式:glob模式是指shell所使用的简化了的正那么表达式星号(*)匹配零个或多个任意字符;[abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个a,要么匹配一个b,要么匹配一个c);问号()只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比方[0-9]表示匹配所有0到9的数字)选项说明%H提交对象(mit)的完整哈希字串%h提交对象的简短哈希字串%T树对象(tree)的完整哈希字串%t树对象的简短哈希字串%P父对象(parent)的完整哈希字串%p父对象的简短哈希字串%an作者(author)的名字%ae作者的电子邮件地址%ad作者修订日期(可以用-date=选项定制格式)%ar作者修订日期,按多久以前的方式显示%提交者mitter的名字%ce提交者的电子邮件地址%cd提交日期%cr提交日期,按多久以前的方式显示%s提交说明绿色staged提交后新增加的文件,并且参加了跟踪,但未提交,已暂存状态,如果此时提交,那么该文件此时此刻的版本将被留存在历史记录中红色未被跟踪的文件,提交后增加新文件而未参加跟踪untracked蓝色已经修改的文件,modified灰色未被修改的文件模板内容仅供参考 。