IT审计:用SQL+Python提升工作效率
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.3 Git

你是如何管理文档的?很多人对于文件的管理是非常混乱的,尤其是当多个人协作的时候,经常发现别人发给自己的文档居然是在之前的版本上修改的,这让人十分头疼。管理稍微好一点的人,可能会给不同版本的文件名上加上类似V1、V2这样的版本信息以做区分,但时间一长就会发现自己的文件夹里存了大量不同后缀的文件。

如果有一个工具能够记录一个文档的不同版本,那么就不用担心把文件弄混了,并且可以方便地回退到各个历史版本中去。更重要的是和他人协作的时候,能够保证其是在最新的版本基础上修改的。那么有具有这样功能的工具吗?答案是有的,如Git。

在学习过程中如果你有任何操作上的问题,可以查看Pro Git(中文版),文档里有对Git的详细介绍。学会看文档也是我们在学习编程过程中必不可少的技能。

安装

Windows用户

在Git官方网站找到下载页面,选择对应操作系统的版本进行下载,如图1-3-1所示。

图1-3-1

在安装过程中单击“Next”按钮,即可采用默认配置。安装完成后在Windows“开始”菜单里会增加一个“Git”文件夹,如图1-3-2所示。选择“Git Bash”选项,打开命令终端,之后对版本控制的操作就需要在这个终端中进行,如图1-3-3所示。

图1-3-2

图1-3-3

Ubuntu用户

对于Ubuntu系统的用户,可以不用上述安装过程,直接在命令终端里运行命令即可:

Mac用户

Mac和Ubuntu都是类Unix系统,都可以在命令终端里用命令安装:

建立Git仓库

安装好Git后,如果想对本地计算机中的一个文件夹进行版本控制,那么需要怎么做呢?

很简单,从命令终端(Windows中为Git Bash)打开需要进行版本控制的文件夹,执行:

平时用Windows的人可能不清楚如何从命令终端打开某个文件夹,例如,在计算机D盘下有一个名为IT的文件夹,那么要打开这个文件夹可执行:

这里的cd命令就是切换目录。如果文件夹路径比较长,记不住怎么办?可以通过使用cd命令,再使用ls命令查看当前文件目录下有哪些文件,再使用cd命令切换到需要的目录,如图1-3-4所示。

图1-3-4

注意,输入路径时可以使用Tab键补全。

当执行git init进行初始化后,就会在当前文件夹下出现一个扩展名为“.git”的隐藏文件夹,用来存储版本控制的数据和资源。当然,我们现在还不会对当前文件夹下的文件进行跟踪和版本控制,只能先进行结构化框架的初始化。下面执行:

这个命令是使用最频繁的命令之一,作用是检查文件状态,简单理解就是通过该命令可以查看系统是否有记录文件修改,以及修改是否有提交。只有系统进行了记录,将来如果我们想回退到某个之前的版本时才有可能进行操作。

为了演示方便,这里新建了一个audit.txt文件,该文件中只有一行字符串“this is an initialtext”。执行git status后,显示audit.txt未被跟踪,如图1-3-5所示。

图1-3-5

如果要将该文件纳入版本控制,那么需要使用git add命令跟踪这些文件,执行:

这里可以用git add添加当前文件夹下的所有文件,或者只添加一个文件如git add audit.txt。添加完成后,再执行git status,如图1-3-6所示。

图1-3-6

系统提示“changes to be committed”,意思是对修改进行了提交,并且对需要提交的文件进行了列示。可能第一次接触Git的人会有疑惑,刚刚不是已经用git add 对文件进行添加并跟踪了吗?怎么还需要提交?

这就需要说明一下Git有一个暂存区(staged)的概念,使用git add 只是将文件的修改记录到了暂存区里。在文档的编写过程中,可能会有多次修改,通过git add 可以跟踪到每一次修改并添加到暂存区,而最后需要再做一次提交。执行:

这里的“提交描述”是对本次提交版本的说明,以便之后进行识别。在执行git commit后,并没有提交成功,系统反馈是“please tell me who you are.”,如图1-3-7所示。

图1-3-7

执行下面两条语句:

设置邮箱和用户名,以此作为身份标识。如图1-3-8所示,在设置后,再执行git commit就能正常完成提交了。用git status查看状态,可以发现设置成功。

图1-3-8

有时候一些文件并不想用Git记录,比如一些临时生成的“.pdf”“.exe”等文件,并且不想每次git status的时候系统弹出提示信息,那么此时可以在文件夹中新建一个“.gitignore”文件。这个文件的作用就是记录不想跟踪的文件。可以用文本编辑器打开:

写上不想跟踪的文件后进行保存。

以上是对本地已有的工作目录创建仓库,还有一个创建的方式是对已有仓库克隆,命令如下:

由于本书的附件资源在gitee上建立了远程仓库,因此也可以使用克隆的方式将远程仓库复制到本地。在gitee网站上任何一个项目都可以找到克隆的网址,如图1-3-9所示。

图1-3-9

使用git clone命令完成克隆后,就可以在本地学习、修改、运行代码了。

记录文件修改

显示更改信息

对于每一次文件的修改更新都可以用git add 添加到暂存区,再用git commit 完成提交。这两个命令是最简单和常用的,下面介绍在文件修改过程中可能会用到的命令。

git diff 用来查看修改后与已存入暂存区的版本的差异。在创建的仓库中audit.txt添加一行文字“第二行文档”,再执行git diff命令,如图1-3-10所示。

图1-3-10

如果使用的时候有中文乱码,那么通过执行以下命令,修改core.quotepath参数即可:

删除文件

对于已经提交的文档,如果直接删除,那么在使用git status 的时候还是会显示出该文件。因此需要使用git rm删除该文件。

移动文件

当我们想将某个文件移动到仓库中的路径的时候,需要使用git mv命令,当然修改文件名也是用这条命令。

对于文件的新增、修改、删除的操作我们都已经掌握了,那么在写文档的时候,如果想保留以前的修改,该怎么回退到以前的版本呢?由于Git的文件分为未记录到暂存区、已记录到暂存区、已提交3种状态,因此我们需要掌握这3种状态下的版本回退。

未记录到暂存区

我们已经在“audit.txt”里添加了一行记录并用git diff查看了修改的差异,但还没有用git add记录到暂存区。如果想放弃修改,那么要先用git status查看文档状态。

这里可以看到系统提示使用git restore放弃修改。通过执行:

回退到修改前的版本。注意,有些Git版本是使用git checkout 文件名来放弃修改的,具体看系统提示。

已记录到暂存区

在audit.txt文档中添加一行记录并使用git add将其添加到暂存区,执行git status:

可以看到系统提示使用git restore--staged <file>以放弃将记录添加到暂存区。由此也可以看出,并不需要一开始记住那么多命令,跟着系统提示操作即可。

已提交

当提交次数过多的时候,则可以使用git log查看历史提交的版本:

可以看到现在仓库里有两个版本,包含了SHA-1值、作者、日期、commit描述信息。

当commit多次后,如果直接使用git log,那么展示的历史信息就会很冗长,为了限制查看的版本数,可以使用命令:

显示最近两个版本,当然数字可以修改。如果在显示版本时,还想看每个版本具体做了哪些修改,那么可以使用命令:

-p参数能够显示每个版本的具体修改内容。

除此之外,git log还有很多参数可以选择,感兴趣的人可以使用git log--help查看。这里推荐使用:

● all表示同时显示所有分支的记录。

● graph表示以图形化展示版本记录。可以方便地看出分支的合并情况。

● decorate表示美化显示。

● oneline表示每条版本记录只显示一条关键信息。

显示效果如下所示:

接着刚才回退的话题,如果想回退到“init my document”这个版本,那么可以使用命令:

这里的SHA-1值就是执行git log的时候显示的字符串。比如想回退到最初始的版本,那么就执行:

这里的SHA-1值不需要输入完整,输入前面几个字符就可以,如“6e8e”。这个时候已经回退到了初始的版本。如果只有一个文件需要回退到之前的历史版本,对其他文件的修改还想保留,那么可以进行如下操作:

如果又想恢复到之前的版本怎么办?可以使用git reflog查看引用日志。当你在工作时,Git会在后台保存一个引用日志(reflog),引用日志记录了最近几个月的 HEAD 和分支引用所指向的历史。执行以下命令:

这里可以看到回退前的版本SHA-1值为d6a60f8,继续使用git reset命令回到回退前的版本。

分支的使用

有时候需要对文档进行较大幅度的修改,甚至是尝试一条新创作方向,但是最终是否成功我们并不知道。如果把之前的创作比作主路的话,那么再创建一个分支就是尝试新的道路。如果失败了,还能重新切换到主路去。创建了一个“dev”分支。

使用git branch查看当前所有分支:

可以看到显示出了两个分支master和dev,前面的星号代表现在还停留在master分支上。如果要切换到dev分支,则可以用命令:

当然可以使用git checkout-b命令将创建分支、合并分支两个步骤在一条命令中执行完:

比如新建一个tax.txt文档后进行添加、提交。于是在dev分支下就有了3个文件:

切换回master分支:

