当前位置: 首页 > 科技观察

技巧:Git简单教程

时间:2023-03-17 11:31:14 科技观察

本文转载自微信公众号《潜行》,作者cscw。转载本文请联系SneakUp公众号。在学校,也许一个人就可以负责整个项目的开发启动。但在公司,由于项目的复杂性和紧迫性,往往一个项目是由多人共同实施的。这时候就有问题了,代码提交和代码合并。git和svn,本文将讲git的原理和使用版本控制git账号配置创建git仓库git原理文件操作命令分支操作命令version版本控制版本控制(Revisioncontrol)是开发过程中用到的修改文件、目录或项目等的历史,以便于查看修改历史,备份和恢复以前版本的技术没有版本控制或版本控制本身缺乏正确的管理,将介绍软件开发过程中存在很多问题,比如软件代码的一致性、软件内容的冗余、软件开发过程中的并发性、软件源代码的安全性、软件的集成性等问题gitaccountconfiguration配置名称和邮箱地址#gitconfig--globaluser.name"hellowl"#gitconfig--globaluser.emailwl@csc.com//查看系统配置#gitconfig--system--list//查看当前用户(全局)配置#gitconfig--global--list//查看当前仓库配置信息#gitconfig--local--listCreateagitwarehouse//新建Git代码库在当前目录下#gitinit//克隆一个项目及其整个代码历史(版本信息)#gitclone[git@github.com:cscsss/learnHome.git]git原理项目文件(目录):Git管理的目录,即是,一个仓库,包括我们的工作空间(WorkSpace)和Git管理空间(.git)工作空间(Workspace):就是平时存放项目代码的地方,只是一个文件夹git管理空间(.git):存储Git管理信息,在仓库初始化时自动创建。它还包括暂存区(Index/Stage)和本地仓库(Repository)暂存区(Index/Stage):用来存放你临时更改的信息,以及保存即将提交到文件列表的信息。它可用于保存/恢复WorkSpace中的临时状态。本地仓库(Repository):这里存放的是你提交给所有版本的数据。其中HEAD指向放入仓库的最新版本远程仓库(Remote):托管代码的服务器类似于本地仓库,但它是一个公共状态转移过程未跟踪(Untracked):该文件仅在workspace,但未加入git仓库,不参与版本控制。通过gitaddstatus,暂存文件已经放入仓库(Unmodify):Unmodified,即版本仓库中的文件快照内容与工作区中的完全一致。这种类型的文件有两个变化,如果修改了,就变成Modified。如果您使用gitrm移出存储库,它会变成一个Untracked文件。文件已被修改(Modified):只是修改了,没有进行其他操作。可以通过gitadd进入staged状态,使用gitcheckout丢弃修改,回到unmodify状态。这个gitcheckout把文件取出库,覆盖掉当前修改的暂存状态(Staged):执行gitcommit同步修改在仓库里,仓库里的文件和工作区的文件又变得一致了,文件在取消修改状态。执行gitresetbranchNamefileName取消暂存。文件状态恢复为修改后的图片文件操作命令查看文件状态//查看所有文件状态#gitstatus//查看指定文件状态#gitstatus[fileName]添加文件和目录//添加指定文件到暂存区#gitadd[file1][file2]...//将指定目录添加到暂存区,包括子目录文件#gitadd[dir]Removefilesanddirectories//从暂存区和工作区中删除文件#gitrm//将fileName从暂存区删除文件,保留在当前工作目录#gitrm--cached文件提交gitcommit//将暂存区文件提交到本地仓库区,message为说明信息#gitcommit-m[message]//将暂存区指定的文件fileName提交到本地仓库#gitcommit[fileName]-m[message]//追加缺失的提交暂存区文件。相当于gitadd.+gitcommit-m'message'#gitcommit--amend-m[message]查看文件状态和历史gitlog#gitlog//查看提交历史#gitlog--oneline//以简化模式查看提交历史#gitlog-p//查看指定文件的提交历史#gitblame//以列表形式查看指定文件的提交历史gitdiffcomparedifferences//显示暂存区与work的所有差异area#gitdiff//显示工作区和暂存区filepath路径文件的区别#gitdifffilePath//显示工作区filePath文件和HEAD分支的区别#gitdiffHEADfilePath//显示filePath文件的区别在工作区和某个commitId#gitdiffcommitIdfilePathgitreset代码回滚有时候提交了一些错误的代码,想要回滚怎么办,我们可以使用gitreset来重置代码版本号。gitreset具有三种模式。软,混合,硬//gitreset[--soft|--mixed|--hard][HEAD]//gitreset[--soft|--mixed|--hard][commit]#gitreset–hardHEAD~3//会重置所有最近的3次提交,就好像没有提交一样#gitreset003444c77bae2b0874be17b81a829cfb1237d9ce//重置为003444c7--hardmoderesetHEAD当当前分支到达一个commit时,工作目录中的新变化和已经添加的新变化到了舞台暂存区就会全部消失。工作目录(workspace)、暂存区(index/stage)和本地仓库(repository)都重置为目标commit的内容,所以效果看起来和清除暂存区和工作区一样--softmode---softmodein重置HEAD时,工作目录和暂存区的内容会被保留,重置HEAD带来的新的差异会被放入暂存区,工作目录(workspace)和暂存区区域(index/stage)会被保留只保留repository中的内容与reset节点一致,原节点和reset节点的“差异变化”会被放入暂存区(index/stage)——-mixed模式图片gitreset不带参数,那么默认使用--mixed参数。混合模式会保留工作目录(workspace)的内容,但会重置暂存区(index/stage)和Repository的内容,与重置后的节点保持一致,所以与原节点的“差异变化”并且reset节点会被保存进入工作目录(workspace)gitrevert如果我们想撤销之前的一个版本,但是想保留commitId提交后的版本#gitrevert-ncommitId分支操作命令创建一个新的分支//创建一个newbranch基于当前分支并切换到新的分支lwl#gitcheckout-blwl//基于远程分支originBranch并创建新分支csc#gitcheckout-bcscoriginBranch//创建新的csc分支,但仍然停留在originalbranch#gitbranchcsc//切换到csc分支#gitcheckoutcscgitpush~~本地分支push所有更新到远程仓库master分支#gitpushoriginmaster~~删除远程branchnamebranch#gitpushorigin-ddeletethebranch#gitbranch-D~~删除本地dev1branch#gitbranch-Ddev1branchmergegit-merge命令用于从指定的commit(s)合并到当前分支的操作??#gitmergebranchName//合并当前branchandbranchName#gitmerge-m//合并当前branch和branchNamecommit和之前的commit#gitmerge--abort//unmerge当有合并冲突时,section会用<<<<表示<<<、=======和>>>>>>>>。=======之前的部分是当前分支的情况,=======之后的部分是其他分支的情况。冲突解决后,使用gitadd将其添加到索引中,然后使用gitcommit生成合并节点gitpull/gitfetchgitfetch可以拉取远程仓库的代码~~拉取所有最新的代码remote#gitfetch--all~~拉取最新的远程master分支代码(指定master分支)#gitfetchoriginmastergitpull.它不仅会拉取远程分支,还会合并远程和本地代码,即:gitpull=gitfetch+gitmerge~~拉取远程仓库分支,更新并合并到本地分支#gitpull~~Merge远程master分支到当前本地master分支#gitpulloriginmaster~~将远程master分支合并到当前本地lwl分支,冒号表示本地分支#gitpulloriginmaster:lwlgitrebasemergegitrebasemaster命令会取消当前所有的commit分支curBranch,并暂时保存为补丁(patch)(这些补丁放在“”中。在这个过程中,可能会出现冲突。在这种情况下,Git会停止rebase,让你解决冲突;解决冲突后,使用gitadd命令更新这些内容的索引(index),那么,你不需要执行git-commit,只需要执行gitrebase--continue#gitrebasebranchName//branchName合并到当前分支#gitrebase--continue//继续e解决冲突后合并#gitrebase--abort//取消合并#gitrebase-iHEAD~2//Mergecommit---2表示merge2indivual。也可以是3...如果在gitrebasemaster之后。当前分支curBranch的代码需要移动到master。您可以再次使用gitmerge。此时合并的master的commit是一个commit对应的线性commitgittag标签,是一个点,不能移动。Branch对应一系列的commit,是由很多点连接起来的一条线。有一个HEAD指针,可以通过HEAD指针移动。因此,两者的区别决定了使用方式。如果更改代码,请使用分支。如果你不改变它,你只能用标签查看它。不行,如果要将标签推送到远程分支,需要执行标签推送命令#gittag//根据最新的commitId创建tagName#gittag-a//根据最新的commitId创建on某个commitIdtagName#gitpushorigin//推送到远程仓库#gitpush--tags//推送所有tags#gittag-d//删除本地tag#gitpushorigin:refs/tags///删除远程标签欢迎参考文中错误参考文章一小时学会Git[1]程序员必备基础:Git命令全方位学习[2]GitReset的三种模式[3]