软件工程实验一 Git代码版本管理

实验一 GIT 代码版本管理 实验目的: 1)了解分布式分布式版本控制系统的核心机理; 2) 熟练掌握git的基本指令和分支管理指令; 实验内容: 1)安

实验一 GIT 代码版本管理

实验目的:

1)了解分布式分布式版本控制系统的核心机理;

2)   熟练掌握git的基本指令和分支管理指令;

实验内容:

1)安装git

2)初始配置git ,git init git status指令

3)掌握git log ,git add ,git diff 指令

4) 掌握git tag git branch,git commit 指令

5)掌握git revert 指令

实验记录:

1、实验过程

(1)安装git

在官网上下载windows版本,并在安装时选择了全部默认的选项

(2)初始配置git ,git init git status指令

①初始配置git

按照实验指导的内容,在命令行输入相应代码,配置用户名,邮箱以及其他设置。如图1

 

图1

配置后,还需配置代码编辑器,在命令行输入一下命令:git config --global core.editor "'D:\Apps\Git\git_bjq\Sublime Text3\Sublime Text3\sublime_text.exe' -n -w"

此时,git配置完成。

②创建仓库

首先需要创建项目目录,此处创建涉及了cd和mkdir命令用于创建目录,如图2

 

图2

③下面开始克隆现有仓库。输入命令git clone https://github.com/udacity/course-git-blog-project,结果如图3

 

图3

克隆命令报错,上网查询原因,是由于http协议错误。后使用手机热点重新克隆,结果如图4

 

图4

点开目录,可以看到,仓库内容已经被克隆下来了。

 

图5

④判断仓库状态

使用cd命令进入course-git-blog-project 项目中,在命令行输入git status,运行结果如图6所示。

 

图6

这说明我们的git位于master分支,没有新的更改或操作,处于“休息状态”。

回退到new-git-project项目,再次输入git status,输出结果如图7

 

图7

 

(3)git指令

①git log指令

·git log命令

在命令行转入course-git-blog-project 仓库,输入git log,结果如图8.

 

图8

git log命令会显示该仓库的commit信息,commit第一行黄字信息是SHA,每个commit的ID编号,第二行则是提交的作者信息,包括名字以及邮箱。第三行是提交时间,第四行则是信息。

·git log –oneline命令

本指令每行显示一个commit,开头显示SHA的前7个字符,后面显示commit的消息。

·git log –stat命令

本指令用于显示commit中更改的文件以及添加或删除的行数

·git log –p命令

本指令显示了修改的文件以及增加/删除的实际更改。

·git show命令

本指令可以显示特定的commit信息。

 

②git add命令

按照实验指导内容,在new-git-project文件夹下建立了一个index.html文件,big在一个js文件夹下新建app.js文件,另一个css文件夹下新建app.css文件后,在终端输入git status命令,结果显示如图9

 

 

 

 

图9

有图可以看出,git已在观察目录,但并未跟踪。

下面使用git add命令将文件放入暂存区。再次输入git status命令查看状态,结果如图10.

 

 

 

 

图10

 

③commit提交命令

本命令会打开代码编辑器,而由于一开始已配置好了subline Text编辑器,故而在此不再重设。输入git commit后,编辑器被打开了两个窗口,一个是index.html的代码窗口,另一个是如指导书所示窗口,在该窗口首行输入Initial commit后,关闭两个窗口,回到终端界面,终端如图11所示。

 

 

 

图11

图11表明,处于暂存区的文件已经被成功提交了。

下面继续提交第二个commit,按实验指导要求,在index.html的body里输入<header>

   <h1>Expedition</h1>

</header>

并保存,后在终端输入git status查看状态。状态如图12

 

 

 

 

图12

图12表示index.html文件被修改了。

下面再次使用git add命令将index.html文件移入暂存区,使用git status命令查看状态。结果如图13

 

 

 

 

图13

在终端输入git commit -m "Add header to blog",这样避免打开编辑器的同时,也能添加commit消息。提交第二个commit后结果如图14

 

 

 

 

图14

 

④git diff命令

将index.html文件中的”<h1>Expedition</h1>”改为”<h1>Adventure</h1>”并保存。在终端输入git diff命令,结果如图15。

 

 

 

 

图15

图14显示了刚刚修改的文件,并显示了更改内容和位置。git diff命令用于查看以及更改过的但是还没commit的状态。

⑤gitignore

在new-git-project下添加文件project.docx,并添加一个.gitignore文件,打开.gitignore文件,并输入project.docx保存。在终端输入git status命令查看状态,结果如图16.

 

 

 

 

图16

图15说明project.docx已经不再被列为未跟踪文件,而是列出了“.gitignore”文件。

⑥git tag命令

git tag命令用于创建标签,标签可用于区分特定的commit。在终端输入git tag -a v1.0 后,终端打开了编辑器,在打开的编辑器首行输入Ready for content后,保存退出。但此时,终端无显示。这时在终端输入git tag,终端会显示v1.0的标签。

若想知晓标签位于仓库的位置,在终端输入git log后即可查看,如图17。

图17

  若需要修改标签或删除,则应在终端输入git tag –d v1.0,之后终端会显示Deleted tag ‘v1.0’(was 38ebe9a),这表明标签v1.0已经删除。

  若为以前的commit添加标签,则需在命令最后加上该commit的SHA。在终端输入git tag –a v1.0 eff5f50,结果终端显示fatal: Failed to resolve 'eff5d50' as a valid ref. 这应该是我未替换实验指导的commit的SHA。重新查看了仓库中的commit后,在终端输入git tag –a v1.0 36e0ea8,结果终端打开了编辑器,表明可以为SHA为36e0ea8的commit添加标签了。

 

