实验一 GIT代码版本管理
实验一 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 指令
实验记录
一.安装
下载地址 https://git-scm.com/downloads
安装过程全部按默认选项安装
二.初始配置git
依次输入以下语句
# 设置你的 Git 用户名(每次输入语句后按enter键)
git config --global user.name "<Your-Full-Name>"
# 设置你的 Git 邮箱
git config --global user.email "<your-email-address>"
# 确保 Git 输出内容带有颜色标记
git config --global color.ui auto
# 对比显示原始状态
git config --global merge.conflictstyle diff3
git config --list(检查配置文件各个属性,也可以使用单个 git config --global xxxx xxxx为属性名字,如user.name)

输入一段语句enter后,光标会跑到下一行而且可以继续输入,并且等一段时间后才会出现执行完成的状况。不知道是本来就是这样,还是我的电脑很卡。
 
三.从头创建仓库
1.创建项目目录(项目文件夹)
创建库的时候不能直接输入创建语句,先看自己当前所在目录位置,一般打开终端时是位于桌面的。如图

要先选择自己想要放置目录的位置。我是在c盘安装,想把文件放在e盘安装包下载的同一文件夹git下。通过cd命令转到该文件夹下。在输入指令
mkdir -p se2020-git-course/new-git-project && cd $_

我不小心把mkdir输成madir出现madir不是命令的错误提示。成功后会如上所示。
2.创建空仓库
使用git init命令创建仓库。首先要确定当前位置处在刚才建立的项目目录中然后再输入命令。

注意,运行 git init 之后,应该会出现一段文字:"Initialized empty Git repository in",后面提示符中出现了matser。运行 git init 命令会初始化 Git 跟踪所有内容会用到的所有必要文件和目录。所有这些文件都存储在叫做 .git的目录下。这个 .git 目录是一个库!Git 会将所有 commit 记录在这里,并跟踪所有内容!请勿直接修改 .git 目录下的任何文件。这是仓库的核心。如果你更改了文件名或文件内容,Git 可能就无法跟踪你保存在仓库中的文件,你可能会丢失很多内容!可以查看这些文件,但是请勿编辑或删除这些文件。
3.克隆现有仓库
 使用cd ..返回到se2020-git-project目录下。输入克隆仓库指令, git clone https://github.com/udacity/course-git-blog-project  blog-project(要克隆的目标库是https://github.com/udacity/course-git-blog-project,克隆时会在终端目前所在的位置创建一个新的目录,并把目标克隆到该目录下,克隆到blog-project目录下,若没有输入指定文件夹则默认创建与项目同名的文件夹)



进入course-git-blog-project文件夹,在你喜欢的浏览器中打开 index.html 文件。可用看见已经克隆的blog网页
4.判断库的状态

四.git log
1.git log
利用git log语句来查看项目的commit,让终端在项目目录下,执行git log指令。出现每次修改的内容时间、sha、作者。刚刚进入时还不知道如何搜索,尝试利用输入字母数字搜索并没有看到想看到的commit。查过以后才知道翻阅commit的指令:


如上为作业第四题截图,是Richard Kalehoff在 Sat Dec 3 15:42:07 2016 时刻提交的commit,消息为set article timestamp color,SHA为5de135.……
2.git log --oneline
第一次输入为git log oneline,报错为:
fatal: ambiguous argument 'oneline': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
原因是少了 -- ,正确命令为 git log --oneline。会显示如下,每行只有一个commit,每个commit只显示SHA的前7个和消息

3.git log --stat
可以用来显示 commit 中更改的文件以及添加或删除的行数。
确认终端位置在项目目录下时,输入 git log --stat,得到commit相关信息。如下图,作业截图

4.git log -p
该命令可用来显示对文件作出实际更改的选项。也可以写为git log --patch。如图,作业截图。-20,6意思是更改之前从第20行显示6行,+20,7表示更改之后的显示
如果结合两个操作 git log -p --stat,则两个信息都会显示,统计会显示在上面,修改信息显示在下面

5.git show
git show 命令将仅显示一个 commit。因此,如果你看不到任何其他 commit,不要惊慌。它只显示一个 commit。git show 命令的输出和 git log -p 命令的完全一样。因此默认情况下,git show 会显示:
- 
commit
 - 
作者
 - 
日期
 - 
commit 消息
 - 
补丁信息
 

 如下作业截图

git status 命令的输出同样十分简洁地告诉我们 git 没有跟踪这些文件








问题陈宫解决后,返回原项目文件目录new-git-project中。
4.第二个 commit - 添加更改
现在在index文件中添加一段代码
<header>
<h1>Expedition</h1>
</header>
修改完成后会显示如下图所示

按照之前的流程操作后如下图所示

5.git diff 和 gitingnore



六.标签、分支
1.git tag标签
(上一个步骤里,对header改变的提交,消息为change header)

2.git tag 命令、验证和删除
使用 git tag 命令与仓库的标签进行交互,输入以下命令
git tag -a v1.0

再通过git tag -d v1.0删除该标签

