实验一 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工作时不需要联网,也更加的安全。