实验目的:
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.初始配置git
配置环境:ubuntu 18.04
配置编辑器:sublime text
git下载方式
for Ubuntu:
apt-get install git
第一次运行出现:E: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
错误,应是上次更新异常中断所致
使用ps -e | grep apt
查询未关闭的进程,并使用kill指令关闭进程,最后删除相应的lock文件。正常安装运行。
依次设置用户名与邮箱,更改默认编辑器为sublime:git config --global core.editor sublime text
2.仓库的创建,克隆
初始化仓库:
mkdir -p se2020-git-course
cd se2020-git-course
mkdir -p new-git-project
cd new-git-project
git init
创建新目录clone,克隆路径:https://github.com/udacity/course-git-blog-project
3.仓库测试
git status
course-git-blog-project目录下:
new-git-project目录下:
git log
course-git-blog-project目录下:
new-git-project目录下:
可以从中看到几次commit的数据(其中包含了SHA,提交者,日期和内容)。
log命令的探究:
使用分页器less进一步浏览消息(以查询任务点对应commit),对于log中第一项SHA,过小的字符数无法保证在一个项目中的唯一性,根据Pro Git手册的第7章中的回答:通常,八个到十个字符足以在一个项目中唯一。最大的Git项目之一Linux内核开始需要在40个字符中保持12个字符以保持唯一性。所以过小的SHA,反而会引起不必要的错误。对于提交者这一信息,在一些个人的项目来说,甚至多余,但在一些大项目中,不同的人不同的修改,记录下这些是尤为重要的。而对于提交者,日期这些有时不太重要的东西,省略他们或许更能节省时间和空间,git log --oneline
正适合这种方法。ta能简洁的在一行上显示一条commit的前7位SHA和其信息。对于git log --stat
命令,其能更详细的显示出修改信息和总情况。而要想更仔细的显示出更改的消息,git log -p
更为可靠(其在后台使用了git diff
):
-p与--stat一起使用时,会一起显示出来。
git diff的用法与详情
处理太多滚动操作
1.提供SHA
从所提供的SHA开始显示commitgit log -p xxxxxx(测试得出最少应为最小不唯一字符数)
2.git show
仅显示一个commit,可以与其他后缀一起使用。详情
ps:灵活运用git log --oneline --stat
与git show
进行对信息和SHA的部分到整体的查询。
4.部分git命令
提交
使用touch创建对应文件,并用subl对其进行相应修改,最后进行git status
观察:
从工作目录到暂存区(staging)
git add index.html /git add .
使用git rm --cached
可将错误文件从暂存去删除。
提交仓库
git commit
在编辑器中进行提交说明信息的编写(概括提交的主要作用,不多于60个字符。禁忌使用and,可将过多的更改分批commit)。
运用git status
观察每一步后的变化:
git diff
在提交前告诉我们文件进行了怎样的更改(查看已被加入但尚未提交的更改[add之前])。
git ignore
可以忽略不想加入仓库(不跟踪)的文件。
git忽略规则
touch 123.docx
touch .gitignore
subl .gitignore //添加需要忽略的文件名,如123.docx
#***
5.标签,分支
*** ##1.标签 运行`git tag -a v1.0`为最近的commit添加标签1.0,运行`git tag -d v1.0`进行删除。添加对应SHA可指定添加标签`git tag -a v1.0 5d1f31`(`-a`进行记录和注释),运行`git tag`显示所有标签。 用`git show v1.0`进行指定查询 ##2.[分支](https://www.runoob.com/git/git-branch.html) 运行`git branch`列出所有分支,`git branch sidebar`创建分支sidebar,`git checkout sidebar`切换分支,`git branch -d sidebar`删除多余分支(-D强制删除)。添加指定commit到分支与tag操作相同。 PS:分支相当于快照了创建分支时的状态,之后的commit都将在切换分支后还原到之前(不能在操作覆盖即提交前进行份分支转换)。[详见](https://www.runoob.com/git/git-branch.html) ***高效分支*** log命令拓展: ***分支合并*** #***撤销更改*** ***commit消息更改还原*** revert会创建一个新的commit,并还原或撤销之前的commit ***重置(reset)*** 清除commit(git会在完全清除任何内容之前,持续跟踪大约30天),用来清除所指定的commit之前的所有commit ``` --hard //清除commit --soft //将commit的更改移至暂存区 --mixed //取消暂存已被commit的更改 ```实验小结
作者(author) 和 提交者(committer)之间究竟有何差别,作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。所以,当你为某个项目发布补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。我们会在第五章再详细介绍两者之间的细微差别。(https://www.jianshu.com/p/0805b5d5d893)
git bash与git(https://blog.csdn.net/goog_man/article/details/95044688)
编辑器更改问题(https://blog.csdn.net/weixin_30810239/article/details/100004122 )
工作目录内容:仓库中未commit的更改
思考题
阅读维基百科和百度百科 的Git词条,总结分布式分布式版本控制系统的核心机理
答:每次代码版本的更迭和变化,Git都会记录数据文件的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异变化,这类系统每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容。Git并不保存这些前后变化的差异数据。实际上,Git更像是把变化的文件快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件一一作快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git不会再次保存,而只是对上一次保存的快照作一链接。总的来说,Git是一个存储着整个代码快照或者代码快照链接的小型文件系统,所以在每次代码修改之后都能够保持整个代码库的“风貌”,而不是像其他版本管理系统一样,只记录修改的文件和具体的修改内容。要复原整个代码库的话,还需借助“原始材料”。