一文搞懂 Git,掌握日常命令和基本操作
1、git
Git 是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到超大型项目的所有内容。Git 易于学习,占用空间很小,性能快如闪电。它超越了 Subversion,CVS,Perforce 和 ClearCase 等 SCM 工具,具有廉价的本地分支,方便的暂存区域和多个工作流程等功能。
2、git&平台
git 是一个工具,是基础设施。我们平时说的 git 就是纯粹指 git 工具和其功能。但是我们常见 github、gitlable、gitee 等平台。不要把他们和 git 划等号,因为 git 不用这些平台也可以在本地作为你自己的一个版本管理工具。这些平台是为了解决多人合作的云平台,使用 Git 作为代码管理工具,并在此基础上搭建起来的 Web 服务。
3、git 开发流程
同 2 一样 git 只是一种工具,他并没有什么工作流程。日常开发中我们为了更好的协作产生了一些 git 开发流程规范。这种规范或者风格叫 git workflow。目前比较知名的有 git-flow 、github-flow 、gitlable-flow。
git-flow
Git Flow 主要是依靠五种分支,master,develop,feature branchs ,release branchs , hoxfixes 来进行协作,因为比较复杂,所以并没有那么多人用。
github-flow
github-flow 只有个主干/长期分支,master 分支用来”持续发布“使用,但是由于只有主分支所以发布不稳定,master 通常会设置 protected 分支保护,只有有权限的人才能推送代码到 master 分支。我们常用的 github 平台就是采用该流程,其中特色就是 Pull Request 方式。如果你要修改需要 Pull Request 然后进行沟通和 code review 才能由有权限的人合并进去。当然 gitlable 平台你也能按照这种方式进行组织,他的 Merger Request 相当于 Pull Request。
gitlable-flow
基于环境的的分支模型——面向持续发布模型,有 master,同时还有 Pre-Production、Production 分支用于维护发布在不同环境上的代码。采用上游到下游流动的方式,大家都在 master 上进行开发,当要发布的时候将 master 分支合并到 Pre-Production 测试通过后再合并到 Production 进行发布。如果有 bug 需要从 master 向下游合并,除非特殊情况需要直接在其它分支上修改。
4、git 操作
我们学习 git 的时候不要把远程仓库和本地仓库混淆在一起,如果你混淆在一起就会陷入到梳理他们的逻辑混乱当中。
我们说了远程仓库只是为了协同工作,我们可以把远程仓库当作是本地仓库的镜像,只是用于我们拉取和提交来同步文档。所以对于远端仓库的主要操作就是:
拉取远程项目
关联本地项目到远程
以上就是基本的远端仓库和本地仓库的操作,接着我们下面的操作都是争对本地仓库的讲解,你需要了解 git 的基本知识,比如 git 有三个部分:工作区、暂存区、版本库。工作区就是我们操作文档的地方,以 windwos 作为演示,当我们在一个文件夹下初始化了 git 管理,那么该文件夹下的三个部分就形成了。至于为什么需要三个部分,就像两口子吵架需要一个中间人调节,有些事情可以先和中间人商量确定好后再传达给对方,减少冲突。
git 是基于分支管理的,默认分支就 Master 分支,争对于分支我们可以做那些操作呢?
git pull/git fetch/git pushgit pull 拉取远端的最新提交到本地,并与本地当前分支合并更新所有区。git fetch 拉取远端的最新提交到本地,不会自动合并,也不会更新工作区。git push 推送本地仓库到远程仓库,推送的是本地版本库里面的内容,如果工作区或者暂存区没提交则不会提交。
git add
git commit
git log
git tag
tag 就是标签,常用来标记版本,相当于 commit 的一个标记。
git reset
git reset 用来重置到过去的某个版本,有五种模式(--mixed、--soft、--hard、--merge),重置后不要的版本就找不回来了。
git restore
git revert
和 git reset 类似,只是会保留不要的版本。
git diff
比较差异
git checkout
checkout 命令用于版本库或者暂存区域中撤销更改到工作目录,同时也可用于切换分支。为了记忆错乱避免混乱,我通常不用改操作,因为对于撤销完全可以用 reset 和 restore,而对于分支切换可以用 switch,他们从语义上来说更贴切。所以这个操作你可以不用,我也难得记!
以上这些就是操作某一个分支的基本命令,我们说了 git 是分支管理,那么多个分支呢。接下来我们就介绍一些多分支之间操作的命令。多分支是为了控制不同工作和并行工作,分支的建立可以是本地的,也可以是和远端某个分支关联的(这个远端可以是任意分支)。所以 git 是灵活的,远端和本地我们任然要区分开。
git branch
git switch
git stash
当我们切换到不同分支进行工作的时候,可能当前分支的修改我们还没完成,但是又要紧急处理另外一个分支,此刻的修改如果不提交(git add -> git commit)。那么切换的时候是阻止我们切换的,提示修改未提交或者隐藏,git stash 就是用来隐藏分支工作区修改但不想提交的。将修改 git stash 后可以生成一个编号,等我们处理完切回来得时候就可以取出该修改还原到工作区并删除隐藏。
而这个功能的前提就是你要知道不同分支上的修改在你提交的版本库之间是有差异性的,比如文件 a.txt 我们添加到 master 分支,然后提交,然后你切换到 newbranch 分支上是没有 a.txt 的。如果 b.txt 在两个分支上都有,那么在其中一个修改了提交后,在另外一个分支 b.txt 文件你是看不到修改的。
注意:只有提交的文件才会进入git跟踪,如果c.txt我在master分支上创建了,但是它在工作区,我们切换到newbranch分支任然能看到它,这个时候谁先提交就记录到谁的分支
git merge
既然不同分支有不同的版本,我们可能需要合并分支的差异。比如我们要将 newbranch 的分支合并到 master 上,如果我们当前不在 master 分支,那么我们需要先 switch 到 master 分支。
git rebase
rebase 和 merge 作用都是一样的,区别是 rebase 没有分叉记录,他们合并后两个分支的 HEAD 都指向最新的版本,merge 的提交历史更完整。
git cherry-pick
当我们要合并某个分支上的特定提交版本,我们可以使用 git cherry-pick 将某分支 commitID 版本合并到当前分支。
整篇就是关于 git 介绍和 git 容易混淆的概念及命令,包括日常的基本操作。如果其它进阶和骚操作,可以查看文档或搜索,一般来说掌握这些足够了,其它需要再去查就行。
版权声明: 本文为 InfoQ 作者【互联网工科生】的原创文章。
原文链接:【http://xie.infoq.cn/article/1e45d4b1d28e7fc5031a09798】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论