《(新)GIT版本管理详解.docx》由会员分享,可在线阅读,更多相关《(新)GIT版本管理详解.docx(22页珍藏版)》请在课桌文档上搜索。
1、日常工作需要掌握操作示意图=heckoutfetchcloeseicheckout-fecM.fetch和pull的区别等,除此之外,还有cherrycommit, status, fetch, push, rebase 等,若要熟练掌握工作区(WorkSPaCe)是电脑中实际的目录。暂存区(IndeX : stage)类似于缓存区域,临时保存你的改动 仓库区(RePoSitory),分为本地仓库和远程仓库。必须掌握rebase和merge的区别 pick, submodule, StaSh 等功能,workspacestagingrepositorygit add/mv/rmcommitgi
2、t pushgit reset git diff HEADWorkspace:工作区Index/Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓库A工作区:仓库文件夹里面,除了.git目录以外的内容A版本库:Git目录,用于存储记录版本信息A版本库中的暂缓区(stage)A版本库中的分支(master):Git自动创建的第一个分支版本库中的HEAD指针:用于指向当前分支Git为我们自动创建了第一个分支master,以及指向master的一个指针HEADDEVELOPERBDevelopera二、操作手册1.术语/master:默认开发分支/origin:默认远程
3、版本库/Index/Stage:暂存区,Workspace:工作区/ Repository:仓库区(或本地仓库)/ Remote:远程仓库2.命令手册类型命令解释命令求助$githelp初始化在当前目录新建一个Git代码库$gitinit新建一个目录,将基初始化为Git代码库$gitinitproject-name下载一个项目和它的整个代码历史$gitcloneurl$gitclonessh:/user$gitclone配置列举所有配置$gitconfig-1($gitconfig-list)编辑配置文件$gtconfig-e-global为命令配置别名$gitconfig-globalali
4、as.cocheckout$gitconfig-gobalalias.cicommit$gitconfig-globalalias.ststatus$gitconfig-globalalias.brbranch设置提交代码时的用户信息Git用户的配置文件位于/.gitConfigGit单个仓库的配置文件位于/$PRoJECT一PATH/.git/Config$gitconfig-globaluser.namename$gitconfig-globaluser.emailemaildress增删文件添加文件到暂存区$g1tadd.#添加当前目录的所有修改文件到暂存区$gitadd-A#添加所有修
5、改到暂存区$gitadd.#添加指定文件到暂存区$gitadd#添加指定目录到暂存区,含子目录$gitadd-p#添加每个变化前,都会要求确认.对同一个文件的多处变化,可以实现分次提交。删除工作区文件.并且将这次删除放入哲存区$gitrmfilelfile2.停止追踪指定文件,但该文件会保留在工作区$gitrm-cachedfile改名文件,并且将这个改名放入暂存区$gitmvfile-originalfile-renamed分支列出所有本地分支$gitbranch列出所有远程分支$gitbranch-r列出所有本地分支和远程分支$gitbranch-a删除分支$gitbranch-dbran
6、ch-name删除远程分支$gitpushorigin-deletebranch-name$gitbranch-drremote/branch$gitpushremote:remote-branch新建一个分支,但依然停留在当前分支$gitbranchbranch-name新建一个分支,与指定的远程分支建立追踪关系$gitbranch-trackbranchremote-branch新建一个分支,并切换到该分支$gitcheckout-bnew_branchremote-branch切换到指定分支,并更新工作区$gitcheckoutbranch-name切换到上一个分支$gitcheckou
7、t-合并指定分支到当前分支$gitmergebranch选择一个commit,合并进当前分支$gitcherry-pickcommit衍合指定分支.到当前分支$gitrebasebranch建立追踪关系,在现有分支与指定的远程分支之间$gitbranch-set-upstreambranchremote-branch提交提交暂存区到仓库区$gitcommit-mmessage提交暂存区的指定文件到仓库区$gitcommitfielelfile2-mmessage提交工作区自上次Commit之后的变化,直接到仓库区$gitcommit-a提交时显示所有diff信息$gitcommit-v使用一次
8、新的提交.替代上一次是提交。若代码无变化.则用来改写上一次commit的提交信息$gitcommit-amend-mmessage重做上一次提交,并包括指定文件的新变化$gitcommit-amend-filelfile2上传本地指定分支到远程仓库$gitpushremoteremote-branch拉取下载远程仓库的所有变动$gitfetchremote显示所有远程仓库$gitremote-v显示某个远程仓库的信息$gitremoteshowremote增加一个新的远程仓库,并命名$gitremoteaddremote-nameurl取回远程仓库变化,并与本地分支合并$gitpullremo
9、tebranch取回远程仓库的变化,并与本地分支变基合并$gitpull-rebaseremotebranch撤错撤销工作目录中所有示提交文件的修改内容$gitreset-Hardhead撤销指定的提交$gitrevert撤销指定的未提交文件的修改内容$gitcheckoutHEADfile退回一天前的版本$gitlog-before=1days”恢复暂存区的指定文件到工作区$gitcheckoutfile恢复暂存区当前目录的所有文件到工作区$gitcheckout恢复某个commit的指定文件到暂存区和工作区$gitcheckoutcommitfile重置暂存区的指定文件,与上一次提交持一致
10、,但工作区不变$gitresetfile重置暂存区与工作区,与上一次提交保持一致$gitresethard重置当前分支的指针为指定提交,同时重置哲存区,但工作区不变$gitresetcommit重置当分支的HEAD为指定Commit,同时重置暂存区和工作区,与指定CommIt-致$gitreset-hardcommit重置当前HEAD为指定commit,但保持暂存区和工作区不变$git-keepcommit新建一个commit.用于撤销指定Commit后者所有的变化将被前者抵消,并应用到当前分支$gitrevertcommit将未提交的变化放在暂存区(草稿)$gitstash将暂存的内容恢复到
11、当前工作区(草稿)$gitstashpop查询查看工作区文件修改状态$gitstatus查看版本库修改记录$gitlog显示提交历史,及每次提交发生更化的文件$gitlog-stat搜索提交历史,根据关键词$gitlog-Skeyword显示某个提交后的所有变动,每个commit占行$gitlogtagHEADpretty=formats显示某个提交后的所有变动,其提交说明必须符合搜索条件$gitlogtagHEADgrepfeature显示某个文件的版本历史,包括文件改名$gitlog-followfile$gitWhatchangedfollowfile显示指定文件相关的每一次diff$g
12、itlog-pfile显示过去5次提交$gitlog-5pretty-oneline显示所有提交过的用户,按提交次数排序$gitshortlog-sn显示指定文件是什么人在什么时间修改过$gitblamefile查看工作区文件修改具体内容$gitdifffile查看暂存区文件修改内容$gitdiff-cachedfile查看工作区与当前分支最新commit间的差异JgitdiffHEAD查看两次提交间的差异$gitdifffirst-branchsecond-branch显示今天你写了多少行代码$gitdiffThortStat0dayago查看某次提交具体修改内容$gitshowcommit
13、查看某人提交记录$gitlog-author=someoe显示某次提交时某文件的内容$gitshowcommit:filename显示当前分支的最近几次提交$gitreflog获重版本号查看某次提交发生变化的文件$gitshow-name-onlycommit标釜列出所有本地标签$gittag基于最新提交创建标签$gittagtag-name删除标签$gittag-dtag-ame删除远程标签$gitpushoriginefstagstagName查看标签信息$gitshowtag提交指定标签$gitpushremotetag提交所有标签$gitpushremote-tags新建一个分支,指向
14、某个标签$gitcheckout-bbranchtag提交指定标签$gitpushremotetag远程操作下载远远程仓库的所有变动$gitfetchremote取回远程仓库的变化,并与本地分支合并$gitpullremotebranch显示所有远程仓库$gitremote-v显示某个远程仓库的信息$gitremoteshowremote增加一个新的远程仓库,并命名$gitremoteaddshortnameurl上传本地指定分支到远程仓库$gitpushremotebranch强行推送当前分支到远程他库,即使有冲突$gitpushremote-force推送所有分支到远程仓库$gitpush
15、remote-all删除远程分支或标签$gitpushremote:上传所有标签$gitpush-tag清除没有远程信息的分支,这样Qitbranch-a就不会拉取远程已经删除的分支了$gitfetchorigin-p删除掉没有与远程分支对应的本地分支$gitfetch-p查看远程库信息,及与本地分支的信息$gitremoteshoworigin当前工作目录$pwd列出当前目录下的所有文件$ISHla该项目在你主机上的全部分支$gitbranch可视化查看分支$gitk创造一个文件$echoCreatinganewFileonmyBrachnewFiIe打印出文件内容$catnewFile三、
16、命令详析Git Cheat Sheetdeft to right) ComlTlanCl Flowy Kugr .*# 6,*o n-*rvaw v* 6mm y *wt M ZKk KMtiBasicsUse M help command W youre stuck.str0“3t Mv gnchoriindefault upstream branchHaocuwt branchHEADparent Qf HEADK*D4gr-gr*t grMDt XEAOfoo. .twr from branch too to branch barUseful ToolsUpdategit statusg
17、it diff Ioldid MWjdgit log - filedirSt blwe legit Shotf Id ,*Mun git show idlQlt branch (* 也, cumm;Qlt fetdl 4f UCraanM git fetch remote git pull km*f git r 3 patch.*o git apply patch.diffgit archiveCMMi* t git bisect * 4H .*a*wr* g“ fckOmm raat肛Ceme4 mete IPCrIbrtMncej git reba&e*CMMpn Mi CMft#M t
18、rmc ntgit rot MM URL* *mcM (*pMNfMrrrttuw git 4tastWnpaMrry mi mm cnangw git ta9tm MW* ktgltkTkMrOTracking Filesgit *dd filtt git v old nw git r files git r - ccMd fil9tMoe tt*cutq tax wa* m i worMa *)Structure OverviewConflictstM w e*u Mm m f* owegit diff I b*c git d】ff ou git diff their git log me
19、rge 9itk fierce1 .将文件添加到暂存区Bitadd文件名将工作区的某个文件添加到哲存区gitadd-u#添加所有被tracked件中被修改或删除的文件信,息到暂存区,不处理UntraCke呃文件gitadd-A#添加所有被tracke攻件中被修改或删除的文件信息到暂存区,包括Untraeke#文件gitadd.#将当前工作区的所有文件都加入暂存区6itadd-i#进入交互界面模式,按需添加文件到缓存区2 .将暂存文件提交到本地仓库gitcommit-m提交说明#将暂存区内容提交到本地仓库gitcommit-a-m提交说明#跌过缓存区操作,直接把工作区内容提交到本地仓库3 .查看
20、仓库当前状态4 .比较文件异同将文件添加到仓库gitdiff#工作区与暂存区的差异gitdiff分支名#工作区与某分支的差异,远程分支这样写:rewotes/origin/分支名gitdiffHEAD#工作区与HEAD指升指向的内容差异gitdiff提交id文件路径#工作区某文件当前版本与近史版本的差异gitdiff-stage#工作区文件与上次提交的差异(1.6版本前用-cached)gitdiff版本TAG#查看从某个版本后都改动内容Sitdiff分支A分支8#比较从分支A分支哪差异(也支持比较两个TAG)gitdiff分支A.分支B#比较两分支在分开后各自的改动#另外:如果只想统计哪些文
21、件被改动,多少行祓改动,可以添加-Stat参数5 .查看历史记录gitlog#查看所有co三it记录(SHA-A校睑和,作者名称,邮箱,提交时间,提交说明)gitlog-p-次数#查看最近多少次的提交记录gitlog-stat#简畴显示每次提交的内容更改gitlog-name-only#仅显示已修改的文件清单Bitlog-name-status#显示新增,修改,IIlM除的文件清单gitlog-oneline#让提交记录以精筒的一行输出gitlog-graph-all-online#图形展示分支的合并齿史gitlog-author啡者#查询作者的提交记录(和grep同时使用要加一个-all-a
22、tch参数)gitlog-grep=过滤信息#列出提交信息中包含过滑信息的提交记录gitlog-S查询内答#和一gret似,S和查询内容间没有空格BitlogHleName#查看某文件的修改记录,找背耦专用6 .代码回滚gitresetHEAD#恢复成上次提交的版本gitresetHEAD#恢复成上上次提交的版本,就是多个3以此类推或用次数gitrefloggitreset-hard版本号-soft:只是改变HEAa旨甘指向,缓存区和工作区不变;-mixed:修改HEAD指料指向,暂存区内容丢失,工作区不变;-hard:修改HEA0甘指向,哲存区内容丢失,工作区恢复以前状态;7 .同步远程仓库
23、gitpush-uoriginmaster8 .删除版本库文件gitEl文件名9 .从远程仓库克隆到本地gitclonegitithub.COnKgit帐号名/仓库名.git10 .本地仓库内容推送到原创仓库gitremoteaddorigingitgithub.co*n:帐号名/仓库名.git11 .创建分支gitcheckout-bdev一味示创建并切换分支上面一条命令相当于一面的二条:gitbranchdev创建分支gitcheckoutdev切换分支12 .查看分支gitbranch13 .合并分支gitmergedev用于合并指定分支到当前分支gitmerge-no-ff-mmerg
24、ewithno-ffdev加上一n。一什参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并14 .删除分支gitbranch-ddev15 .查看远程库信息gitremote/-v显示更详细的信息16 .git相关配置#安芸完Git后第一件要做的事,设置用户信息(global可换成Ssl在单独项目生效):itCOnfig-globaluser.name”用户名”#设置用户名gitCOnfig-globaluser.email”用户邮箱”析殳置由F箱gitconfig-globaluser.name#查看用户名是否酉i!置成功gitconfig-globaluser.email叁
25、查看邮箱是否酉已置#其他查看酉i:置相关gitconfig-global-list#查看全局设置相关参数列表gitconfig-local-list*查看本地设置相关参数列哀gitconfig-system-list#查看系统酉己置券数列袤gitconfig-list#查看所有Gitg勺凯置(全局+本地.系统)gitconfig-globalcolor.uitrue显示gi甘目关颜色17 .撤错某次提交gitrevertHEAD#撇i肖最近的一个提交gitrevert版本号#撒俏某次conit18 .标签命令gittag标签打标笺命令,默认为HEADgittag显示所有标签gittag标英版本
26、号给某个Cofflndt版本添加标芸Bitshow标釜显示某个标釜的详细信息19 .生成一个可供发布的压缩包$gitarchive四、Git的4个阶段的撤销更改三个步骤:addcommitpush四个区:工作区、暂存区、本地仓库(master)、远程仓库(Origin/master)5种状态:未修改、已修改、已暂存、已提交、已推送对反义词gitadd.gitcheckout.状态检查撤消撤消已修改,未暂存gitdiffgitcheckout.gitreset-hardgitadd.已暂存.未提交gitdiff-cachedgitresetgitcheckout.gitreset-hardgit
27、commit,已提交,未推送gitdiffmasterorigin/mastergitreset-hardorigin/masterGitpush已推送gitreset-hardHEADgitpush-f或五、常见版本管理软件所有的版本控制系统,只能跟踪文本文件的改动,比如M文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从Ikb变成2kb,但是到底改了啥,版本控制也不知道。CVS:CVS是一个C/S系统,是一个常用的代码版本控制软件,1
28、990年诞生,10多年前主流源代码管理工具。SVN:SVN又称subversion,是一款集中式源代码管理工具。由于之前CVS编码的问题,大多数软件开发公司都使用SVN替代了CVS1前几年在国内软件企业使用最为普遍。Git:一款分布式源代码管理工具.目前国内企业基本都使用Git。并改支持并发提交Git特性查阅历史支持更名C三a并3(支持并发提交支持常见的版本控制SVN1分布式不童并发修改否KCVS特性吉阅历史.不女分码1. SVN介绍是SUbVerSion的简称,目前是APaChe项目底下的一个开放源代码的版本控制系统优点/集中式管理,管理方式在服务端配置好,客户端只需要同步提交即可,使用方便
29、,操作简单,很容易就可以上手。/在服务端统一控制好访问权限,利用代码的安全管理。/所有的代码已服务端为准,代码一致性高。缺点/所有操作都需要通过服务端进行同步,这会导致服务器性能要求比较高。如果服务器宕机了就无法提交代码了。/分支管理不灵活,SVn分支是一个完整的目录,且这个目录拥有完整的实际文件,这些操作都是在服务端进行同步的,不是本地化操作,如果要删除分之,也是需要将远程的分支进行删除.这会导致大家都得同步。/需要联网。如果无法连接到SVN服务器,就无法提交自己的代码,更别说还原、对比等操作了。如果在内网还好,网速比较稳定,同步相对比较快,如果是通过外网同步,有可能就需要同步很久。2. G
30、it介绍分布式版本控制系统的客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。Git中所有数据在存储前都计算校验和,然后以校验和来引用。这意味着不可能在Git不知情时更改任何文件内容或目录内容。这个功能建构在Git底层,是构成Git哲学不可或缺的部分。若你在传送过程中丢失信息或损坏文件,Git就能发现。Git数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。优点/分布式开发时,可以gitclone克隆一个本地版本,然后在
31、本地进行操作提交,本地可以完成一个完整的版本控制.在发布的时候,使用gitpush来推送到远程即可。/git分支的本质是一个指向提交快照的指针,速度快、灵活,分支之间可以任意切换。都可以在本地进行操作可以不同步到远程。/冲突解决,多人开发很容易就会出现冲突,可以先pull远程到本地,然后在本地合并一下分支,解决好冲突,在PUSh到远程即可。/离线工作,如果git服务器出现问题,也可以在本地进行切换分支的操作,等联网后再提交、合并等操作。缺点/git没有严格的权限控制,一般是通过系统设置文件的读写权限来做权限控制。/工作目录只能是整个目录,而SVn可以单独CheCkOUt某个有权限的目录。/gi
32、t上手可能没有SVn那边顺手,需要经过学习一下。六、其他1 .工作流程Gitbash cd进入目录mkdir建目录 Cd进入新建目录 pdw查看目录 仓库初始化:gitinit 配置用户名:gitconfiguser.name用户名(跟踪who修改记录)X配置邮箱:gitconfiguser.email邮箱(多人开发间的沟通) 配置全局用户名:gitconfig-globaluser.name用户名 配置全局邮箱:gitconfig-globalUSer.email邮箱 gitconfig-I:查看配置信息命令Xgitstatus查看文件状态工作区(ProjVSl 件Jt)readme.txt
33、 index.html妙山足,-出2 .gitlog gitlog-helpgitlog-helpgrep-pretty 修改时间和提交时间:gitlog-pretty=fuller 修改时间格式gitconfiglog.dateiso8601修改本地仓库格式gitconfig-globallog.dateiso8601修改全局格式 查看时间范围gitlog-after=2020-9-2300:00:00-before=2020-9-2323:59:593 .版本退回gitreset:版本回退(建议加上一hard参数,Git支持无限次后悔)回退到上一个版本:gitresethardHEAD回退
34、到上上一个版本:gitresethardHEAD回退到上N个版本:gitresethardHEAD-N(N是一个整数)回退到任意一个版本:gitresethard版本号4 .gitignore文件.gitignore文件里配置的文件或目录,会自动被git所忽略,不纳入版本控制。.gitignore配置来过滤这些文件或目录。开源项目:5 .存草稿(bug分支)有时,我们需要在同一个项目的不同分支上工作。当需要切换分支时,偏偏本地的工作还没有完成,此时,提交修改显得不严谨,但是不提交代码又无法切换分支。这时,你可以使用gitstash将本地的修改内容作为草稿储藏起来。# 1.将修改作为当前分支的草
35、稿保存$gitstash# 2恢复储藏的代码gitstashPOP恢复的同时把stash内容删掉或gitstashapply恢复stash,但是stash内容并不删除gitstashdrop在上面操作的基础上,以此来删除stash# 2.查看草稿列表# gitstashlist# 3将StaSh空间清空gitstashclear# 4gitstashpop和gitstashapply区别原来gitstashpopStaShid命令会在执行后将对应的stashid从stashlist里删除,而gitstashapplyStaShid命令则会继续保存stashido6 .书写优秀的提交信息 Git
36、Commit要尽可能小,易于理解gitadd.gitcommit-m*#2313213修正了tooltip中的XSS安全性,gitpush#向仓库中推送了2个改变过的文件-mr提交信息 理想情况下,Git提交信息需要由三部分组成:主题、正文和结语./主题需要是一句话来概括你提交内容所涉及的修改。它需要是祈使时态,以大写字母开头,结尾没有句号,并旦最好小于50个字。/正文需要包含你要传达的信息,让其他人在其中能够了解更多关于这次修改的细节。注意不要重复描述代码中显而易见的逻辑,正文也不是让你一行一行的解释代码,大家更加关注的是代码中不容易看出来的更深层的一些细节问题。我们的最终目标是为这次的修改
37、提供有效的上下文信息.即更改主要的动机和目标。/结束语应该出现在你的提交信息的最后一行。提供一些关于此次修改的元数据,比如JlRA号,GitHubissue号,合作者姓名,和附加信息的链接。3 .Git例子常见的命令:#下载项目比如从github#添力口github远程仓库命名Origingitconfig-globaluser.name/user.emailyourname/youremail#配置项目用户信息gitaddyourfile#添加文件进行跟踪gitcommit-myourmessage#提交到仓库gitcheckout-bbranch-nameA#新建分支切换到Agitmerg
38、ebranch-nameA#合并分支A到当前分支gitpushorigindev#把本地内容推送到远程分支其他类似tag,stash,Cherry-PiCk,reset我觉得前期不用深入,后期再完善。4 .个人博客Git+Github+Markdown+Jekyll通过md文件写作,git进行管理推送到github仓库然后jekyll生成静态博客,通过githubpages展示网址:https:jekylI马专栏、马书Git+gitbook5 .仓库L 11 推荐 github 老大哥 一300OW用户免费托管,允许私有项目3人以内L bitbucket 早期最给力一最灵活私有仓库免费5人以内
39、-sourceforge-最早期全球最大1.gitee码云开源中国团队1.RailS开发DHH-自托管大企业一绝大数企业自己部署内网JgitlabJ-直免费协作无人数限制Jgithub竞争对手Jgogs小众小企业玩-go语言写6 .命令讨论gitclone克隆意味着在本地计算机上创建远程存储库的副本。是在工作区还是在本地库、存储区?gitpushoriginPush命令允许你将本地存储库上的所有更改传输到远程存储库上。gitpullPUll命令允许你将所有更改从远程存储库传输到本地存储库。是在工作区还是在本地库、存储区?七、分支操作1 .创建与合并分支a)从master分支创建dev分支并切换
40、到dev分支:gitcheckoutmastergitcheckout-bdev其中,gitcheckout-bdev等价于:gitbranchdev#创建分支gitcheckoutdev#切换分支查看本地当前的分支,分支前面带3表示当前分支,剩下的分支表示本地有的分支:gitbranch查看远程全部的分支,白色的表示本地有的,红色的表示本地没有,仅在远程存在:gitbranch-ab)修改代码、提交代码(当前的操作是在dev分支上进行)gitadda.htmlgitcommit-m提交文件a.htmc)分支合并(将dev合并到master)gitcheckoutmastergitmerged
41、evd)合并完成后,删除dev分支.gitbranch-ddev(删除dev分支时,注意我们当前所在的分支不能是dev分支)e)删除后,查看分支(此时看不到dev分支了)gitbranchf)例子gitcheckoutmastergitcheckout-bissuesl234gitpushoriginissuesl234gitadd.gitcommit-m*gitpushoriginissuesl234注意-将本地分支branchi推到远端的branch2操作步骤:gitpushoriginbranchl:branch2gitbranch-Dissuesl234本地强制删除分支issuesl234gitpushorigin:issuesl234推到远程2 .解决冲突a)发生冲突的文件OCreatinganewbranchisquick&simple.CreatinganewbranchisquickANDsimple.featurel其中,git使用,=,标记文件中自己和别人产生冲突的部分。在,=之间为自己的代码;=,之间为别人的代码口如果保留自己的代码,将别人的代码删掉即可。b)冲突解决后提交gitstatusgitadd*gitcommit-mfixconflictgitpushorigin分支名