BOB体验官网对于程序员来说,Git应该是每天都要打交道的工具吧,但很多时候我们都只是停留在git add、git push、git pull等简单命令的使用上,又或者只是使用GUI工具(如Sourcetree等)点击操作而已,对Git并没有什么全面的了解,碰到问题可能需要不断上网查询。
因此,为了更好地使用Git,也为了让更全面地理解Git,就将对Git的学习总结为**《 Git简明教程》**,方便日后随时查阅,也希望对其他人有所帮助!
Git是一个分布式版本控制系统,而SVN、CVS等则为集中式版本控制系统。
集中式版本控制系统的特点是需要远程服务器,如果无法连接远程服务器,我们所做的变更就无法提交,如下图所示:
而在分布式版本控制系统中,每个端都保存着仓库完整的信息,不用联网也可以查询到所有的变更历史、在本地进行commit、checkout等操作,仅当你需要将变更推送到远程仓库,才需要网络,如下图所示:
大部分操作都在本地进行,不需要连网,本地保存着仓库的完整信息,如果远程仓库损坏,随时可以用本地仓库进行数据恢复。
Git与其他版本控制系统的其他不同之处在于Git对待数据的方式,Git就像一个小型的文件系统,在我们每次提交,对整个文件系统做一个快照。
Git 中所有的数据在存储前使用哈希算法计算一个哈希值,只要内容一改变BOB体验官网,哈希值就会发生,这样可以确保任何数据的改变都可以被Git察觉,进而保护数据的完整性。
一般的版本控制系统都支持分支管理,然而这些系统创建分支就是把整个系统复制一份而已,这对于大型项目来说,就很费时间了,而Git则完全不同,Git的分支是非常轻量级的,在Git中,分支的创建、删除、合并都非常快速,有时只是移动一个指针而已。
刚开始使用Git时,需要配置一下Git环境,第一件事就是配置你的用户名和邮件地址,这里的用户名和邮箱地址会写入到你之后的每一次提交当中:
上面使用git config命令时,我们使用--global选项,表示该配置对所有的仓库都有效,实际上Git的配置有三个级别,对应的命令选项为--global,--system,--local,其中--local优先级最高,--system优化级最低。
表示对系统上所有用户的所有仓库都有效,对应的修改会保存在/etc/gitconfig文件中,由于是系统级别的配置,因此需要管理员权限才能操作。
表示对当前用户的所有仓库都有效,对应配置会保存在~/.gitcofnig或者fig/git/config文件中。
对当前仓库有效,对应的配置会保存在项目的.git/config文件当中。
这里有几个概念是我们学习Git必需要厘清的概念,即:仓库(Repository)、工作区(workspace)、暂存区(Index,也称为索引)、远程仓库(Remote),它们之间的关系如下图所示:
执行完上面的命令之后,我们便在demo目录中初始化了一个仓库,这时候Git默认帮我们创建一个名称为master或者main的分支。
除了初始化空仓库之外,有时候我们需要参与一些已经进行的项目,这样的项目已经有存在的仓库了,这时候我们可以采用克隆的方式把远程仓库同步到我们本地目录,如:
默认情况下,会把远程版本库的名称作为克隆到本地目录的名称,我们也可以自定义本地目录的名称,如:
克隆后,默认也是进入一个master或者main的主分支,该分支会关联到我们克隆的远程服务器上的同名分支,我们也可以指定要克隆远程服务器的哪个分支:
git clone -b develop 复制代码分支是Git中非常重要的内容,也是Git精华之所在,我们以后的文章再详细讲解!区分工作区与仓库
经过上述步骤后,我们在demo目录中生成了一个仓库,这里有一点要注意的是,很多初学者往往把demo看作是仓库,其实demo目录下的.git才是仓库,而demo目录则是工作区。
工作区是我们操作文件的地方,我们添加、修改或删除文件都是在demo目录中进行的,而最终提交的数据是保存到.git目录中的,所以.git目录才是仓库,这个目录保留着整个仓库的所有信息。
SVN或CVS的使用习惯是直接提交所修改的内容,而Git并不是这样的,在Git中BOB体验官网,当我们在工作区对文件作出修改后,并不能直接提交,而是需要将文件添加到暂存区(Index或Stage),
除了一个一个地添加之外,git add 命令也支持将全部修改一次性添加到暂存区,如:
对于添加到暂存区的文件,也可以执行撤消操作,比如我们想将上面添加到暂存区的文件撤回工作区,可以这样做:
把要提交的文件添加到暂存区后,如果想提交到仓库中,可使用git commit命令:
执行上面的命令后,会弹出一个vim编辑器窗口,我们可以在这个窗口编辑提交说明,编辑完成后保存退出就完成了一次提交了。
当然,也可以在git commit命令跟上-m选项来附带说明文字,这样可以直接提交:
虽然使用暂存区,可以让我们更好的挑选自己要提交的修改,但这样多一个步骤总是很烦人,所以Git支持在git add命令后跟上一个-a选项,这样可以直接跳过暂存区,直接将当前工作的修改提交到仓库中:
不过,要注意的是,未跟踪的文件并不会直接被提交,还是需要添加到暂存区的。
从上面的操作中,我们可以看到,一个文件从创建到提交,经历了几个状态的变化,如下图所示:
到目前为止,我们的所有操作还是在本地进行的,当我们想把与仓库与别人共享,或者参与别人的项目时,这时候就需要连接远程仓库了。
远程仓库,并不一定说明该仓库一定要在互联网中的另一台服务器上,远程仓库也可以是你本机的另一个仓库查看远程仓库
如果我们使用git clone命令克隆一个远程版本库,Git会帮我们将该远程仓库命名为origin。
也可以自己添加当前仓库关联的远程仓库,比如下面我们添加一个名称为foo的仓库:
执行上面命令的话,会推送当前所有分支,推送到远程仓库中同名的分支下,当然我们也可以推送到指定的分支,比如我们指定推送到foo的develop分支上:
如果别人向远程版本库推送了变更,而我们想同步到本地的仓库,可以使用git fetch将远程仓库的最新变更抓取回来:
但是,执行git fetch后也只是把别人推送到远程仓库的变更拉回来而已,却并不会把变更合并到我们当前工作区,所以我们还需要自己手动执行合并命令:
上面的命令没有指定合并哪个远程仓库分支教程知识,所以会默认合并当前分支所跟踪的远程分支BOB体验官网,也可以指定合并哪个分支:
如果觉得执行git fetch和git merge比较麻烦的话,也可以使用git pull命令,这个命令在抓取远程仓库数据后,会自动执行合并: