本文总结了在小学期时学到的一项必备技能——使用git进行项目管理。因为小学期需要大量代码书写,以及会有几个团队合作项目,这个时候使用git进行项目管理和团队开发就十分必要了,在使用过程中也确实极大地提升了代码和合作效率。
outline:
- 工具安装与配置
- 具体实现及功能
工具安装
此处所需要的工具只有git。关于git的安装可参考 CSDN:Git 详细安装教程
git的功能十分强大,还是一个很好的shell工具,这里主要要用到的功能是版本控制和与远程仓库相关联的功能。
这里使用的是gitlab进行远程仓库的存储和团队的共享。
上面的教程也提到下载完git之后需要将ssh远程配对,并且要将本地ssh密钥保存好。上面的教程是绑定到了github。可以用之前的密钥再去配置gitlab,也可以使用git指令再生成一个密钥去配置。
这里跟github有一点点小不同的地方。
生成密钥ssh时,应输入的指令为:
$ ssh-keygen -t rsa -C “yourgitlab@email.com”
之后在./ssh文件夹里找到id_rsa的PUB文件后复制粘贴到gitlab的密钥配置中(在gitlab的设置中找到)
查看是否配置成功
- 输入命令 ssh -T git@gitlab域名.com
- 或者简单粗暴直接clone工程
选择直接clone,要先索引到要clone的目录下,命令 git clone git@gitlab.com:xxx/xxx.git
成功后,工具的安装和配置就已全部完成。
具体实现
首先明确几个概念
- 仓库 仓库就是repository,就是一个目录,目录里面的所有文件都被Git管理起来,每个文件的修改、删除,Git都能跟踪。
- 工作区 工作区就是资源管理器里看到的文件。
- 暂存区 即我们的代码完成了一个阶段可以暂时使用本地保存一下。被保存到的地方也就是 暂存区。
- 远程仓库 与本地仓库相对,是将文件保存到远端去,以防止一些因素导致本地文件的丢失,也方便进行团队协作。
- 分支 分支就是远程仓库在主干之外的分仓库,一般团队协作时每个人可以把自己的文件上传到自己的分支上去,以防止对主干的干扰,同时也不需要经常从远端pull下来应对一些改变。
明确了这些,就可以进行操作。
上传流程
首先选择一个文件夹做自己的本地仓库,来使git帮我们管理这个文件夹,这里使用
git init
之后git会创建.git隐藏文件夹,然后这个文件夹git就开始管理了。
之后 我们完成了一段代码,保存之后想让git保管一下,首先要git add,这里有两个指令
git add filename # 将文件添加到暂存区
git add # 将本地仓库所有的文件添加到暂存区
关于暂存区,上面已经提到。暂存区的意义不大,要想让git管理还要一步是将文件上传到本地分支上,即指令
git commit -m "提交说明" # 使用commit将暂存区的文件进行提交到本地的分支
提交说明里的内容可以随意,最后会显示到gitlab上的提交记录上。add指令可以让我们不用把文件一个一个地commit,可以add一些之后一块commit到本地仓库。
以上是基本指令,还有一些指令可以辅助我们完成一些功能:
git commit -am "本次提交的说明" # add 和 commit 的合并,便捷写法,未跟踪的文件是无法提交
# 以下两个指令:跳过验证自动提交
git commit --no-verify
git commit -n
git commit --amend # 撤销上一次提交,并将暂存区文件重新提交,编辑器会弹出上一次提交的信息,可以在这里修改提交信息
git commit --amend -m "本次提交的说明" # 修复提交,同时修改提交信息
git commit --amend --no-edit # 修改文件内容并合并到上一次的commit变更当中,但不修改提交的信息
关于amend的使用,可以参考一下这篇回答,个人比较喜欢:git commit –amend命令
同时还可以查看工作区和暂存区和与远程仓库的状态,用指令
git status
查看的样子是这样
上面那句话的意思是 本地仓库比远程仓库多了一个commit,还没有传到远程仓库。
下面的意思是这个文件夹下的.vscode这个文件还没有被git跟踪。
以及 查看提交记录:
git log
接下来,就要做本地与远程仓库的关联。一般有两种方式,分别是ssh和http,在gitlab的该仓库中的clone那里都可以找到链接,从而进行关联。使用的指令都是
git remote add origin +链接
关联后自动关联到main或master分支,若要推送到远程仓库只需
git push origin +分支名
若远程仓库发生变化,则需先
git pull
这里要区分一下git pull、git fetch、git clone。
git pull = git fetch(只是保存到本地) + git merge
git clone是从无到有的过程,即本地没有版本库时使用。
分支管理
分支管理的目的就是将当前已经可以发布模块放在一个分支,在另外一个分支进行进一步开发,开发完成后可以进行分支合并。
在gitlab上默认的分支是master(主分支),也只有这一个分支,其他分支我们自行建立。
分支的主要操作:
git branch # 查看分支(*指向的为当前的分支)
git branch<name> # 创建分支
git checkout<name> # 切换分支
git checkout -b <name> # 创建加切换分支
git merge <name> # 合并某分支到当前分支
git branch -d<name> # 删除分支
本地新建分支后,远程仓库也自动建立分支,并将操作同步到该分支上进行改变。
在实际的开发中,一般master主分支是受保护的,也就是说只有项目的负责人才有权限在master分支上进行相关的操作,其他普通开发者只能向各自分支进行推送,那么普通开发者怎么才能让负责人知道自己可以合并分支,这就需要在gitlab上发起合并请求,负责人收到请求后开始合并。
分支合并时很大可能会出现冲突,即两相同文件的内容不一样,这个时候就要解决冲突,即选择其中一个为最终版本再进行合并。
可以用git status 查看冲突的文件,再用cat去查看。git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中HEAD代表当前的代码,>>>>代表其他版本冲突的代码,我们打开冲突的文件,将代码冲突进行修改之后,将HEAD,>>>等标志删除之后重新进行提交(add-commit)即可。提交完成后再merge合并即可。
若推送到远程出现冲突时,则先用git pull(上面有所提到)在拉取完成后,会自动提示我们冲突的文件,我们按照相同的方式进行修改后重新提交推送即可。
版本回退
当我们在开发的时候,将文件进行添加到暂存区然后提交到本地的版本库。版本库会将我们每一次的操作来进行一次存档。那么久方便我们很容易回退到某个版本。
我们可以使用 git diff HEAD – filename 命令可以查看工作区和版本库里面最新版本的区别,如果确定需要回退,那就按照下述的方式来进行回退。我们分几个情境来进行版本回退
1、当前编辑的文件还没有提交到暂存区
如果只是做了简单的修改,我们可以手动恢复到我们想要的状态,但是加入修改过多,已经忘记自己修改了什么内容,那么使用
git checkout – file 可以丢弃工作区的修改,在这里可能有两种情况:
一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。简单说就是让这个文件回到最近一次git commit或git add时的状态。
2、文件已经提交到了暂存区但是并没有提交到本地的版本库
git reset HEAD
使用checkout 就可以丢弃工作区的修改了。
3、已经将文件存储到暂存区并提交到了本地版本库
当我们进行回退的时候,要知道我们要回退到哪个版本,在git中使用HEAD表示当前的版本,那么如果要是回退到上个版本的话就是使用: git reset –hard HEAD^ 我们的版本就会被还原到上一个版本,使用HEAD^可以回退到上上一个版本,当然==再往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
在使用git reset的时候,有两个参数可以选择,分别是git reset –hard/soft,hard和soft的主要区别在于,soft只是回退了commit的信息,也就是指向之前的commit信息,但是对应的文件并不会发生改变。而使用hard方式commit信息会指向之前的信息,同时在工作区的文件也会跟随者进行变化。
4、当我们回退后又想前进到回退前的版本,git也提供了对应的操作方式
我们可以使用 git reflog 命令查看操作记录,来判断我们要回到哪个版本。
删除文件恢复
在git中,删除也是一个修改操作,一般会有以下两种操作。
1、误删除文件(已经add或者已经commit)
在本机上将文件进行删除后,我们介可以使用git status检测到文件的变动。但是原来的文件必须是已经add操作的
使用git checkout – 误删除文件名称,和上文介绍的恢复工作区状态的指令相同。
2、确定要删除文件
当我们在资源管理器将某个文件删除,使用git status 会提示我们使用 git rm 进行删除文件
使用 git rm (文件名称 然后进行commit
当然也可以使用git add . 来添加全部修改或新增的文件
注意,当我们没有进行add 和commit操作的时候我们是无法从原来的版本库进行恢复的,也就是直接新建一个文件,没有经过任何操作,是无法恢复的。
总结
以上是关于git的一些基本操作,还有一些比如分支和版本回退的延伸,目的都是为了高效地团队协作,无需再通过社交媒体发送文件的方式。同时也能方便自己在修改代码时能够及时回退之前的版本,而且能直观看出不同之处。git的版本控制是一个太过方便和强大的功能,这里我仅仅是根据自己的所学和一些尝试实践做的一点总结。相信以后会越来越多地使用到这个工具。