(一)实验目的:
1)了解分布式分布式版本控制系统的核心机理;
- 熟练掌握git的基本指令和分支管理指令;
(二)实验内容:
1)安装git
2)初始配置git ,git init git status指令
3)掌握git log ,git add ,git diff 指令
- 掌握git tag git branch,git commit 指令
5)掌握git revert 指令
(三)实验记录
1.1 安装GIT
根据自己电脑实际情况安装GIT。
1.2 初次配置GIT
设置GIT用户名,邮箱,并确保 Git 输出内容带有颜色标记,对比显示原始状态。
1.3 从头创建仓库
1.3.1创建项目目录
创建一个目录,叫做 se2020-git-course,在该目录中,创建另一个目录,叫做 new-git-project,使用 cd 命令移到 new-git-project 目录下。
可在终端上运行以下命令:- mkdir -p se2020-git-course/new-git-project && cd $_
1.3.2 初始化并查看状态
在终端输入git init,运行。
输出:"Initialized empty Git repository in",后面提示符中出现了matser。状态为No commits yet"(尚未有任何提交)
说明:运行 git init 命令会初始化 Git 跟踪所有内容会用到的所有必要文件和目录。所有这些文件都存储在叫做 .git的目录下。这个 .git 目录是一个库!Git 会将所有 commit 记录在这里,并跟踪所有内容!
1.3.3 克隆现有仓库
在 Git 上进行克隆的方法是调用我们将在终端上运行的命令 git clone,然后传入要克隆的 Git 仓库的路径(通常是 URL)。输入命令 git clone,然后输入你要克隆的 Git 仓库的路径。实验使用以下 URL :https://github.com/udacity/course-git-blog-project 。
完整命令是:git clone https://github.com/udacity/course-git-blog-project
原因:
首先是出现该问题可能是上传大小限制,执行如下命令:
git config http.postBuffer 524288000
此时再次clone依然可能报错,这时可以尝试git config http.sslVerify "false"
但是这时显示fatal: not in a git directory
使用如下命令
git config --global http.sslVerify "false"
然后再输入git clone https://github.com/udacity/course-git-blog-project
1.3.4 判断状态
在终端输入git status ,查看结果。
输出:
(1)On branch master – Git 位于 master 分支上。
(2)nothing to commit, working directory clean – 表示没有任何待定的更改。
可以将这一输出结果看作“休息状态(resting state)”。因为没有新的文件、没有对文件作出更改、暂存区没有任何需要 commit 的内容……没有更改或操作。
1.4.1 查看目录状态
使用命令行转到项目的目录下,输入 git status 。
输出:"nothing to commit, working directory clean",意味着我们可以继续并检出该项目了!
1.4.2 查看更改
(1)git log -- online,结果简单节省空间。
输出:每行显示一个 commit
显示 commit 的 SHA 的前 7 个字符
显示 commit 的消息。
(2)git log --stat
输出:显示被修改的文件
显示添加/删除的行数
显示一个摘要,其中包含修改/删除的总文件数和总行数
(3) git log -p
此命令会向默认输出中添加以下信息:
显示被修改的文件
显示添加/删除的行所在的位置
显示做出的实际更改
1.5 git add&git commit&git diff指令
1.5.1 添加新文件
在new-git-project里 创建 index.html 文件,添加代码;建立 js 和css 文件夹,并在文件下分别建立 app.js 和 app.css 文件,文件内容可为空。
(1)运行git add index.html命令,使用 git add 将 index.html 添加到暂存区:
输出:显示 index.html 现在位于"Changes to be committed"(暂存)分类下。
(2)暂存其他文件
运行git add css/app.css js/app.js指令:
(3)进行第一次提交
输入“git commit”,进入编译器进行修改:
输出:完成第一次提交。
1.5.2 git commit
(1)现在提交第二个 commit!将以下内容添加到 index.html 中的 body 标记中:
Expedition
(2)使用 git add 命令将文件移到暂存区,并使用 git status 验证文件是否位于暂存区。
提交第二个 commit 吧!
1.5.3 git diff
git diff 命令用来查看已经执行但是尚未 commit 的更改:
输出:已经修改的文件
添加/删除的行所在的位置
执行的实际更改
1.5.4 .gitignore
(1)在项目所在目录添加了一个 Word 文档等文件,但是不希望将该文件添加到仓库中。git 会看到这个新文件,所以在你运行 git status 时,它将显示在文件列表中。
(2)将某个文件保留在项目的目录结构中,但是确保它不会意外地提交到项目中,可以使用名称特殊的文件 .gitignore(将此文件添加到 new-git-project项目根目录。
输出:存在错误,依旧可以看见project.docx.git 知道查看名称为 .gitignore 的文件的内容。应该忽略了该文件,并且没有在 git status 的输出结果中显示该文件。
1.6 标签与分支
1.6.1 git tag
(1)创建标签
进入news-git-project,输入git tag 命令,使用 git tag 命令与仓库的标签进行交互,上述命令将打开代码编辑器,并等待你为标签输入信息。我们输入"Ready for content"作为tag。
(2)验证标签
保存并退出编辑器后,命令行上什么也不会显示。那么如何知道已经向项目中添加了标签呢?只需输入 git tag,命令行会显示仓库中的所有标签。
(3)使用git log,查找标签所在位置。
输出: tag: v1.0
说明:标签与 commit 相绑定。因此,该标签与 commit 的 SHA 位于同一行
(4)删除标签
可以通过输入 -d 选项 加上标签名称来删除 git 标签:
$ git tag -d v1.0
(图不小心删了)
1.6.2 git branch
(1)创建分支
创建分支,只需git branch并提供要创建的分支对应的名称。创建一个"sidebar"的分支,运行以下命令:git branch sidebar。
由于目前提示符显示的是当前分支master。要使用该sidebar分支,你需要切换到该分支。需要切换到其他分支,运行git checkout sidebar.
输出:提示符现在会显示"sidebar"
从工作目录中删除 git 跟踪的所有文件和目录
转到仓库,并提取分支指向的 commit 所对应的所有文件和目录
因此此命令将删除 master 分支中的 commit 引用的所有文件。它会将这些文件替换为 sidebar 分支中的 commit 引用的文件。
(2)活跃分支
提示符将显示活跃分支。但这是我们对提示符进行的特殊自定义,如果你使用的是不同的计算机,判断活跃分支的最快速方式是查看git branch 命令的输出结果。活跃分支名称旁边会显示一个星号。
(3)删除分支
如果你想删除分支,运行git branch -d siderbar 。
输出:删除分支sidebar.
(4)合并分支
现在活跃分支为master,运行git merge sidebar命令。
输出:Already up to date,当前分支master和 sidebar分支代码不同步。
主分支是:master,其他分支是sidebar。
解决方法:
git reset --hard sidebar;
git push --force origin master
发生合并时,git 将:查看将合并的分支
查看分支的历史记录并寻找两个分支的 commit 历史记录中都有的单个 commit
将单个分支上更改的代码行合并到一起
提交一个 commit 来记录合并操作
合并冲突
现在已经创建好分支,我们只需切换到heading-sidebar分支再次更新标题。确保更改在 master 分支上做出更改的同一行。
输出:已经在 master 分支上做出了更改标题的 commit,在 heading-sidebarr分支上做出了同样更改标题的 commit,已经位于 master 分支上。
1.8 撤销合并
(1)更改最后一个commit
运行git commit --amend命令,查找更改最近的 commit。代码编辑器将打开,并显示原始 commit 消息,纠正拼错的单词,然后保存文件并关闭编辑器,以便采用新的 commit 消息。
(2)还原 commit
git 还原 具体的 commit 时,git 会执行和 commit 中的更改完全相反的更改。创建了一个包含一些更改的 commit,使用 git revert 命令还原它。
最近的 commit 的 SHA 是 dcab582,要还原该 commit: 需要运行 git revert dcab582(随即弹出代码编辑器,以便编辑/确认提供的 commit 消息)
输出:将撤消目标 commit 所做出的更改
创建一个新的 commit 来记录这一更改
(3)重置
使用git reset --mixed HEAD^命令用来重置(清除)commit,取消暂存已被 commit 的更改.
输出:将 HEAD 和当前分支指针移到目标 commit
清除 commit
将 commit 的更改移到暂存区
取消暂存 commit 的更改
实验总结与体会:
(1)由于第一次做GIT实验,很多git指令都不熟悉,经常打错指令。在运行git实验各指令时,应该经常使用git status,查看仓库状态。
(2)在 Git 上进行克隆时,调用运行的命令 git clone,然后传入要克隆的 Git 仓库的路径,但失败了。问题可能是上传大小限制,执行如下命令:
git config http.postBuffer 524288000
此时再次clone依然可能报错,再尝试git config http.sslVerify "false"
但是这时显示fatal: not in a git directory
于是使用命令:git config --global http.sslVerify "false"
然后再输入git clone https://github.com/udacity/course-git-blog-project 。
(3)合并分支时出现:Already up to date,当前分支 master 和sidebar分支代码不同步。
①当前分支或者主分支代码不是最新的,有未更新(未提交的代码),把分支代码提交最新再进行合并
②假设当前分支是:sidebar,主分支是:master
解决方法:git checkout master;
git reset --hard sidebar;
git push --force origin master
思考题:
阅读维基百科和百度百科 的Git词条,总结分布式分布式版本控制系统的核心机理.
首先,Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。系统保存的的不是文件变化的差量,而是文件的快照,即把文件的整体复制下来保存,而不关心具体的变化内容。其次,Git实际上是通过维持复杂的文件树来实现版本控制的。Git保存文件的完整内容,不保存差量变化。SHA-1 校验和是文件的指针,Git依靠它来区分文件。
Git 是用于 Linux内核开发的版本控制工具,采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。 Git 的速度很快, 它的合并跟踪能力强。Git 的正常使用都由一些友好的脚本命令来执行,使 Git 变得非常好用,即使是用来管理我们自己的开发项目,Git 都是一个友好,有力的工具。作为开源自由原教旨主义项目,Git 没有对版本库的浏览和修改做任何的权限限制,我们可以通过git增加内容,提交内容,管理分支。