⑦git branch分支与git checkout命令

在终端输入git branch,终端会显示仓库的所有分支。创建分支则直接在后面加上分支名称git branch sidebar.转到新创建的分支则在终端输入git checkout sidebar。如图18

 

 

 

图18

再切换到master分支,删除sidebar分支,输入git branch –d sidebar,由于sidebar分支上未添加commit,故而终端会显示Deleted branch sidebar(was 60d75f0)表示sidebar分支已删除。

 

(4)分支实战

①为页面添加默认颜色

在master分支上,打开css/app.css后添加

body {

    background-color: #00cae4;

}

保存文件并将其commit到仓库。这里commit的内容写了“Add color for blog”

如图19

 

 

图19

 

②添加侧栏

要将添加侧栏的commit置于设置页面颜色的commit之前,需找到设置页面颜色的commit前一个commit。如图20

 

 

 

图20

在终端上输入$ git branch sidebar 029162c后,sidebar分支即创建完成,接着转到sidebar分支下,输入命令git checkout sidebar ,此时输入git log –oneline后可以看见刚刚提交的关于设置页面颜色的commit没有了(如图21),而打开css/app.css后,里面的代码也没了。

 

 

 

图21

此时,打开index.html文件,在<footer>下添加两个字“侧栏”,保存并提交这个commit,commit的消息写“add aside to html”。再使用git checkout master转到master分支下,打开index.html,将标题改为Adventure。保存并commit,commit的消息写“Improve site heading for SEO”,如图22.

 

 

 

图22

在终端上输入git log --oneline --graph –all,便可以看到仓库里的所有分支,如图23.

 

 

 

图23

 

③合并

git merge指令可以用于合并分支。在终端输入git merge sidebar,即可将sidebar合并到master分支上,如图24

 

 

 

图24

④合并冲突

首先人为制造一个冲突,在master分支下,修改index.html中的标题为”Quest”保存并commit,commit内容为”change title”。使用git log获取上一个commit的SHA后,在该commit上创建一个名为header-update的分支,命令为git branch header-update 8c24d4f。之后,在终端输入git log --oneline --graph --all,查看仓库所有commit。结果如图25

 

 

 

图25

切换到header-update分支,更新标题为Crusade,保存并提交commit,commit内容为“change title again”。回到master分支后,输入git log --oneline --graph –all,查看仓库所有commit,如图26

 

 

 

图26

 

然后合并header-update,在终端输入git merge header-update,结果如图27

 

 

 

图27

 

打开代码编辑器,在里面打开index.html,结果如图28。

 

 

图28

此代码中,<<<<<<< HEAD显示了当前分支的行;

||||||| 8c24d4f显示了原始行的内容;

======= 表示原始行内容的结束位置;

>>>>>>> header-update是要被合并的分支上的行结束提示符。

修改好冲突代码后,保存并提交后,就完成了合并。

 

(5)撤销、更改

①更改:在终端输入git commit –amend 即可更改最近的commit。可以重新提供commit消息、添加忘记的文件等等。

 

②还原:在当前分支下打开index.html,删除其中一行,保存并提交后,使用git log –oneline查看刚刚提交的SHA,然后在终端使用git revert命令,还原该commit。此后,再次打开index.html可以发现,之前删除的现已还原回来了。

 

③重置:重置与还原不同,还原是创建一个新的commit,然后还原并撤销之前的commit,而重置则是清除之前的commit。 重置的命令是git reset,后有三个选项:

  • --hard 选项清除 commit
  • --soft 选项将 commit 的更改移至暂存区
  • --mixed 选项取消暂存已被 commit 的更改

 

④备份分支:在进行任何重置操作之前,可以在最近的commit上创建一个backup分支,这样若出现错误,可以返回这些commit。

 

2、实验问题与解决

①在刚安装好git之后,发现git bash无反应。

    一开始打开git bash后,发现git bash的页面里没有文字,只有一个光标一直在闪烁,不知道该从何下手然后便随手关闭了。于是在cmd里配置了一系列的账号,邮箱等。后来才发现,我的git bash不知道什么原因,反应非常慢,每次刚打开或者输入完一行代码后都要等待很久才出结果。我个人认为可能是在一开始安装时,不是按照默认选项选择的,而是把全部选项都选择了,这才导致我的软件异常的慢。

 

②无git邮箱

在开始配置git的时候,由于实验指导上面写需要Git邮箱,于是就去了GitHub网站准备注册GitHub的账号,但是始终注册不了,后来同学告诉我其实只要是邮箱就行。

 

③打不开代码编辑器

    在输入git命令后,无法打开代码编辑器,一开始我以为是因为在cmd里配置的不行,于是在git bash里的master分支的文件夹下又配置了一遍,测试发现还是打不开代码编辑器,最后我发现是我的代码编辑器的路径问题,我的路径中有文件夹名称中间的空格忘记打了,于是将git bash关闭重新打开,按照正确路径重新配置了一边后,问题解决了。

 

实验总结与体会:

本次实验前,我完全没有接触过关于git的概念,故而刚刚开始做着实验报告的时候,就很没有头绪,总算随着后续学习的推进,加上和同学之间的讨论让我弄清楚了本次实验的整个过程。

通过本次实验,我学习到了git的概念,学习了一些git的基本操作,也初步

了解了软件工程项目是如何进行的。

 

思考题:

阅读维基百科和百度百科 的Git词条,总结分布式分布式版本控制系统的核心机理

分布式版本控制系统的客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。git与其他非分布式的版本控制系统不同的是git工作时不需要联网,也更加的安全。