高级软件工程第一次作业

 

本文首先感谢孟宁老师的教导
主要参考文献为软件学院孟宁老师所写的一篇文章,文章地址:https://mp.weixin.qq.com/s/Km5KuXPETvG0wCGHrvj9Vg

 

场景一:Git 本地版本库的基本用法

1、使用vscode打开一个本地文件夹,若当前文件夹下没有本地repository,那么可以直接点开vscode的源代码管理,点击初始化存储库按钮直接建立一个本地repository。

 

 2、完成之后文件夹的目录下会出现一个.git文件夹

 

3、设置自己的邮箱和用户名

 

 

 

4、一些常用的git命令

git status(查看当前工作区(workspace)的状态)

 

 

 git add 文件名,可把文件添加到暂存区(Index)

 

 

 

 

git commit -m "wrote a commit log infro” ,把暂存区里的文件提交到仓库

 

 

git log ,查看当前HEAD之前的提交记录,便于回到过去

 

git reset —hard HEAD^^/HEAD~100/commit-id/commit-id的头几个字符 # 回退之前的版本

场景二:Git 远程版本库的基本用法

先在github上new一个repository

 

 

 

 

 我们可以通过git clone URL命令将远程GitHub上的版本库复制到本地

 

 

 使用git remote 和git remote -v可以查看远程存储库的信息

 

使用git push把本地存储库发送到github

以上操作均为假定只有一个人对数据库进行串行的更新,孟宁老师的博客中描写了当多人并行对库进行修改操作的时候会出现多个不同的版本同时push的情况,在这种情况下,需要理解合并的背后原理。假设目前有两个对A版本的更新,以下内容来自孟宁老师博客:

 

 

 简要总结一下,合并操作可以用一个公式来表示:H = (F - A)+ (G - A),即F版本与A版本的差异,以及G版本与A版本的差异,合并起来形成一个新的版本H。
孟老师图:合并原理

场景三:团队项目中的分叉合并

 

就像上一个场景中最后所说的,当两人以上的团队合作开发时,需要考虑将每个人的工作流程合并时的冲突问题。每一位成员进行开发时需要为自己的工作创建一个分支,该分支只作为自己工作内容的模块。使用命令行或vscode下的终端输入git branch查看当前分支,只有一个master。

使用git checkout -b newbranch创建一个新的branch名为newbranch,可见当前的工作分支转移到了newbranch上

 

使用git merge newbranch将分支合并

 

 

 

 

 

场景四:Git Rebase

git rebase主要功能为使本地的多次提交合并为一个,整理自己的提交记录,简化提交历史。查阅资料发现,git rebase相比git merge可以更好地给你一个清晰的代码历史,gitmerge会产生多条分支而git rebase产生的是一个漂亮的直线提交历史。

1.rebase的黄金法则:绝对不要在公共分支上使用rebase

  • rebase操作可以把本地未push的分叉提交历史整理成直线;

  • rebase操作也可压缩一些无用提交

  • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

2.把一个分支中的修改整合到另一个分支的办法有两种:merge 和 rebase

  • merge 命令

    它会把两个分支最新的快照(C3 和 C4)以及二者最新的共同祖先(C2)进行三方合并,合并的结果是产生一个新的提交对象(C5)

  • rebase命令

    它会把在 C3 里产生的变化补丁在 C4 的基础上重新打一遍,相当于把在一个分支里提交的改变移到另一个分支里重放一遍

3.rebase原理
先回到两个分支最近的共同祖先,根据当前分支(也就是要进行衍合的分支 experiment)后续的历次提交对象(这里只有一个 C3),生成一系列文件补丁,然后以基底分支(也就是主干分支master)最后一个提交对象(C4)为新的出发点,逐个应用之前准备好的补丁文件,最后会生成一个新的合并提交对象(C3'),从而改写 experiment 的提交历史,使它成为 master 分支的直接下游

对text.txt文件进行三次修改,并且每一次修改都提交,模拟一些并不需要存在的提交记录。git log查看提交记录,如下图所示:

 

 

 

 使用git rebase -i HEAD^^^指令对三次提交做合并操作

 

 

 

 

 

 删除了前两个修改,只保留了第三次修改,然后使用:wq保存并退出。结果如下:

 

 

前两次的记录也从log中消失

 

posted @ 2021-04-01 15:37  Prince98  阅读(133)  评论(0编辑  收藏  举报