首先要感慨一下,这些日子以来实在是太忙了,每天都从早到晚地做项目,以至于连续好几个月没有更新博客了。其实期间还是有很多值得分享的内容的,只不过因为时间问题搁浅了,到现在也都忘了有哪些了,实在可惜。。。
写这篇文章主要是出于一个个人认为比较普遍的现象,就是很多开发者虽然都在用Git管理的项目,但是大多数人都只是在“傻瓜式”地在用,而且经常不知道自己在干什么,究竟自己的项目发生了什么。
就我们公司现在的项目组来说吧,头两天开始组长一直在跟我提,让我有时间跟进一下CodeReview,组织大家把这方面搞起来。今天终于有空做了一下,才发现原来大家在使用Git的时候基本都是属于小白级的,更别说在GitLab等服务器上管理项目了。
所以打算以此文章帮助大家了解一下Git,让大家尽量能够明白自己的操作都是在干什么,遇到问题了到底是因为什么,应该怎么应对等等。(顺便说一下,个人是比较不倾向于用TortoiseGit这类的界面化软件的,直接用Git Bash反而会更加方便、明了)
好了,废话到此结束,下面开始进入正题~
git add/ git commit / git pull / git push/git status 这些命令应该是用的最多的了,具体的我就不说了。下面来针对分支branch和远程服务器remote进行一些讲解,让大家理解一下Git在项目管理上的结构,进而才能明白我们在做什么,遇到问题了该怎么分析怎么解决。
如果我们使用Git Bash进入一个目录(比如:D:/test/),在这个目录下执行git init命令,就会在这个目录建立一个Repository(仓库),这个仓库就是我们被Git管理的仓库了,如果你在这个目录下做什么操作,都是可以通过Git进行管理的。比如你新建了一个文件TestFile.txt,那么通过git add TestFile.txt 命令就可以把这个文件加入Git 的暂存区,再通过git commit -m "增加一个文件TestFile.txt" 命令就能够彻底将这个文件纳入Git管理了。
那么branch(分支)是什么呢?其实大家可以理解成一种科幻电影里的“平行世界”。当建立一个Repository后,Git会默认为我们建立一个master分支的,我们默认的是在这个名字叫做master的分支上进行操作。当然,我们可以通过git branch testbranch 命令建立一个名字叫做testbranch的分支,这个分支是基于你当前的分支创建的,也就是说,你当前如果处于master分支的话,如果你建立了testbranch分支,那么testbranch分支里的内容会和你在master分支里commit进去的内容是一样的,testbranch里同样会有刚才我commit进的TestFile.txt文件。我们可以通过git checkout master和git checkout testbranch命令在两个分支上来回切换,切到哪个分支上你的文件目录就会变成哪个分支上的内容。(git checkout -b testbranch2 命令相当于git branch testbranch2 + git checkout testbranch2两个命令,后面这些花哨的命令我就不再赘述了,等读者慢慢熟悉了Git后自然会接触到更多像这样的命令)。
上面讲的分支的概念一定要理解清楚,因为这是理解git pull和git push 的基础。大家可以发现,在之前的讲解中,并没有涉及到git pull和git push,那是因为我们一直在一个仓库Repository中进行操作,我们在自己管理自己的项目。如果涉及到多人管理,也就是我们要管理别人的项目或者公司的项目的时候,就会涉及到别人的Repository了。在这里,希望读者们把公司的Repository(GitLab上的或者Stash上的等等)当做和自己电脑上的Repository一样看待,没有太多特别的。
那么现在就涉及到两个Repository的协调了。为了避免直接讲解太复杂的内容,下面我就一个比较简单的场景进行讲解,复杂的等读者熟悉得差不多后再说。场景如下,远程(公司)的服务器上有个仓库Repository,这个项目包含了一个master分支,一个TestA分支,一个TestB分支。我们开发项目时,在自己电脑上直接把项目clone到本地,那么我们的电脑上也会出现一个同样的Repository,同样包括一个master分支,一个TestA分支,一个TestB分支。现在大家心里就应该明确一点:你目前能了解到的已经有6个分支了,远程有三个,你本地也有三个。为了方便区分,后面我会把本地分支后面加一个(L)。那么当我们使用git checkout master命令的时候,其实我们是在本地切换到了master(L)分支上,要记住哦,我们是不可能切换到远程上的分支的哦,那不是你的Repository~很多人就是因为这些没有区分出来,导致了自己都不知道自己在做什么,只是稀里糊涂的有个简单的git pull和git push概念。
下面就轮到git pull 和git push出场了。如果我们git checkout TestA之后会切换到TestA(L)分支上,如果我们做了一些改动,git add和git commit之后,意思是讲这些改动提交到了TestA(L)分支中,而远程的TestA分支还是原来的那个样子,如果你想让远程的TestA分支也变成你改动之后的样子,那就会用到git push命令了。当然这里是不出意外的情况,因为大概是在1.9.2之后的Git版本中,Git默认的push方式改成了simple方式,个人比较建议这种方式(即从哪里pull过来,我就push回哪里去)。可以通过命令git config push.default查看你当前的push方式,可以通过git config --global push.default simple命令把你全局的push方式设置成simple方式的。其它方式读者可以自行搜索在此不再赘述。所以总结一下,一般情况下,如果你checkout到了TestA(L)分支上执行git pull命令,就会把远程Repository中TestA分支中的内容更新到你本地的TestA(L)分支中;push命令同理。
好了太晚了,今天就先讲到这里。后文提醒一下自己,讲解一下remote方面的内容以及merge相关的内容,这些内容都是在项目中非常重要的动作与概念,希望大家要搞清楚。最后可能还会讲解一些CodeReview相关的内容以及在Git使用过程中比较常出现的一些零散的但是却很关键的问题。相信大家如果按照顺序了解了前几篇文章之后,最后看到那些问题自己就可以分析出原因与解决方案了。下一篇的地址是:点击打开链接