git基本概念

本文深入介绍了Git中的四种核心对象:blob、tree、commit和tag,解释了这些对象如何构成版本控制的基础。同时还探讨了Git的工作流程,包括索引、提交和分支等关键概念。

对象名:使用对象内容做SHA1哈希计算得来,40位

对象包括三个部分:类型、大小和内容

4种类型:blob、tree、commit和tag

  • blob用来存储文件数据,通常是一个文件
  • tree像目录,管理一些tree或blob(像文件和子目录)
  • commit指向tree,它用来的标记项目某一个特定时间点的状态。它包括时间点的元数据,如时间戳、最近一次提交的作者、指前上次提交的指针等等。
  • tag用来标记某一个提交的方法

Blob对象
一个blob对象通常用来存储文件的内容
blob对象结构

查看一个blob对象里的内容
git show 6ff87c4664
一个blob对象就是一块二进制数据,它没有指向任何东西或者有任何属性,甚至连文件名都没有。
因为blob对象内容全部都是数据,如两个文件在一个目录树(或是一个版本仓库)中有同样的数据内容,那么它们将会共享同一个blob对象。

Tree对象
tree对象
git show sha1也可以查看tree对象,但是git ls-tree sha1 可以查看更详细的信息。
一个tree对象可以指向(reference): 一个包含文件内容的blob对象, 也可以是其它包含某个子目录内容的其它tree 对象. Tree对象、blob对象和其它所有的对象一样,都用其内容的SHA1哈希值来命名的;只有当两个tree对象的内容完全相同(包括其所指向所有子对象)时,它的名字才会一样,反之亦然。这样就能让Git仅仅通过比较两个 相关的tree对象的名字是否相同,来快速的判断其内容是否不同。

commit对象
commit对象
指向一个tree对象,并且带有相关的描述信息

–pretty=raw 参数配合git show或者git log去查看某个提交。

对象模型,blob、tree和commit怎么组合到一起的?
这里写图片描述

这里写图片描述

标签对象Tag
这里写图片描述
一个标签对象包括一个对象名(译者注:就是SHA1签名), 对象类型, 标签名, 标签创建人的名字(“tagger”), 还有一 条可能包含有签名(signature)的消息. 你可以用 git cat-file 命令来查看这些信息:

GIT目录与工作目录

Git目录是为你的项目存储所有历史和元信息的目录 - 包括所有的对象(commits,tress,blobs,tags), 这些对象指 向不同的分支.
Git工作目录存储着你现在签出(checkout)来用来编辑的文件. 当你在项目的不同分支间切换时, 工作目录里 的文件经常会被替换和删除. 所有历史信息都保存在 ‘Git目录’中 ; 工作目录只用来临时保存签出(checkout) 文 件的地方, 你可以编辑工作目录的文件直到下次提交(commit)为止.
备注: ‘Git目录’ 一般就是指项目根目录下的’.git’目录.

GIT索引

Git索引是一个在你的工作目录和项目仓库间的暂存区(staging area). 有了它, 你可以把许多内容的修改一起提交 (commit). 如果你创建了一个提交(commit), 那么提交的是当前索引(index)里的内容, 而不是工作目录中的内容.

使用 git status 命令是查看索引内容的最简单办法. 你运行 git status命令, 就可以看到: 哪些文件被暂存了(就是 在你的Git索引中), 哪些文件被修改了但是没有暂存, 还有哪些文件没有被跟踪(untracked).

例子:
假设有三个文件:
test.txt 为工作目录新增文件(Untracked files)。
Server.java文件为修改并加入到索引中文件(Changes to be committed)。
Client.java文件为修改但还没加到索引中文件(Changes not staged for commit)。

则git status得到如下:
这里写图片描述

git commit 会将索引中的对象提交,但不会提交已修改但为添加到索引的对象。如例中,会将Server.java提交,但Client.java不会被提交。
git commit -a 所有内容被修改的文件(不包括工作目录新创建的文件)都添加到索引中并提交。如例中,会将Server.java和Client.java都提交。

Git跟踪的是内容不是文件
跟踪的是内容不是文件 很多版本控制系统都提供了一个 “add” 命令:告诉系统开始去跟踪某一个文件的改动。但是Git里的 ”add” 命令 从某种程度上讲更为简单和强大. git add 不但是用来添加不在版本控制中的新文件,也用于添加已在版本控制中 但是刚修改过的文件; 在这两种情况下, Git都会获得当前文件的快照并且把内容暂存(stage)到索引中,为下一次 commit做好准备。

GIT分支
git branch -a 查看所有分支,带星号表示当前分支
git checkout branchname 切换分支

### Git版本控制系统的基本概念和原理 Git 是一种分布式版本控制系统,其核心目标是跟踪文件的变化、支持多人协作开发,并保留项目的完整历史记录。在 Git 中,每个开发者的工作站都拥有完整的代码库副本,包括所有历史提交信息,这使得 Git 在性能和灵活性上具有显著优势[^1]。 #### 基本概念 Git 的工作流程基于三个关键区域:**工作区(Working Directory)**、**暂存区(Index 或 Stage)** 和 **版本库(Repository)**。工作区是当前正在编辑的文件集合;暂存区用于临时存储即将提交的更改;版本库则保存了所有提交后的历史快照[^5]。 当用户对某个文件进行修改后,可以通过 `git add` 命令将这些更改添加到暂存区。此时,Git 会将文件内容写入对象库,并更新索引中的引用。随后执行 `git commit` 命令时,Git 会将暂存区的状态作为一个新的提交记录保存到版本库中[^5]。 #### 工作原理 Git 使用 SHA-1 哈希算法为每一个提交生成唯一的标识符,从而确保数据的完整性与可追溯性。每次提交不仅包含文件内容,还记录了作者、时间戳以及前一次提交的哈希值,形成一个链式的提交历史结构。这种设计使得 Git 能够高效地比较不同版本之间的差异并实现分支合并操作[^3]。 分支管理是 Git 的一大特色功能。默认情况下,主分支被称为 `master` 或 `main`。通过 `git branch` 创建新分支时,实际上是创建了一个指向特定提交的指针。切换分支后所做的任何提交都会更新该分支所指向的最新提交记录。使用 `git merge` 可以将两个分支的历史合并在一起,而 `git rebase` 则提供了另一种线性化历史的方式[^2]。 #### 远程仓库交互 远程仓库用于团队成员之间共享项目进展。常见的操作包括: - `git remote`:管理远程仓库链接 - `git fetch`:从远程获取最新提交记录但不自动合并 - `git pull`:等价于先执行 `fetch` 再执行 `merge` - `git push`:将本地提交推送到远程仓库 以下是一个简单的 Git 操作示例: ```bash # 初始化一个新的 Git 仓库 git init # 添加所有文件到暂存区 git add . # 提交更改并附带描述信息 git commit -m "Initial commit" # 添加远程仓库地址 git remote add origin https://github.com/example/repo.git # 推送本地提交至远程 master 分支 git push -u origin master ``` Git 的强大之处在于它提供了一整套灵活的工具来处理复杂的版本控制任务,同时保持简洁直观的操作接口,适合各种规模的软件工程项目使用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值