实验一 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 指令

一、Git简介

  老话说的好“知己知彼,百战不殆”,我们在使用一个工具的时候要先了解这个工具,那么Git是什么?Git是目前世界上最先进的分布式版本控制系统(没有之一)。Git是一个开源的分布式版本控制系统可以有效、高速地处理从很小到非常大的项目版本管理Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKe(来源度娘)。

  所谓的版本控制,指的是程序在对开发的项目的修改时,Git能够记录下修改的内容, 这样避免采用手动管理多个“项目版本”的低效率手段,并且可以实现多用户协同工作,极大的提高了效率,同时减少冲突的发生,以免带来不必要的损失。

版本 文件 用户名 修改说明 修改时间
1 Sniffer.cpp 张三 添加函数Cap_Initial() 2019.12.21 20:12
2 Sniffer.cpp

王五

删除button1 2019.12.22 10:21
3 Sniffer.cpp 李四 导入头文件wincap.h 2019.12.22 13:34

版本记录就类似这张表,当然记录的内容远不止这些,所以Git 又被称为The stupid content tracker,即傻瓜式的内容跟踪器,它将文件被修改的内容全部记录下来,记录的信息会从本机放入暂存区,然后再提交到仓库进行管理。

二、使用Git创建仓库

  在使用之前最好熟悉一下Git的常用命令,可以看其他博主的总结,这里推荐一个比较好的https://www.cnblogs.com/Angxf/p/10956416.html

  (1)初始配置Git

  在开始使用 Git 之前,你需要配置 Git。

  设置用户名,和邮箱 

$ git config --global user.name "Your Name"             
$ git config --global user.email "email@example.com"

 

  也可以采用下面的辅助设置

 

# 对比显示原始状态
git config --global merge.conflictstyle diff3
git config --list
# 还可以配置git显示颜色
git config --global color.ui auto 
git config --global color.ui true 

 

 

 

  (2)从头创建仓库

   在对 Git 仓库进行 commit 或执行任何其他操作之前,需要一个实际存在的仓库。要使用 Git 新建一个仓库,就要使用git init即初始化

      首先我们进入D盘,然后建立一个项目文件夹se2020-git-course,然后在给目录中再创建一个目录cs_wbr

 

 创建成功后就可以使用git init命令了。此命令初始化一个新本地仓库,它在工作目录下生成一个名为.git的隐藏文件夹。

 

  (3)克隆现有仓库

    在克隆现有仓库前一定要注意终端的当前工作目录没有位于Git仓库中,如果此时进入了.git可以使用使用cd ..,注意有空格

 现在进行项目克隆,git clone +路径 ,通常是URL,实验使用的路径是 https://github.com/udacity/course-git-blog-project,Git支持在线下载

如果想要换一个名称,可以在命令后面直接加你想要的名称,如git clone https://github.com/udacity/course-git-blog-project  cs

 打开文件夹,就可以产看克隆的项目了

如果不清楚当前仓库状态可以使用 git status差看当前仓库的状态,如果没有向此项目添加任何文件就会如下显示

 

   (4)git log命令使用

    git log命令是用来查看提交历史的。在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史,完成这个任务最简单而又有效的工具是git log命令。承上,在检查状态时显示了“nothing to commit, working tree clean ”,表明当前项目没有被Git 追踪,此时我们可以查看修改历史。git log有很多过滤技巧可以参考这个https://blog.csdn.net/cankingapp/article/details/53080223?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

 