用ls可以看到本地只有两个文件,这说明master和dev分支是完全独立的,我们再也不需要像以前那样先复制整个文件夹再进行修改了,并且不用担心弄混文档。假如要将dev分支的修改合并到master分支上,那么只需要使用git checkout master,再使用git merge dev合并dev分支:

合并成功后,dev分支的修改就都保存在了master分支上了。如果不再需要dev分支,那么可以使用git branch-d命令进行删除:

对于分支的使用,初学者掌握到这里就差不多了,如果有更多需求,可以查看Pro Git文档。

添加远程仓库

前面所有的操作过程都是在本地计算机完成的,也就是说我们使用Git进行版本控制时可以不需要网络。但是如果有多台工作设备或者需要和他人协作,那么文档只存到本地计算机里就不行了,我们需要远程仓库。远程仓库是指托管在因特网或其他网络中的项目的版本库。而Github就是最知名的免费远程仓库了,可以将本地的版本库托管到上面。由于网络原因,这里使用国内的gitee。

注册好gitee账号后,新建一个空项目,填写好仓库名称、仓库介绍等,如图1-3-11所示。

图1-3-11

创建后,网站会给你一个远程仓库的网址,以及和远程仓库连接的命令,如图1-3-12所示。

图1-3-12

添加远程仓库

将本地的IT项目添加远程仓库后,就可以使用git push命令将本地的仓库进行推送了。

推送到远程仓库

直接使用git push会报错,如图1-3-13所示。

图1-3-13

由于这是一个新项目,所以提示我们使用命令:

如果添加远程时使用的是https的网址,则会提示你输入账号、密码,然后推送成功。如果添加过程时使用的是SSH协议的网址,则会提示没有权限。因此得进行配置让远程知道谁是这个远程库的拥有者。

删除远程仓库

为了测试,先将前面添加的远程仓库的连接删除:

免密码添加远程仓库

此处只需要在前面的网址中添加上用户名和密码,这样后续的推送就不需要再输入了。

输入以下命令(填写自己的信息)。

当然,如果是一个新项目,那么可以在gitee上新建后直接使用git clone克隆下来,这是对于初学者最方便的方式。对于这种方式,可以使用SSH协议传输,不用对每个新建的项目都去建立与远程仓库的连接,并且不用每次输入密码。

可以看到远程仓库的网址是https协议的,单击SSH后,可以得到“git@gitee.com:nigo81/it.git”网址。如果使用SSH协议传输,那么就用git clone克隆这个网址。为了以后每次上传不输入用户名、密码,则需要生成一对SSH的公钥、私钥,将公钥文本设置到gitee中。

生成SSH密钥

在终端输入命令后,在提示中一直按回车键,会在C盘(C/Users/yourname/.ssh)生成.ssh文件夹,这里的yourname是当前的Windows系统用户名。

如果是Ubuntu系统,则路径为“~/.ssh”。文件夹里有公钥id_rsa.pub和私钥id_rsa两个文件。用记事本打开公钥id_rsa.pub复制所有文本内容。打开gitee网站上的“setting->SSH and GPG keys”,将复制的公钥文本粘贴上去,如图1-3-14所示。

图1-3-14

添加完成后,gitee上有公钥,而我们的本地计算机有私钥,这样就可以安全通信了,使用git push的时候也不用再输入密码了。

推送和拉取代码

push

将本地分支推送到远程仓库对应的分支。

fetch

将远程仓库拉取到本地计算机。

pull

将远程仓库拉取到本地计算机并与本地版本合并。

pull request

当克隆了别人的项目后,如有一些非常好的修改,怎么能让原项目作者采纳呢?这也是开源项目的魅力所在,所有人都可以做贡献,同时所有人都能够受益。以gitee上的项目https://gitee.com/nigo81/audit-guid为例进行说明。如图1-3-15所示,找到一个开源项目,单击“Fork”按钮。

图1-3-15

找到Fork后的项目网址,使用git clone克隆到本地计算机,切换到dev分支(也可以使用master分支),可以帮助原作者修改一些错别字或者Bug。

修改完成后,提交并推送修改:

● 在自己(不是原作者)的gitee上切换到dev分支,并单击“New pull request”按钮。填写好描述信息后,单击“pull request”按钮,编辑标题并做简要描述。

● 此时你的“pull request”请求原作者就能看见了,如果原作者觉得你的修改不错,那么就会merge到他的分支上,这样大家就一起完成了一次协作。

作业:

1.Fork audit-guid项目,创建一个分支,发现并修改一些错误后提交pull request。

2.遇到问题可以查看Pro Git,或者通过搜索引擎寻找答案。