3.向以前的commit添加标签
要添加之前commit的标签只需提供要添加标签的 commit 的 SHA 即可,使用命令git tag -a v1.0 45aebcc,当添加新的 commit 时,标签不会移动

可以看到成功在45aebcc加上了标签
4.git branch/git checkout
使用git branch可以查看目前所有的分支。若是想要创建新的分支可以用git branch 分支名,目前所在的分支是master,想要切换成另外一个分支上,就要用命令git checkout 分支名来切换,如下图所示,新建分支sidebar并切换到该分支上。


如上图,head指向sidebar,表示现在任何commit都会提交到sidebar的分支中。
提示符将显示活跃分支。但这是我们对提示符进行的特殊自定义,如果你使用的是不同的计算机,判断活跃分支的最快速方式是查看 git branch 命令的输出结果。活跃分支名称旁边会显示一个星号。

5.删除分支
注意,无法删除当前所在的分支。因此要删除 sidebar 分支,你需要切换到 master 分支,或者创建并切换到新的分支。分支用来进行开发或对项目进行修正,不会影响到项目(因为更改是在分支上进行的)。在分支上做出更改后,你可以将该分支组合到 master 分支上。使用git branch -d sidebar可以删除sidebar分支。分支上的提交不会消失,会合并到master份上,如果要强制删除内容就要用-D代替-d。

6.高效分支
由于之前已经删除了sidebar分支,因此,先更改index文件内容然后提交到master分支的仓库中,可能与实验要求有部分不同。如图,按照实验要求清空工作树。

7.分支实战
更改 1 - 添加页面颜色
确保位于 master 分支上,并向 css/app.css 添加以下内容:
body {
    background-color: #00cae4;
}
保存文件,然后将该文件添加到暂存区,并将其 commit 到仓库。
commit 的内容可写: Set background color for page
通过git log 检查commit 记录
如上图所示,在加入暂存区时报了错误,原因是我只写了文件名,却遗漏了前面的路径,所以在仓库内添加文件到暂存区时要写完整的相对路径,否则会找不到文件。
更改 2 - 添加侧栏
我们向页面上添加一个侧栏。
但是假定我们不确定是否喜欢新的背景色。因此我们要将 sidebar 分支放在设置页面颜色的 commit 之前。
因此向该 commit 添加分支的命令是:
git branch sidebar 91df13e 如下图所示,sidebar分支建在添加背景颜色的提交之前。



这时在返回app.css发现该文件是空的。现在在index中添加一个侧边栏aside并提交到sidebar分支(不要修改其他文件)

更改 3 - 更改 master 上的标题
切换到 master 分支并更新页面标题。
使用 git checkout 命令切换到 master 分支。(注意,新的侧栏的 HTML 不在了!因为所有代码都妥善地保存在 sidebar 分支上。)
现在将页面的 <h1> 标题从"Expedition"改为吸引人的"Adventure"

同时查看所有分支,使用命令git log --oneline --graph --all

七.合并
1.合并指令
先检查自己的起点,确认自己在new-git-project项目,检出master分支,并且是working tree clean。发生合并时,git 将:
- 
查看将合并的分支
 - 
查看分支的历史记录并寻找两个分支的 commit 历史记录中都有的单个 commit
 - 
将单个分支上更改的代码行合并到一起
 - 
提交一个 commit 来记录合并操作
 
 主题分支(例如 sidebar)的作用是让你做出不影响 master 分支的更改。当你在主题分支上做出更改后,如果觉得不想要该分支上的更改,则可以删掉该分支,或者你决定要保留更改,则可以将该分支上的改与其他分支上的更改合并。git merge 指令用来合并,要合并 sidebar 分支,确保你位于 master 分支上,并运行:git merge sidebar,如下图所示(这里使用默认消息merge branch 'sidebar')。

2.合并冲突
有时候 git 无法完全自动地进行合并。合并失败时,就称为合并冲突。如果完全相同的行在不同的文件中更改了,将产生合并冲突。
人为制造合并冲突,先在master中更改h1标题。再再另一个分支上更改该标题。现在要注意的是,我们需要创建一个不是从 master 分支上分叉的分支。如果我们在从 master 分支上分叉的分支上做出更改,那么该更改将在此更改前面,git 将直接使用该更改,而不是使用我们刚刚在 master 上做出的更改。因此我们需要将该分支“放在过去”。获取上一个sha,并创建分支heading-update。

在heading-update分支里修改同一行后。返回master,并确认log。

准备合并冲突,确保进度一样:已经在 master 分支上做出了更改标题的 commit,已经在 heading-update 分支上做出了同样更改标题的 commit,已经位于 master 分支上。然后使用命令给git merge heading-update。出现以下冲突提示,并在vscode里打开index查看冲突提示。

解决合并冲突,需要删除所有带提示符的行,并保留需要的代码行。完成后添加,提交。就完成了消除合并冲突。

八.撤销更改
1.更改上一个commit消息
如果想要更改上一个文件的消息,可以使git commit -amend命令。将会打开编辑器,更改消息、保存并关闭编辑器,即可修改,使用git log --oneline --graph --all查看结果,瑞小安图所示。