不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和(参考百度百科https://jingyan.baidu.com/article/fea4511a2e397cf7bb912531.html)、作者的名字和电子邮件地址、提交时间以及提交说明。如上图,可以查看到修改历史上,修改者Author Richard Kalehoff对项目的修改记录,并且每个commit都有唯一的SHA-1。想要查看所有的命令使用help指令, 退出按q。

git  log --oneline

如果想要输出结果简洁可以使用 git  log --oneline选项

 

git log stat

如果想要查看具体修改的内容,就要使用git log stat命令(stat指的是statistics即统计数据)

stat 选项用于更改 git log 显示信息的方式:

此命令会:

  显示被修改的文件

  显示添加/删除的行数

  显示一个摘要,其中包含修改/删除的总文件数和总行数

在下图中可以看到commit为6f04dd的修改中插入了91,删除了58.

git log -p

要想查看具体插入删除了什么就要使用-p(patch)指令,该指令是可用来显示对文件作出实际更改的选项

 此命令会向默认输出中添加以下信息:

  显示被修改的文件

  显示添加/删除的行所在的位置

  显示做出的实际更改

 其中红色部分表示删除的部分,绿色的部分插入的部分,分别对应deletion和insertion。

git show

 git show 命令将仅显示一个 commit。如果你想查看某个特定的commit,可以使用 git show +SHA,或者使用git log -p + SHA,并且将会显示commit

  作者日期

  commit

  消息

  补丁信息             

   (5)暂存&&进库

  常用命令小结:

    git add命令是将工作区内容添加到暂存区。git commit 将暂存区内容添加到版本库。

    git add -A  提交所有变化

    git add -u  提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)

    git add .  提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件

    git commit -m '提交信息'

    git commit -a -m ‘提交信息’-m参数是输入提交信息的,-a 参数就是可以把还没有执行add命令的修改一起提交

    git commit --amend 可以修改上一次的提交信息,以将最近的修改追加到上一次的提交上

  按照试验步骤,在创建的项目文件夹cs_wbr中添加好index.html和两个文件夹css、js(index里是一段HTML代码),然后再两个文件夹中分别添加两个空文件app.css和app.js,这些文件是我们希望被跟踪的文件

 现在使用git status查看状态,这个时候所添加的文件是没有被追踪的,因为没有被提交到仓库。

 

为了使这些文件能够被跟踪,需要使用git add命令先将文件从工作区移入暂存区,由于没有任何提示,所以可以使用git status来查看状态,从下图中可以看到三个文件成功被添加到暂存区中。如果提交文件是错误文件可以使用帮助文本上的 git rm --cached +文件名来删除它

 提交暂存区之后就是使用git commit提交给仓库了,使用git commit命令后会弹出代码编辑器,然后根据提示输入 initial commit(在首行输入Initaial commit ,文本 "Initial commit" 并不特殊,只是第一个 commit 的常用消息。如果你想使用其他消息,完全可以)

 保存退出后,会有如下提示

 接下来提交第二个commit,打开index.html文件,在body 标记中添加以下代码,然后运行git status查看以下状态

<header>

   <h1>Expedition</h1>

</header>

 保存之后,按照上面的步骤先将index.html移入暂存区,然后commit提交给仓库,并添加提交说明 Add header to blog(最好说明一下这是什么操作)

至此第二个commit提交完成,现在我们调用git log来查看记录信息,如下图已经成功记录了。

使用git diff 可以查看那些被更改保存后没有提交的文件信息,对index文件进行修改,红色的地方是我未修改前的信息,我将E改为Adaventure

 

 

   (6)标签和分支

    输入git tag命令,将会打开代码编辑器,并等待你为标签输入信息,输入"Ready for content"作为tag(git tag -a v1.0)中,使用了 -a 选项。该选项告诉 git 创建一个带注释的标签。如果你没有提供该选项(即 git tag v1.0),那么它将创建一个轻量级标签,详细的解释看一看简书上的博文https://www.jianshu.com/p/096ba51647e7

 

 接下来我们调用git log来显示标签,显示的是commit 0234c8819959e71762eaf64791c550b33732e358 (HEAD -> master, tag: v1.0),这就是标签,是与commit绑定在一起的

 

 如果想要删除标签的话,使用-d选项(delete)如 git tag -d v1.0;如果向以前的 commit 添加标签运行 git tag -a v1.0 +SHA即可

