Git学习笔记一--本地版本库的基本用法

1.安装环境

win环境下,安装vscode自动安装git。

linux环境下

sudo apt install git

我自己使用的是Ubuntu系统,有可视化界面毕竟方便一些。

2.初始化一个本地版本库

在VS code中打开文件夹(Ctrl+O),实际上就是打开一个项目工作区,VS code的工作区概念与Git的工作区概念基本一致,都是指当前项目文件夹里的整套源代码。

如果项目文件夹里没有Git存储库,这时打开源代码管理(Ctrl+shift+G),可以直接单击“初始化存储库”按钮,初始化一个Git本地版本库

在这里插入图片描述

或者也可以在命令行中键入命令 git init来初始化Git本地版本库

在这里插入图片描述

上述两种初始化Git本地版本库,实际上都是在项目根目录下创建了一个.git文件夹

3.查看当前工作区的状态

.git相关

Git的三个区+一个远程仓库

  • Remote:远程仓库,像github就是一个远程仓库。
  • Repository:本地仓库,通过git clone将远程仓库的代码下载到本地。代码库的元数据信息在根目录下的.git目录下。
  • Workspace:工作区,就是我们写代码的目录。
  • Index:暂存区,指的是.git目录下的index文件。

在这里插入图片描述

在平时写完代码后执行git add 就是将变更的内容从工作空间提交到暂存区,git commit就是将暂存区的内容提交到本地代码库里,git push 就是将本地代码库的变更提交到远程仓库,这时其他人就能通过pull 将你的变更下载到工作空间。

git 分布式的一个重要体现是 git 在本地是有一个完整的 git 仓库也就是 .git 文件目录,通过这个仓库,git 就可以完全离线化操作。在这个本地化的仓库中存储了 git 所有的模型对象

.git文件夹下的Git版本库内部数据的存储结构

hooks:是存储git钩子的目录,钩子是在特定事件发生时触发的脚本。比如:提交之前,提交之后。
info:是存储git信息的目录,比如排除特定后缀的文件。
objects:是存储git各种对象及内容的对象库,包含正常的和压缩后的。
refs:是存储git各种引用的目录,包含分支、远程分支和标签。
config:是代码库级别的配置文件。HEAD:是代码库当前指向的分支,这里为master。

git 主要有四个对象,分别是 Blob,Tree, Commit, Tag 他们都用 SHA-1 (一种密码散列函数)进行命名。

4.暂存更改的文件

在当前workspace里写一个README.txt文件,在文件中随便写一些东西保存,并进行git add命令

~/GitStudy$ vim README.txt
~/GitStudy$ git add README.txt

此时工作区的变更提交到暂存区,键入命令git ls-files --stage ,查看当前暂存区文件

在这里插入图片描述

可以看到README.txt文件已经被推送到暂存区。

git cat-file -t 查看每个 SHA-1 的类型,用 git cat-file -p 查看每个对象的内容和简单的数据结构。查看README.txt的文件类型和文件内容

在这里插入图片描述

然后,我们查看.git/objects,可以发现产生了新对象,在此文件夹下有新的文件产生

在这里插入图片描述

这个对象就是刚才add到暂存区的对象,在.git/objects目录下看到一个文件。这便是Git存储数据内容的方式–为每份内容生成一个文件,取该内容与头信息的SHA-1校验和,创建以该校验和前两个字符为名称得子目录,并以校验和剩下38个字符为文件命名。这里并没有显示真实的文件名。

为了区分文件夹和文件在git环境中的区别,我们再创建一个文件夹名为Demo,并在该文件夹下创建一个名为DEMO.txt的文件

在这里插入图片描述

执行git add Demo/ 添加到暂存区。通过git status查看暂存区内容,变成了2条记录,存储方式和上面文件一样。

其中,以绿色U标记的文件为没有添加到版本库进行跟踪的文件(untracked files)、以橙色M标记的文件为已修改(modified)未提交(changes not staged for commit)的文件

在这里插入图片描述

也可以在VS Code中,更加直观的看到当前状态。

在这里插入图片描述

查看暂存区内容,变成了2条记录,存储方式和上面文件一样。git ls-files --stage 或者git ls-files --cache 都可以。
在这里插入图片描述

可以看出,这里只有为文件内容生成的文件,并没有为目录生成文件。进入.git/objects,查看此时对象情况:

在这里插入图片描述

如果我们要将文件从暂存区中取消,则通过键入命令git reset xxx 实现,也可以通过VS Code进行更为方便的操作

在这里插入图片描述
在这里插入图片描述

五.把暂存区里的文件提交到仓库

到目前为止,暂存区的内容有只有Demo/DEMO.txt文件。下面通过git commit 将暂存区的内容提交到本地仓库。

此处我还未登录自己的git账户,根据提示登录自己的git账户

在这里插入图片描述

写入提交信息

在这里插入图片描述

在这里插入图片描述

使用git log 查看本次提交信息,使用git cat-file -p查看变更内容,当类型为tree时表示文件夹,会显示该文件夹下的文件或目录列表,当类型为blob时为文件,会显示该文件的内容。可以据此画出本次的存储模型:

在这里插入图片描述

在这里插入图片描述

此时再查看.git/objects目录下,有增加了几个目录。其中:

43:提交的commit对象.

40:提交的commit对应的tree对象。

在这里插入图片描述

可以看出,当我们执行git add 和git commit 命令时,Git做的工作是将被改写的文件保存为数据对象、更新暂存区,记录树对象,最后创建一个指明了顶层树对象和父提交的提交对象。这三种Git对象(数据对象-blob、树对象-tree、提交对象-commit)最后均以单独文件的形式保存在.git/objects目录下。

六.新建分支test

上面提到分支、远程分支和标签都会存储在.git/refs下。

heads包含分支,tags包含标签。每个引用文件里都会指向一个commit。

通过键入git branch test新建一个分支test。

使用git checkout test切换到test分支,此时HEAD文件的内容为refs/heads/test,表示当前分支为test.

在test分支下修改刚才两个文件Demo/Demo.txt和README.txt的内容:

git status查看工作空间状态,有两个修改过的文件。

git add .将变更的文件添加到暂存区,查看暂存区内容发现,二者的校验码字段较之前都发生了变化

.git/object中的内容也发生了变化,根据两个文件的校验码产生了新的对象。

git commit 将暂存区的内容提交到本地仓库。和上面一样,此时也会创建提交对象,树对象,通过查看不同的对象,最后都能查看到具体的数据对象的最新内容。

七、分支合并冲突

在master分支修改Demo/DEMO.txt,将内容随便修改一下,以便产生冲突。可以看到打开的时候DEMO.txt仍然还是master下的内容,我们加入新内容

git add 添加到暂存区,查看文件内为新修改的内容,然后git commit添加到本地仓库,同时生成提交对象,树对象。

执行git merge test进行分支合并,Demo/DEMO.txt出现冲突。

解决方式:将Demo/DEMO.txt在master分支下加入test分支里修改的内容(在实验中VIM重新打开该文件后已经把test的内容添加了进来),然后在重新add该文件,commit并进行master,分支冲突问题解决!

学习网址:
https://www.xiaohongshu.com/explore/638c62d6000000001f00a3f4
https://www.51cto.com/article/614442.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值