软件工程课程作业:学会使用git的几种基本用法。
参考自孟宁老师文章:https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg
Git简介:
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
使用vscode或git bash操作。
下面这张图可以帮助理解git各个阶段的对应分区:
场景一:Git 本地版本库的基本用法
1.初始化一个本地版本库
①使用vscode打开一个文件夹,若当前文件夹下没有本地repository,那么可以直接点开vscode的源代码管理,点击初始化存储库按钮直接建立一个本地repo。
②除了这种方法以外,还可以使用命令行git init在vscode终端中或者Git bash中创建新的本地repo。
③使用上述方法创建好本地库之后可以发现文件夹中多了一个.git文件(文件默认是隐藏的需要将隐藏文件显示)
④使用vscode创建了readme.md文件和test文件test2文件,文件readme.md后的M表示之前创建过,目前已经修改但没有提交,U表示未跟踪的。
使用git add [FILES] #可以把文件添加到暂存区,或者点击加号也可以将更改过的文件暂存起来,文件会出现在暂存的更改中。
如果想取消本次更改可以点击文件后的减号取消该次修改,提交时可以点击上方的对号√直接提交至仓库。
⑤一些常用命令(在git bash与vscode终端使用方式相同):
git status(查看当前状态)
git log(查看提交日志)
git commit -m “提交信息”
将暂存区的内容提交到仓库。
git reset —hard HEAD^^
版本回退功能,回到当前head前两个版本,也可以回退至更老的版本。
如果回退到较老版本后还想再回到最新版本则需要使用git reset —hard。
场景二:Git 远程版本库的基本用法
先在github上new一个repository
可以看到repository中看到新建的空白仓库
创建仓库后打开仓库看到仓库url链接,使用git clone命令行可以将远端库克隆到本地。
(注意需要提前将本地git与远程github账号绑定,绑定账号和邮箱)
将本地更改push至github需要登陆github账号并提供权限。
在github上creat一个新文件命名第一个文件,然后使用vscode拉取文件,拉取后文件已存在于.git文件所在的路径下,直接打开即可。
以上操作同样可以在gitbash中使用git pull和git push命令行完成,除了分别使用pull和push以外,在vscode中还可以同样使用“同步”直接完成拉取和推送两个操作。
BUT,以上操作均为假定只有一个人对数据库进行串行的更新,孟宁老师的博客中描写了当多人并行对库进行修改操作的时候会出现多个不同的版本同时push的情况,在这种情况下,需要理解合并的背后原理。假设目前有两个对A版本的更新,以下内容来自孟宁老师博客:
简要总结一下,合并操作可以用一个公式来表示:H = (F - A)+ (G - A),即F版本与A版本的差异,以及G版本与A版本的差异,合并起来形成一个新的版本H。
场景三:团队项目中的分叉合并
就像上一个场景中最后所说的,当两人以上的团队合作开发时,需要考虑将每个人的工作流程合并时的冲突问题。
每一位成员进行开发时需要为自己的工作创建一个分支,该分支只作为自己工作内容的模块。
使用命令行或vscode下的终端输入git branch查看当前分支,只有一个master。
创建新分支,并且将当前工作区切换为新建立的分支,此时再查看分支会发现星号*转到了mybranch前面,表示当前工作分支是mybranch,如果要切换回master分支则直接使用git checkout master即可,或则直接使用vscode提供的“签出到”选项。
如果要保存自己的工作,将mybranch合并到master分支,那么首先确保当期工作区处于master分支,然后可以使用git merge mybranch命令行,或者也可以使用vscode中的合并分支选项:
上述合并方式为快进式合并,也就是mybranch分支与master分支会合并到一条时间线中,mybranch不再作为一个独立的分支而是只存在master,另一种合并方式是关闭快速合并的合并方式。使用命令行:git merge --no-ff mybranch。这种方式会保留原来的mybranch分支,最后在master分支上生成一个节点。
为了版本分支清晰,比较推荐使用第二种合并方式。
修改合并后push至github上并查看,可以看到mybranch合并至master分支:
场景四:Git Rebase
git rebase主要功能为使本地的多次提交合并为一个,整理自己的提交记录,简化提交历史。查阅资料发现,git rebase相比git merge可以更好地给你一个清晰的代码历史,gitmerge会产生多条分支而git rebase产生的是一个漂亮的直线提交历史。
当前情况下先git pull到本地,然后切换到mybranch,然后对file1文件进行第一次修改:
之后再分别进行两次修改,并且每一次修改都提交,模拟一些并不需要存在的提交记录。git log查看提交记录,如下图所示:
使用git rebase -i HEAD^^^指令对三次提交做合并操作
删除了前两个修改,只保留了第三次修改,然后关闭文件即可,用vscode打开冲突文件,可以直接选择采用哪种更改:
之后将选择了某种更改方式后的 文件存入暂存区,然后需要让rebase继续执行,使用git rebase --continue指令,然后再push至仓库,最后查看github上的network,可以看到只存在第三次修改。