实验一 git代码版本管理
实验目的:
1)了解分布式分布式版本控制系统的核心机理;
2)熟练掌握git的基本指令和分支管理指令;
实验内容:
1)安装git
2)初始配置git,git init statua指令
3)掌握git log,git add,git diff指令
4)掌握git tag git branch,git commit指令
5)掌握git revert指令
试验记录:
1 配置git
#设置你的git用户名
#设置你的git邮箱
#确保 Git 输出内容带有颜色标记
#对比显示原始状态
2 从头创建仓库
在对 Git 仓库进行 commit 或执行任何其他操作之前,需要一个实际存在的仓库。要使用 Git 新建一个仓库,我们将使用 git init 命令。
init 子命令是"initialize"(初始化)的简称,这个命令很有用
创建的过程中可能涉及如下命令
-
ls - 用来列出文件和目录
-
mkdir - 用来新建目录
-
cd - 用来更改目录
-
rm - 用来删除文件和目录
-
pwd -列出当前目录
创建项目目录
创建一个目录,叫做 se2020-git-course,在该目录中,创建另一个目录,叫做 new-git-project,使用 cd 命令移到 new-git-project
目录下可在终端上运行以下命令
git init
可以开始使用 git init 命令了!这是最简单的命令之一。你只需在终端上运行 git init。
终端会显示 git init 命令正在运行。该命令会在当前目录下初始化生成一个空的 Git 仓库。
运行 git init 之后,应该会出现一段文字:"Initialized empty Git repository in",后面提示符中出现了matser。运行 git init 命
令会初始化 Git 跟踪所有内容会用到的所有必要文件和目录。
克隆现有仓库
在 Git 上进行克隆的方法是调用我们将在终端上运行的命令 git clone,然后传入要克隆的 Git 仓库的路径(通常是 URL :https://github.com/udacity/course-git-blog-project )
完整命令是:
克隆过程中,第一行是"Cloning into 'course-git-blog-project'…"。Git 正在创建一个目录(名称与我们要克隆的项目一样),
并将仓库放在其中!其余输出结果基本都是验证信息——也就是统计远程仓库的项目数,然后压缩并接收这些项目,并解压。进入course-git-blog-project文件夹,在浏览器中打开 index.html 文件。可用看见已经克隆的blog网页。
判断仓库的状态
git status 是了解 Git 的核心所在。它将告诉我们 Git 正在考虑什么,以及 Git 所看到的我们仓库的状态。当你第一次使用
Git 时,你应该一直都要使用 git status 命令.你应该习惯于运行任何其他命令之后,都运行下该命令。这样可以帮助你了解
Git 的工作原理,并避免你对文件 / 仓库状态做出不正确的推论。
3 git log
克隆course-git-blog-project 仓库后,使用命令行转到项目的目录下。
你可以看到 git status 的输出结果是:"nothing to commit, working directory clean",可以继续并检出该项目了。在visual studio中打开index.html
输入git log 命令显示仓库中所有 commit 的信息
默认情况下,该命令会显示仓库中每个 commit 的:
- SHA
- 作者
- 日期
- 消息
git log --oneline命令
-
每行显示一个 commit
-
显示 commit 的 SHA 的前 7 个字符
-
显示 commit 的消息
git log --stat命令
显示commit中更改以及添加或删除的行数
git log -p 显示对文件作出实际更改的选项
处理太多滚动操作
有两种实现方式!
-
向 git log 提供你要查看的 commit 的 SHA
-
使用新的 git show 命令
git log -p fdf5493
通过提供 SHA,git log -p 命令将从这条 commit 开始!无需滚动并逐条查阅!注意,它还会显示在所提供的 SHA 之前提
交的所有 commit 信息。
新命令 git show
git show fdf5493
上行上述示例命令将仅显示最近的 commit。通常,将 SHA 作为最后一个参数提供给命令:
git show 命令将仅显示一个 commit。因此,如果你看不到任何其他 commit,不要惊慌。它只显示一个 commit。git show
命令的输出和 git log -p 命令的完全一样。因此默认情况下,git show 会显示:
-
commit
-
作者
-
日期
-
commit 消息
-
补丁信息
4 git add& git commit&git diff添加新文件,并使用git status 检查状态
(1)添加新文件,并使用git status检查状态:进入到new-git-project,创建index.html文件,建立js,css文件夹,并在文件下分别建立app.js和app.css文件,文件内容可为空。并用git status查看状态。
(2)暂存文件:使用git add命令将文件从工作目录移到暂存区,工作目录中目前有三个未跟踪文件:index.html;css目录下的app.cs;js目录下的app.js。并用git status查看状态。
(3)提交Commit:安装sublime Text,并运行以下语句进行配置,使得编辑器打开,在编辑器第一行输入Inital commit文本,保存文件并关闭编辑器窗口,提交第一个commit.
使用git commit -m提交第二个commit
(4)git diff:git status 命令告诉我们可以哪些文件被更改了,但是不会显示到底是什么样的更改,git diff却可以。Git diff命令可以用来查看已被加入但未提交的更改,在index.html中将标题从"Expedition"改为"Adventure"。保存文件,然后在终端上运行git diff。
(5) gitignore
5 标签、分支
(1)添加标签:输入以下命令:git tag -a v1.0
删除标签
(2) 创建分支 使用git branch siderbar创建分支,git checkout命令切换分支,切换成功后提示符显示“siderbar”
活跃分支查看:git branch
删除分支:git branch –d
分支实战:
更改1-添加页面颜色:确保位于master分支上,并向css/app.css添加以下内容body{background-color:#00cae4;},将文件添加到暂存区,并将其commit到仓库,在仓库中第一行写Set background color for page,通过 git log检查commit记录。
更改2-添加侧栏:将sidebar分支放在设置页面颜色的commit之前,向该commit添加分支命令,使用git checkout命令切换到新的siderbar分支,运行git log --oneline --decorate,运行 git log --oneline,发现Set background for page没有了。
更改3-更改master上的标题:切换到master分支并更新页面标题,使用git checkout命令切换到master分支,保存index.html文件并进行commit已将此添加到仓库中,消息写为“Improve site heading for SEO”,提交后用git log --oneline检查。
6 合并
合并:现检查是否位于new-git-project;是否检出master分支;git status输出文本包括working directory clean。合并指令:git merge指令用来合并git分支
7 撤销更改
更改最后一个commit:运行git commit --amend,重新提供commit消息,代码编辑器打开,显示原始的commit消息,纠正错误或重新表述,然后保存文件并关闭,以便采用新信息。
(2)向commit中添加忘记文件:git commit --amend能够包含忘记包含文件(或文件更改)。
(3)还原commit:使用git revert命令还原,找到最近的commit的SHA,运行git revert SHA,弹出代码编辑器,确认提供的commit消息。
(4)重置:git reset命令用来重置(清除)commit;使用 --hard
选项清除 commit ;使用 --soft
选项将 commit 的更改移至暂存区;使用 --mixed
选项取消暂存已被 commit 的更改
(5)备份分支:在最近的 commit 上创建一个 backup
分支,因此如果出现错误,可以返回这些 commit;然后运行git reset --mixed HEAD^会把commit中做出的更改一直工作目录中。
小结
通过老师在学习通里面给的步骤一步一步来操作,能够基本上出现大部分运行结果,学习并掌握了一些基本的git命令,在实验过程中,时常会发生命令结果与要求不符,在查阅资料和同学的帮助下,解决了困难,例如在执行命令时需要确定仓库是否正确,在分支实战中有很多命令多次错误,好在及时修改,完成了任务。总的来说,在第一次实验进行完成之后,我认识到git是一个非常强大的分布式版本控制工具,要经常用git status查询当前状态,避免错误。对于本次实验还要通过课后的进一步巩固和理解整个实验内容。
思考题
阅读维基百科和百度百科 的Git词条,总结分布式分布式版本控制系统的核心机理
答:git和其他版本控制系统(如CVS)有不小的差别,git本身关心文件的整体性是否有改变,但多数的版本控制系统如CVS或Subversion系统则在乎文件内容的差异。git拒绝保持每个文件的版本修订关系。因此查看一个文件的历史需要遍历各个history快照;git隐式处理文件更名,即同名文件默认为其前身,如果没有同名文件则在前一个版本中搜索具有类似内容的文件。
git更像一个文件系统,直接在本机上获取数据,不必连线到主机端获取数据。 每个开发者都可有全部开发历史的本地副本,changes从这种本地repository复制给其他开发者。这些changes作为新增的开发分支被导入,可以与本地开发分支合并。
分支是非常轻量级的,一个分支仅是对一个commit的引用。
git是用C语言开发的,以追求最高的性能。git自动完成垃圾回收,也可以用命令git gc --prune
直接调用。
git存储每个新创建的object作为一个单独文件。为了压缩存储空间占用, packs操作把很多文件(启发式类似名字的文件往往具有类似内容)使用差分压缩入一个文件中(packfile),并创建一个对应的索引文件,指明object在packfile中的偏移值。新创建的对象仍然作为单独文件存在。repacks操作非常费时间,git会在空闲时间自动做此操作。也可用命令git gc
来直接启动repack。packfile与索引文件都用SHA-1作为校验和并作为文件名。git fsck
命令做校验和的完整性验证