简单git使用

  首先,感谢孟宁老师的帮助,让我开始了与git的相识之旅。在介绍git的一些命令之前,我们可以做一些有趣的假设,从而使读者可以快速的接受这些命令。

  假设有个工程叫做《APTX4869的研发》,需要三个人进行开发,分别是负责数据测试的柯南,药物研发的小哀,以及辅助开发的阿笠博士。

  

                   git的使用流程

阶段一:初始化仓库

  我们首先打开自己的git工具,这里可以有两种形式。一种是window下的git-cmd,给熟悉window环境的程序员而使用的方式。另一种就是linux环境下git-bash,在这种环境下我们可以使用linux下的所有命令,像是vim,ls。

  我们以linux-bash为例,打开之后发现与linux风格一致:

  此时我们进入到APTX4869的工作目录中,使用 git init 进行仓库的初始化

 

  初始化完成之后,发现APTX4869下多了.git的隐藏目录。这里面就存放了我们以后要使用的各种文件。

  本地仓库有了之后,我们就可以开始研发我们的东西了。

  我们首先创建一个文件README.md,里面介绍了这次工程需要做的事情,以及现在所处阶段。

  之后把该文件添加到本地的索引目录中。可以使用 git add 进行索引添加,并使用 git status 进行状态查看。绿色字体表明我们这次的索引修改是成功的。

  同样的,我们可以重复多次的git add 命令来进行更多文件和索引的修改。等到全部做完了之后,我们就可以统一进行最终的提交了。使用 git commit 可以对本地的索引树进行仓库提交,之前所作的操作将会生效。并且如果是首次提交的话,git 还会创建真正的默认分支master(通过git branch 可以创建另外的分支,通过git checkout 来切换分支),并更新相应日志

   至此本地的一次完整操作结束了。为了其他人也知道我们的工作进度,我们需要将我们的数据更新到远程仓库上。于是我们进入了阶段二。

阶段二:远程仓库的基本操作

  在与团队内其他成员交流时,我们首先得要有个远程仓库,这里我们可以通过github上的教程进行创建。

 

  有了远程仓库后,我们还要知道它的地址才能正确提交数据。这里同样有两种方式,一种是HTTPS,另一种是SSH(需要配置访问密钥)。这里我们选择HTTPS访问方式。

  首先将远程仓库的地址分配个别名,下次就可以直接通过别名访问,而不需要每次通过一大串的地址字符访问。使用 git remote add (地址别名)(远程地址)可以对地址命名别名。并使用 git remote -v 查看已经命名好的地址别名。

  这时我们就可以提交数据到远程仓库了,使用 git push (远程地址)(提交分支) 命令可以完成该操作。(使用Https链接方式,github会要求输入账号与密码)

  此时我们再git log查看提交记录时,发现远程仓库也创建的相应的分支,并且指的都是同一个commit结点。

  到这一步,我们所作的修改就已经同步到了远程仓库。团队内的其他开发人员就可以获取最新的数据了。

  通过以下命令可以获取远程仓库的数据

  git clone 克隆远程仓库

  git pull 获取最新的远程分支数据

  git fetch 可以将远程仓库的内容先拉取下来,然后在通过手动的git merge 进行内容合并

  所以,git pull = git fetch + git merge

  至此,我们已经学会了本地仓库到远程仓库的交互。再从远程仓库获取最新的数据到本地仓库中。

  接下来柯南,小哀,阿笠博士就可以各自开始分工开发了。

阶段三:远程仓库的分支合并

  为了更好的模拟合作环境,我创建了三个各自的本地仓库,并同步了远程的相应分支。

  有了这样的工作环境之后,这三人不必按照特点顺序的开发模式进行。而是直接可以各自开发各自的模块,然后把各自的修改合并在一起。这样就大大提高了研发效率。

  合并各自分支的内容,我们就要使用到 git merge 这个命令。

                          git merge 的工作方式

  想象一下如下场景:小哀对APTX4869有自己的想法,于是她研发的一段时间,并想把内容合并到master分支上。在这段时间内,阿笠博士也对APTX4869辅助研发了一段时间。于是阿笠博士也想把内容合并到master分支上。如果顺利的话,之后的远程仓库master就有了小哀跟阿笠博士的最新修改。但这个过程会有几种情况会发生:

  1. 阿笠博士提交的时候,小哀还未提交。此时远程仓库是阿笠博士的版本,于是阿笠博士git push 成功(每个版本号都是40位十六进制的Hash值)

  首先阿笠博士将修改更新到自己的远程分支上,没有问题。之后在合并到主分支上

  如图所示,此时master上会多出一个合并结点,将aliboshi分支上的结点合并。

  2. 在阿笠博士push成功的过程中,小哀也在修改本地仓库。阿笠博士push完成后,小哀也push此次修改。因为本地master与此时远程的master版本不一致,于是push失败。

   因此,我们要先将小哀的master分支保持与远程仓库的master一致(也就是阿笠博士提交成功后的版本),再进行push操作。

  如图所示,小哀在pull最新后并处理冲突之后,也push成功了。

  至此阶段三同其他人开发的过程也学会了。不过我们还可以对分支上的开发流程进行优化,使一些commit变得更有意义,也就是阶段四

阶段四:Git rebase

  在阶段三的过程中,我们通过git merge与他人进行成果合并。这样虽然会大幅提高开发效率,但是会增加历史记录的阅读复杂程度。因此,如果个人分支上也使用git merge的话,会让自己的分支变的臃肿不堪,难以阅读。

  所以,我们可以通过另一个命令 git rebase 来优化我们自己的分支

                           git rebase的操作方式

  首先,柯南对APTX4869测试了两次,这两次的结果分两次进行了提交。但其实是对同一个项目版本进行测试,因此可以优化成一次测试,让分支结点更直观。

  如下图所示

  我们通过git log发现,柯南有两个提交记录,接下里我们将他合并成一个

 

  通过 - i 命令,来进行vim编辑模式,修改合并后的commit结点信息。

  如图所示,我们已经看到了柯南的两次提交结点已经合并成一个了。

感悟

  从这个简单的项目中,我体会到了使用git的各种好处。其简便,轻巧的操作方式,多分支,多历史的特性天然适应合作开发。

  在开发项目的过程中,创建自己的分支,每次模块更新完成后,先把最新的master分支pull下来,然后在自己的分支上进行测试。如果没有问题,在merger到master分支上,然后push到远程仓库中。这不仅可以有一个清晰的版本迭代记录,还能适当减少出错的概率。

  熟练使用git之后,相信会对我以后的工作,思想有很大的帮助!

参考文献

  https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg 

  https://zhuanlan.zhihu.com/p/57872388

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2020-10-04 18:15  子孝丶  阅读(178)  评论(0)    收藏  举报