2.向commit中添加忘记的文件
如果上一次commit忘记了一段代码、一个文件,但是又不想两个commit都执行重复的操作。可以修改上一个操作。只需:编辑文件、保存文件、暂存文件、运行git commit --amend。现在修改一次index中的内容并添加提交。图下图,在aside处添加了一段话。并得到sha为e186a6a的commit。


假设自己遗漏了几句话,不想重复提交,可以修改index的内容增加几句话,并保存、暂存,使用git commit --amend来修改上次的提交。

如上图所示,并没有增加新的commit,虽然该commit的SHA改变为1bd78c1。
3.还原commit
为了和实验内容,这里修改暂存提交新的commit来修改h1标题。


新提交了sha为572138a的commit。使用git revert sha来还原他


可以看到标题已经自动变更回去。并新提交了一个commit:0e1b8e8。
4.重置
初看,重置(reset) 似乎和 还原(revert) 相似,但它们实际上差别很大。还原会创建一个新的 commit,并还原或撤消之前的 commit。但是重置会清除 commit!
重置很危险
一定要谨慎使用 git 的重置功能。这是少数几个可以从仓库中清除 commit 的命令。如果某个 commit 不再存在于仓库中,它所包含的内容也会消失。
为了减轻你的压力,澄清下,git 会在完全清除任何内容之前,持续跟踪大约 30 天。要调用这些内容,你需要使用
git reflog命令。请参阅链接以了解详情
我们来看看如何引用一些之前的 commit。因为 HEAD 指向 9ec05ca commit:
- 
HEAD^是db7e87acommit - 
HEAD~1同样是db7e87acommit - 
HEAD^^是796ddb0commit - 
HEAD~2同样是796ddb0commit - 
HEAD^^^是0c5975acommit - 
HEAD~3同样是0c5975acommit - 
HEAD^^^2是4c9749ecommit(这是曾祖父的 (HEAD^^) 第二个父 commit (^2))![]()
 
如图,head~6是相对于第一个commit:9ec05ca向下第六个,对于分叉出的分支是向下数是一样的,所以有两个。一个是head^^^^^^1:209752a,另一个是head^^^^^^2:e6c65a6。
5.git reset命令
可以用来:
- 
将 HEAD 和当前分支指针移到目标 commit
 - 
清除 commit
 - 
将 commit 的更改移到暂存区
 - 
取消暂存 commit 的更改
 
6.git reset选项
git 根据所使用选项来判断是清除、暂存之前 commit 的更改,还是取消暂存之前 commit 的更改。这些选项包括:
- 
使用
--hard选项清除 commit - 
使用
--soft选项将 commit 的更改移至暂存区 - 
使用
--mixed选项取消暂存已被 commit 的更改 
在操作前先备份分支放置出现不可逆的错误。使用命令git branch backup。

尝试使用reset的mixed选项
如果未添加选项则默认为mixed选项,输入git reset head~1命令

如上图所示,master相对于backup倒退一个commit,且工作区出现了0e1b8e8的更改内容。如下图,再次进行提交由于时间不同了所以sha也发生了改变。
尝试使用reset的--soft选项
输入 git reset --soft head~1,可以看到修改文件进入到暂存区,直接提交,得到一个新sha的commit。

尝试reset的--hard选项
输入git reset --hard head~1,该commit直接被消除,并不存在工作区或暂存区里。head也前移一个。

回到正常状况
要回到正常状况需要两个步骤。
1.从工作目录清除未commit的修改。
2.合并backup分支,快进合并。
输入git status,nothing to commit,working tree clean。表明没有要提交的修改且工作目录为空。如果不为空则需要输入git checkout -- index.html ,把index.html文件在工作区的修改全部撤销。这里撤销修改有两种情况:
第1:index.html 文件在工作区修改后,还没有git add 添加到暂存区,现在,撤销修改就回到工作区当时的状态;
第2:index.html 文件在工作区修改后,并且git add添加到暂存区,又作了修改;现在,撤销修改就回到添加到暂存区后的状态。
完成后输入git merge backup,如下图所示,master恢复成reset之前的样子,但是最近的commit的sha肯定会改变。

实验完成,列出最后的分支图

总结与体会
本次实验学会了git的基本操作,过程中并没有出现过什么太大的错误,大多是一些命令的拼写错误。遇到设置vscode为默认编辑器失败的问题,百度一下就能解决。做完git相关操作,明显感觉自己对未来工作的实际技能有了丰富。希望以后能多一些类似的操作实验或编程实验。或者有合作任务,通过完成流程完成一个实际项目的开发,来更好的认识软件工程。
思考
分布式版本管理系统注重的是项目整体而不是单个文件或代码。对每个不同的本地用户来说在本地读取数据,可自行拥有全部版本不需要连接主机,不需要服务端,通过合并和信息追踪来实现版本控制,方便快速交流和发布。
                    
                

                
            
        
浙公网安备 33010602011771号