(一)实验目的:
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
根据自己电脑实际情况安装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
此命令会向默认输出中添加以下信息:
显示被修改的文件
显示添加/删除的行所在的位置
显示做出的实际更改
(4)git log -w
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
输出:"Changes not staged for commit"部分,其中包含修改后的"index.html"文件。
(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增加内容,提交内容,管理分支。