Git
Git是什么
Git是一种源代码版本控制系统(VCS),什么叫版本控制系统呢?
假设你写了一个Word文档,叫做《我的idea》.docx。
第一天,你blahblah写了不少点子,把它保存了下来;
第二天,你发现昨天的点子有一些纰漏,你将其更改了一些;
第三天,你发现第二天干坏事了,不小心删除了一个重要的点子,然而你已经想不起来那个点子了!
这时就体现出版本控制系统的重要性了,版本控制系统可以记录你每一次的文件更改,如果你用了版本控制系统的话,你可以将你的文件还原到任意一次更改时的状况。
PS:git版本控制系统实际上不适合docx这类非纯文本文件,在此处只是举例,源代码(纯文本文件)才是git大放光彩的地方。
Git的用法
详细用法不在此介绍我也不会
常见操作如下:
克隆服务器上的git项目
git clone xxxxx.git [可选:文件夹名]
其中“xxxxx.git”为你的项目地址。
执行完成后会看到当前目录下多出了一个文件夹,其名为[你克隆来的git项目名]/[你指定的文件夹名]。
比如我克隆一个测试仓库,执行
git clone https://github.com/EzraRT/testgit.git
一番翻云覆雨后,就把代码仓库克隆下来了,得到一个如下的文件夹
进入该文件夹,里面存放了此代码仓库的最新代码,还有一个特殊的文件夹
这个.git文件夹,便是git仓库的数据文件,一般它是一个隐藏文件夹,需要手动开启“显示隐藏的项目”才能看到它。
对于其中的内容我们暂且不深入,只要知道它储存了一些git的数据即可。
这是我不久前创建的代码仓库,仅有一个说明文件(README.md)和一个.gitignore文件。
接下来我们要介绍如何参与到代码改动的工作中去,让我们仔细地观察这张图
服务器:Remote
本地仓库:Repository
工作区:workspace
目录:Index
其中,本地仓库、工作区,目录都位于你的电脑上,只有服务器位于服务器上
废话,而你编辑代码时所做的更改都位于你的工作区,如何一步一步地提交代码改动并上传到服务器呢?提交更改
git add 文件名 [文件名1] [文件名2] [...]
这个指令是告诉git你更改的文件,git会将这几个文件于此时此刻保存起来(将某些信息保存在.git文件夹中),注意,之后你对该文件执行了更改,需要重新执行一遍add命令,不然git认为它还是上一次执行add时的模样。
git commit -m "提交信息"
这便提交了你的代码更改操作,你应在[提交信息]中简明扼要地说明你对代码进行了何种改动。
如果你进行了很多文件的更改,不想一个一个add它们,也可以执行:
git commit -a -m "提交信息"
这个-a选项即是让git把所有未add、但发生了更改的文件记录下来准备提交。一般地,使用此种方法可以快速地提交你的代码更改。
获取服务器上的最新版本代码
在你克隆下来的git项目的目录下执行(先别执行!)
git pull
但git常常用在团队合作中,如果有人在你之前更改了服务器上的代码,而你浑然不知,改了一些代码,准备提交到服务器上,傻傻地获取最新代码然后提交你的改动,这时会发生什么状况呢?
情况1:你和他改动的代码并无冲突(你们更改的不是同一个文件或是同一个文件的不同部分)
情况2:你和他的改动有git难以处理的冲突,此时强行pull会造成很多的问题,比如你的改动被覆盖(白干半天)。
关于这几种情况处理起来比较复杂(虽然git是有处理方法的),我们介绍一种比较好的处理方式。
先执行
git fetch
获取服务器上的最新代码,但不合并到你本地的代码中。如何理解这句话?让我们回到这张图
你add&commit操作都是在本地进行的操作,服务器浑然不知你的工作,而你不想白干活,因此要从服务器上fetch(拉取)服务器上的最新改动,并以此判断是否需要提交你的更改,同时也可以完成一些冲突的处理。但如果执行了pull操作,便会把代码改动直接应用到你的工作区,如果正好有人在你之前提交了某文件的更改,而你恰好也更改了它,这就是悲剧的开始。
因此,先fetch下代码改动并利用diff工具(代码比较工具)查看改动,确认没有冲突之后再pull并提交代码改动。
提交代码更改给服务器
终于到了这一激动人心的一刻,你的工作将被记录下来并保存到服务器上,执行
git push
便可以将你此前提交的代码更改(commit)告诉服务器了。如果执行push时git告诉你:“你的代码不是最新版本”,那想必是你又慢人一步了,请从第2点重新操作。
总结:参与到某git项目的代码维护工作中,你需要做的事有:
首先,clone对应的项目;
参与代码的改动工作,进行代码改动的基本流程如下:
fetch服务器的更改、仔细比较并确认、pull拉取最新的代码更改到你的工作区,commit提交你的代码改动、push上传你的代码改动到服务器。
日常使用的Git用法(利用软件集成的版本控制系统)
生活在现代的我们,往往不用操作如此繁琐的命令,此处介绍VSCode的图形化git工具,它可以帮助我们完成大部分的工作。
有关VSCode安装的相关教程可以查看这个
首先用VSCode打开我们git项目的目录,进行一番改动后,界面如下

对于这几处,与你平常编写代码时不一样的显示,我们从左到右进行说明。
文件改动列表(版本控制栏)
最左边,标记了一个数字,这是VSCode集成的版本管理系统(git工具),其界面如下图
你对文件进行的更改都会罗列在此处,本例中,我们改动了test.cc文件、新建了main.cc文件、删除了README.md文件,在此处点击它,便可以在右侧看到它与上一次提交的变化
左侧为改动前的文件,右侧为改动后的文件,此处我们将一句感叹编写成了一个可以编译执行的感叹。
某文件改动情况
对于有所改动的文件,它会在文件名右方显示改动的类型
蓝色的M是modified的意思,译为已被更改,说明我们对此文件进行了更改操作;
绿色的U,untracked,说明你新建了该文件且没有提交;
红色的D(可以在1:文件改动列表中查看),deleted,说明你删除了该文件。
每一行的改动情况
对应颜色与上述文件改动类型对应
这时我们如何利用图形界面进行commit、pull、push操作呢?
在版本控制栏中,点击文件名后面的小加号可以把它提交到舞台上
(OnStage)
,接着在上方的Message栏输入你的提交说明,最后点击这个勾,便将你[提交到Stage]
的改动commit完成了。最后,将你的代码改动push到服务器上去
等等!pull、fetch操作呢?说好的代码安全呢?
在VSCode的左下角,有一个循环模样的小按钮
其旁边的数字指示了你比服务器落后了多少个commit(下载箭头指示,可能是别人提交的)、你比服务器领先多少个commit(上传箭头指示,你想要提交的代码更改)。
点击它,便会执行pull&push操作,且在与服务器有冲突时会询问你该怎么办。具体情况具体对待,此处不做延伸。
这便是我们日常使用中对git的使用,相比命令行,对文件的改动变得显而易见,你可以利用图形化的diff工具比较每一处改动、用版本控制工具查看文件历史
(该文件的每次更改情况)
等等。
附录:.gitignore文件是什么呢?ignore的意思是忽略,此文件是一个文本文件,里面罗列了git进行代码比较、提交更改时忽略的文件、文件类型、文件夹等等。