# 左边执行 $ git commit -m "1st commit" $ git cat-file -t 6e4a700 # 查看 commit 对象的类型 $ git cat-file -p 6e4a700...# 查看 commit 对象的内容 $ git cat-file -t 64d6ef5 # 查看 tree 对象的类型 $ git cat-file -p 64d6ef5 # 查看 tree...现在,我们已经基本理解了文件如何在工作区、暂存区以及代码仓库之间进行状态的跟踪和同步。在 Git 的操作中,文件的可能状态有哪些,以及如何进行状态切换的,我们这里一起总结一下!...$ git diff --cached $ git diff HEAD 图片 Git 如何添加远程仓库 如何将我们本地的仓库和远程服务器上面的仓库关联起来呢?...Git 本来就是代码的分发平台,无中心节点,即每个节点都是主节点,所以其存储的目录结构都是一直的。这样,不管哪一个节点的内容发生丢失或缺失的话,我们都可以通过其他节点来找到。
本文主要通过一个实际的例子来描述,当项目(代码)仓库出现问题时如何使用 git 进行有效的维护,并分享一些 git 使用经验以及分析 git 的内部实现机制。...如果实际场景中发生了类似的问题,该如何使用 git 找回丢失的 commit 呢?...这种情况应该如何恢复 commit 数据呢? 这里可以执行 git fsck --full 命令,该命令会检查仓库的数据完整性,会显示所有未被其他对象引用的所有对象。...执行 git cat-file -p [hash-key] 可以查看已经存在的 object 对象内容; 执行 git cat-file -t [hash-key] 可以查看已经存在的 object 对象类型...4 总结 本文从一个实际问题即如何使用 git 维护丢失的 commit 入手,并给出相应的解决思路和方案,以及通过git 内部三种对象来分析其内部工作机制,希望能过解决读者们对 git 存在困惑的地方
Git是如何存储文件信息的? 当我们执行git add、git commit时,Git背后做了什么? Git分支的本质是什么?....git版本库内文件的理解 Git是如何存储文件信息的 要知道Git如何存储信息,我们需要了解一下常见的Git对象,Git就是通过这些对象存储文件信息的。...给我们剖析这些对象,它是就是cat-file,通过-t参数可以查看object的类型,通过-p参数我们可以查看object存储的具体内容。...test $ git cat-file -t fb12 tree 我们知道tree object存储了一条或多条树记录(tree entries),每条记录含有一个指向数据对象(blob)或子树对象...如果想了解Git Object对应的SHA-1值如何生成和如何复现并串联多个commit object形成一个提交历史链,可查看《Pro Git》的第十章第二小节或参看后面的参考资料。
objects目录 这个目录是用来存储Git对象的(包括tree对象、commit对象和blob对象),对于一个初始的Git仓库,objects目录下只有info和pack两个子目录,并没有常规文件。...$ git cat-file -t d670460b4b4aece5915caf5c68d12f560a9fe3e4 blob $ git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4...$ git cat-file -t 2b00dcae50af70bb5722033b3fe75281206c74da commit $ git cat-file -p 2b00dcae50af70bb5722033b3fe75281206c74da...tree对象可以理解为UNIX文件系统中的目录,保存了工作目录的tree对象和blob对象的信息。接下来我们再来看一下Git是如何进行版本控制的。...HEAD 新建分支的时候,Git是怎么知道我们当前是在哪个分支的,Git又是如何实现分支切换的呢?答案就在HEAD这个文件中。
前言 2. git 是如何保存代码的 3. hash 算法 4. 暂存区 1....是如何保存代码的 ---- 一、git 在 add 时,会将文件的内容通过Hash SHA-1算法生成一个基于Hash值的键值对数据库 参考 git 中文书籍git对象章节: https://www.progit.cn...压缩后的数据 cat .git/objects/xx/xxxx 查看文件的原始内容,压缩前的数据: 语法格式: git cat-file -p 索引值前七位 cat: 可以理解查看 -p: pretty...漂亮的,理解为便于查看的 git cat-file -p 8d0e412 查看文件类型,执行以下命令返回 blob 代表是 blob对象 git cat-file -t 8d0e412 查看文件内容长度...(例如: 10) git cat-file -s 8d0e412 3. hash 算法 ---- hash算法: 将任意长度的内容通过算法生成固定长度的输出,也就是加密为固定长度的字符串 git 是一个基于
七、自定义Git 前面已经阐述了Git基本的运作机制和使用方式,介绍了许多Git提供的工具来帮助你简单且有效地使用它。本部分将演示如何借助Git的一些重要的配置方法和钩子机制,来满足自定义的需求。...$ git cat-file -t 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a blob # 数据对象 2.2 树对象 使用“数据对象”存储,其记住文件的每一个版本所对应的...索引文件包含了包文件的偏移信息,我们通过索引文件就可以快速定位任意一个指定对象。通过打包对象可以减少大约 ⅔ 的磁盘占用空间。 **Git是如何做到这点的?...**Git打包对象时,会查找命名及大小相近的文件,并只保存文件不同版本之间的差异内容。你可以查看包文件,观察它是如何节省空间的。...如果这些事情已经发生,该如何找回你的提交呢?
我发现学习Git内部是如何工作的以及Git的内部数据结构这部分内容,对于理解Git的用途和强大至关重要。若你理解了Git的思想和基本工作原理,用起来就会知其所以然,游刃有余。...这是Git系列的第一篇,主要会介绍Git的特点以及内部数据结构设计,和完成一次完整提交流程的时候数据是如何变化的。 Git有什么特点?...为cat-file指定-p选项可指示该命令自动判断内容的类型,并为我们显示格式友好的内容: $ git cat-file -p 8d0e $ hello git 为cat-file指定-t选项可以查看文件的类型...$ git cat-file -t 88bc $ tree $ git cat-file -p 88bc $ 100644 blob 8d0e41234f24b6da002d962a26c2495ea16a425f...这样当完成一次提交的时候,整个状态的对应关系也是确定的,所以说commit对象就是当前系统的snapshot。 再来回顾下一次完整的提交流程: 如何写好注释,让同事赞不绝口?
可以通过 cat-file 命令从 Git 那里取回数据。 这个命令简直就是一把剖析 Git 对象的瑞士军刀。...test content 至此,你已经掌握了如何向 Git 中存入内容,以及如何将它们取出。...利用 cat-file -t 命令,可以让 Git 告诉我们其内部存储的任何对象类型,只要给定该对象的 SHA-1 值: $ git cat-file -t 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a...现在可以通过 cat-file 命令查看这个新提交对象: $ git cat-file -p fdf4fc3 tree d8329fc1cc938780ffdd9f94e0d364e0ea74f579...你的 Git 目录下的所有对象。 对象存储 前文曾提及,在存储内容时,会有个头部信息一并被保存。 让我们略花些时间来看看 Git 是如何存储其对象的。
查看Git Object存储内容 通过 git cat-file命令可以查看Git Object中存储的内容及对象类型,命令参数为Git Object的SHA-1哈希值,即目录名+文件名。...分别查看该blob对象和tree对象,其内容如下: $ git cat-file -p 065bca my project $ git cat-file -p 824244 100644 blob 3b18e512dba79e4c8300dd08aeb37f8e728b8dad...$ git cat-file -p 3b18e51 hello world 从上面的实验我们可以得知,git中存储了三种类型的对象,commit,tree和blob。...Git是如何实现Stash的呢?理解了Commit, Tree, Blog这三种Git存储对象,我们就可以很容易理解Git Stash的实现原理。...Git reset 实现原理 在进行一些改动以后并通过git commit 将改动的代码提交到本地的repo后,如果你测试发现刚才的改动不合理,希望回退刚才的改动,应该如何处理?
这是我们详细了解 git 如何存储内容的地方。让我们首先看看其中存在哪些类型的数据。...您可以使用 git cat-file,其中 -t 表示类型,-s 表示大小,-p 表示内容。...$ cat refs/heads/master 3c201df6a1c4d4c87177e30e93be1df8bfe2fe19 看起来它指向新对象之一。我们知道如何观察物体,让我们这样做吧。...cat-file -t refs/heads/master 嗯,看起来那是一种新的对象。...file $ git cat-file -p e6ec63cd761e6ab9d11e7dc2c4c2752d682b36e2 blog.meain.io 那些关注的人可能已经注意到,提交对象现在有一个名为
各种对象及内容的对象库,包含正常的和压缩后的。...commit 命令,除了原来的两个文件blob对象,又多出了三个对象,分别是commit对象,该commit作为整体的tree对象,file2.md所在的文件夹dir2的tree对象。...cat-file -t 20d1d441485e8a194976cba515754890bffb32ad tree [root@iZ23nrc95u7Z git-dir]# git cat-file -...]# git cat-file -t b2d176a8c3f1d4f608b722cc3b79bdeeaebbdf06 commit [root@iZ23nrc95u7Z git-dir]# git cat-file...不管是内容修改还是新建,校验和变了,就会在.git/objects目录下多出对应的对象,再次commit,会多出commit对象和该commit的整个tree的对象。
问题1:如何丢弃本地工作区修改的内容? $ git checkout -- 问题2:如何丢弃本地工作区和暂存区修改的内容?...$ git cat-file -p origin/HEAD^: # 当然,也可以采用reflog形式 问题4:如何忽略某文件?...Git对象 git init 会创建一个 .git 目录。这个目录包含了几乎所有 Git 存储和操作的对象。 如若想备份或复制一个版本库,只需把这个目录拷贝至另一处即可。...): git 汇总 研究Git对象ID的一个重量级武器就是git cat-file命令。...tree $ git cat-file -t 3365948518aad171336a52674cbdf0450679b4dc commit 查看对象的内容: $ git cat-file -p <commitID
cat-file -t 命令来查看对象文件的类型。...查看 blob 对象的类型和内容 caozhi@ objects$ git cat-file -t 6d1f98e1a9bede453ab16d6ba90428a994ebf147 blob caozhi...caozhi@ objects$ git cat-file -t d4eec9c19502086dd0f42f8bb7f26feb77377d5c blob caozhi@ objects$ git cat-file...因此很难让 Git 执行任何不可逆的操作,或者让它以任何方式清除数据。同其它版本控制系统一样,没有提交的更新有可能出现丢失的情况,但是一旦我们将更改提交到 Git 中之后,就很难再丢失数据。...这个特性使得我们可以放心且愉悦地使用 Git,我们可以尽情地做任何尝试。即使误操作出现数据丢失,我们也可以通过各种手段将其进行快速恢复。
替换 Git 对象是不可改变的,但它提供一种有趣的方式来用其他对象假装替换数据库中的 Git 对象。...replace 命令可以让你在 Git 中指定一个对象并可以声称“每次你遇到这个 Git 对象时,假装它是其他的东西”。 在你用一个不同的提交替换历史中的一个提交时,这会非常有用。...首先获取一个已经存在的仓库,并将其分成两个仓库,一个是最近的仓库,一个是历史版本的仓库,然后我们将看到如何在不更改仓库 SHA 值的情况下通过 replace 命令来合并他们。...我们已经用基础提交重写了最近的历史,基础提交包括如何重新组成整个历史的说明。 我们可以将新历史推送到新项目中,当其他人克隆这个仓库时,他们仅能看到最近两次提交以及一个包含上述说明的基础提交。...即使你运行了 cat-file 命令,它仍会显示你替换的数据: $ git cat-file -p 81a708d tree 7bc544cf438903b65ca9104a1e30345eee6c083d
/temp_git_file_RwpU8b hello git cat-file:查看objects文件内容 cat-file 根据sha1值查看暂存区中的objects文件内容。...使用 cat-file 可以查看object文件是什么类型的对象。...使用 cat-file 查看 blob 对象内容: # 查看 blob 对象内容 $ cat-file 82f8604c3652fa5762899b5ff73eb37bef2da795temp_git_file_tBTXFM...使用 cat-file 查看 tree 对象内容: # 查看 tree 对象内容 $ cat-file c771b3ab2fe3b7e43099290d3e99a3e8c414ec72 temp_git_file_r90ft5...使用 cat-file 查看 commit 对象内容: # 查看 commit 对象内容 $ cat-file 7ea820bd363e24f5daa5de8028d77d88260503d9 temp_git_file_CIfJsg
那么在GIT中是如何实现这些关联呢?GIT中同样有分支、版本概念。但是没有Configspec概念。tag概念同LABEL概念类似。当然这些概念都同GIT中是如何管理文件版本相关的。...首先我们来看GIT是如何将文件对象化管理的,前面我们说GIT同其它版本管理系统不一样是GIT每个版本都不是保存变更,而是全保存。...readme [root@wrlinux3 mygit]# git cat-file -t 52c8 blob [root@wrlinux3 mygit]# git cat-file...-t f8b6 blob [root@wrlinux3 mygit]# git cat-file -t d224 blob 2)tree 是一个simple 对象,它的内容就是一个指针表...从这张图我们也就明白了前面所说了Commit对象作为GIT管理的核心。GIT的Commit对象它不是说针对单个文件,它是针对的整个项目的。另外还有一种对象,TAG对象。
使用git cat-file命令 带有-t选项查看类型(type) 带有-s选项查看大小(size) 带有-p选项查看内容(pretty-print) 这个选项用于显示 Git 对象的内容,以更易读的方式呈现...,通常用于查看提交、树或标签对象的内容 git cat-file -t c3dc8e6cf3e1117a8d9731ddde9916da644296aa blob git cat-file -s c3dc8e6cf3e1117a8d9731ddde9916da644296aa...cat-file -t refs/heads/master ❞ 看起来这是一种新的对象类型,似乎是一个「提交对象」(commit object)。...❝树对象内部使用更多的树对象来表示文件夹,这些树对象与提交对象相连,用于表示目录结构。 ❞ ---- 5. 新增修改 让我们对文件进行更改并查看它是如何工作的。...cat-file -p 1f9224976e282aa9e32398a5bca0cec08041f1dc git,hello,789 提交对象现在有一个额外的属性,名为parent,它链接到「前一个提交
的目录过大,从git进行版本控制底层存储出发,简要分析Git目录过大的原因,以及如何处理 2、Git存储原理 2.1 目录结构 使用版本控制的人都会知道,不管是svn还是更为流行的git,整个工程目录下...cat-file命令查看Git Object中存储的内容及对象类型,命令参数为Git Object的SHA-1哈希值,即目录名+文件名。...,commit对象中保存了commit的作者,commit的描述信息,签名信息以及该commit中包含哪些tree对象和blob对象,继续看该tree对象中的内容 # git cat-file -p d2df53...demo1.txt # git cat-file -p 3b18e5 hello world 因此可以得知,git中存储了三种类型的对象,commit,tree和blob,三者分别对应git commit...,此commit中的目录和文件,这些对象之间的关系如下图 4、处理大文件 4.1 大文件的产生 由上面的详细分析流程可以看出,git会为每一个提交到版本控制的文件进行追踪,那么大文件究竟如何产生呢?
下面我们分两种代码丢失的场景情况来讨论。...在上面执行完git fsck --lost-found命令,返回的第一行blob我们使用git show命令来看看他的内容 正好内容就是lose_file.txt原本的内容,就是我们丢失的文件内容,这样就找回来了...我们再来看看上图中的commit和commit下的tree内容,可以看到他们之间的层级关系如下: 用git cat-file -p可以看到commit的内容,可以选择把这个commit合并到我们的分支里...git cat-file -t 7f5965523d2b9e850b39eb46e8e0f7c5755f6719 就能看见文件类型 把最后一个/去掉 复制从objects/ 后面的所有东西放在-t后面...提交过的就用命令git reflog来查询提交记录找回 2. 未提交但是git add过的就用git fsck --lost-found来生成丢失文件记录来找回。 3.
领取专属 10元无门槛券
手把手带您无忧上云