输入git branch命令,查看当前仓库里面的分支 ,此时只有一个分支master

 

 接着创建一个分支sidebar,然后使用git checkout命令将当前活跃分支移动到sidebar,可以看到此时head指向sidebar

 

 

 如果想要删除分支,使用-d选项,但不可以删除当前所在分支

 

  先修改index.html,然后提交

 

 然后修改css,提交

 

 再sidebar 分支放在设置页面颜色的 commit 之前。

 

 将分支转移到sidebar,可以看到没有了master分支

然后再sidebar分支上完成天剑add aside to HTMl操作,此时head指向新的分支

 然后再回到master上修改index.html,查看分支

为了其对比效果,再添加分支然后查看所有分支,使用 git log --oneline  --graph --all

 

   (7)合并

    git merge 指令用来合并 git 分支:

   $ git merge <name-of-branch-to-merge-in>
   将之前的master与sidebar合并

 

从这个图中可以看到master与sidebar已经合并到一起来

   (8)撤销与更改   

    如果你已经使用 git commit 命令提交了大量的 commit。现在,借助 --amend 选项,你可以更改最近的 commit。

  

如果需要还原具体的commit,使用revert选项,此时git 会执行和 commit 中的更改完全相反的更改

 

弹出编辑框,确认后就可以恢复了

 

 三、总结体会

  (1)遇到的问题

    其实最大的问题是命令使用不熟悉,对于运作原理不熟悉,分支操作的时候出现了几次错误,没有实时观察status,然后导致了混乱。然后是对于commit引用的理解,一开始我没仔细看,一直以为提交顺序是由上到下的,然后就看不懂。事实上已经有提示了"initial commit",要细心!!而且这个引用也是自上而下的。这个图上"*"代表是当前分支的commit,"|"用以区分不同分支的操作,一开始没看懂这个,但后面发现这个十分有用,不需要每次查询都写SHA了。

 

 

 

   

 

  (2)个人体会

  为什么要使用版本控制,以这个学期的计算机网络课程设计为例,我当时选择的是Sniffer网络嗅探器的开发(GUI调试和抓包属性配置极其恶心),并且是我第一次开发一个小型的应用。当时我缺乏版本控制的概念,代码修改的时候为了防止程序崩溃,只能复制一份原版的保存好,如果代码修改的正确,就把修改好的代码再添加进原版的工程里,或者直接将新的工程替换,为此我浪费了很多的时间。如下图,我为了试验一下修改的代码重新建立了一个项目,却粗心地将小写的项目名sniffer改成了Sinffer,后面编程的时候引起了很多不必要的麻烦。

 

 

这是我当时写的两个版本,我是用的是VS2010里的MFC来开发的,一开始我是小写的sniffer,后来看不顺眼,就把项目名称改成了Sinffer,好吧不仅打错了,还编译报错,调试了好久(改工程名啊,头文件名称,一改就要改许多)然后乱七八糟,我就懒得于是就去找自己修改的地方,copy到原版项目里一下,时间一长既不知道忘记修改了哪里,头一次独自写几千行代码,到最后就是极其艰辛地翻这几千行代码,分辨哪些是自动生成的,哪些是修改的,极其麻烦。更为麻烦的是,一不小心把程序改崩溃了,前面的努力就白费了。所以,要想开发好一个工程,必须要应对开发版本的问题,因此版本控制就显得尤为重要。学会使用版本控制,不仅仅能提高编程效率,也是将来工作中与他人合作的基础。

思考题:

分布式版本控制系统在这类系统核心机理是客户端并不只是提取最新版本的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复,因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。对git来说,它将项目分成本地、暂存区、仓库,文件被修改后要提交到暂存区然后才能提交到仓库,仓库中的内容可以被多名协作者查看、修改,故对于一个项目可以分布式处理。

posted @ 2020-02-24 22:30  素质教育漏网之鱼  阅读(269)  评论(0编辑  收藏  举报