Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓

这篇具有很好参考价值的文章主要介绍了Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. Introduction 介绍

在 git 的丰富功能中,工作区 (Work Space)、暂存区 (Index/Staging Area)、本地仓库 (Local Repository) 和远程仓库 (Remote Repository) 被认为是四大核心概念。今天让我们深入了解这些神秘的组成部分,揭开它们的面纱,让你能够更好地利用Git来管理项目。

Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,git

上图相信大家再熟悉不过,这是我从 Git 基本操作 | 菜鸟教程 直接贴过来的,网上也有很多类似的图解...这个关系图主要介绍这四个区之间的关系,以及它们之间的 git 基本操作命令。在这个的基础上我将结合不同的文件、目录重点解释:workspace、staging area、local repository 到底存在我们自己电脑的何处,以及它们内部是如何关联运转的。希望看完你能有所收获。


2. Basic Concept 基本概念

工作区 (Work Space):是在电脑文件系统中能看到的项目目录。它包含项目的实际文件,你在工作区进行的修改会影响到这些文件。比如,你新创建了一个文件夹,git init 命令以后它就成为了一个 git 目录,然后你在文件夹里修改了一个 readme.txt 文件,也就是所谓的在工作区修改了它,这个很好理解。

暂存区 (Index/ Staging Area):是一个中间区域,用于暂存工作区中的改动,但这些改动还没有提交到本地仓库。在进行版本控制时,你需要明确地将修改添加到暂存区,这相当于一次“快照”,在提交到本地仓库之前,你可以对这次“快照”进行进一步的调整。这个区域比较抽象,我们暂时不需要看到它,只用记住在提交到本地仓之前,先添加到这儿就行

本地仓库 (Local Repository):是存储在自己计算机本地的版本库,包含了完整的项目历史数据。执行 git commit 命令后会将暂存区的内容添加到这里,git 会保存为一个新的提交,并更新本地仓库,这样就形成了项目的版本历史。这个区域也比较抽象,暂时不用担心

远程仓库 (Remote Repository):是位于网络上的 git 仓库,通常托管在像 GitHub、GitLab 或 Bitbucket 等服务提供商上。远程仓库用于协作和备份。多个开发者可以共享同一个远程仓库,每个人可以将自己的改动推送到远程仓库,从而实现协同开发。同时,远程仓库也提供了项目的备份和存档。


3. Further Exploration 进一步探索

其实,在我们的电脑上,git 工作区是工作区、暂存区和本地仓的统称...现在我们用图文形式开始解释,以 Mac 电脑为例,Windows 基本思路一致。

3.1 Git Structure 文件结构

首先我们从 git 文件夹结构入手,比如我们创建了一个文件夹 learnGit 并且使用 git init 命令初始化成一个 git 文件夹,里面有一个 readme.txt 文件,那么 readme.txt 其实就处在该 git 文件夹的工作区,这点很好理解对吧。

Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,git

此时如果我们在 learnGit 目录中使用 command + shift + . 快捷键 (显示隐藏文件),会出现一个 .git 文件夹,这就是我们所谓的本地版本库,它是 git 版本控制系统用于存储仓库元数据和对象的目录,更是 git 的核心。它包含了 git 仓库的全部信息,包括版本历史、分支、标签、配置等。

Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,git

3.2 Key folder 隐藏文件 .git

.git 文件夹是Git版本库的核心,它使得Git能够追踪文件的更改、管理分支、记录提交历史等。这个文件夹通常位于项目的根目录下。在通常情况下,用户不太需要直接操作这个文件夹,而是通过Git命令来与版本库进行交互。为了更好地了解 git,一起来看看以下几个重要的文件及文件夹。

Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,git

3.2.1 index 文件

没错,通过名字不难看出 index 文件实际上就存储了将被包含在下一次提交中的文件信息,我们可以理解为这就是 Staging Area 即暂存区的内容。这就是为什么说暂存区的内容其实也被包括在工作区

3.2.2 HEAD 文件 (*)

指向当前所在分支的最新提交,当前表明我们在本地的 main 分支,如果我们切换到另一本地分支,比如 temp,那么这个 HEAD 文件就会显示 ref: refs/heads/temp (之后演示的内容原理都和 main 分支一样)。Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,gitHEAD 文件的内容是一个路径文件,我们打开这个路径下的main文件 .git/refs/heads/main

Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,git显示为一段 hash 码,我们先不要关掉这个文件,等下看这个 hash 码和谁能对应上

3.2.3 logs 文件夹 (*)

由文件夹名字不难看出这是一个用于存放记录日志的目录,logs 文件夹下又包括一个 HEAD 以及 refs 文件夹,如下图所示

Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,git

与上一个 HEAD 文件不同,这个 HEAD 文件在 logs 文件夹下,它主要记录的是 'HEAD' 引用的变化,即当前所在的分支或提交的变化。可用于记录分支切换,版本回退,提交等日志。比如每次切换分支或提交时,都会在这个文件中生成一条记录,包括变化的时间、旧的 HEAD 引用的位置、新的 HEAD 引用的位置等信息。

refs 文件夹中包含 heads 和 remotes 两个文件夹,remotes 很明显是关于远程仓的,我们主要来看看 heads。heads 文件夹中包含一个 main 文件。这个文件是用于记录本地特定分支的引用变化,每次该分支发生变化时,都会在这个文件中生成一条记录,包括变化的时间、旧的分支位置、新的分支位置等信息。

我们用文本编辑器打开这个 .git/logs/refs/heads/main 文件

Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,git

我们发现最后的 hash 码和之前那个对应上了! 

.git/HEAD 指向的 .git/refs/heads/main 哈希码 == .git/logs/refs/heads/main 最后的哈希码

我们知道 HEAD 表示当前分支提交的最新版本,上面这个例子表示,我们目前所在的本地 main 分支上最新提交版本对应的 reference (快照) 是 ece57b94dd97a....5896 这个 Hash 码,由此我们得出结论,在获取历史提交版本时是以 commit 对应的 Hash 码作为依据找到对应的提交版本,这个 Hash 码在 .git/logs 日志中可以找到。 

可是,有了 Hash 码还不够,我们还要根据这个 Hash 码找到具体的提交内容,那么具体的提交内容存放在哪呢?

3.2.4 objects 文件夹 (*)

objects 就是我们的本地对象库,它的作用是存储所有的 git 对象,如提交内容、树(目录)、Blob(文件)等。所以如果我们要依据 Hash 码找到实际的提交内容,就要拿着 logs 文件夹中存储的 Hash 码来 objects 文件夹取。在这个目录中,git 会根据哈希值的前两个字符将对象分组存储。每个提交对象的内容会被压缩、存储在一个以哈希值命名的文件中。如果对象内容有变化,git 会生成新的哈希值。

Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,git

打开这个 ec 文件夹就能看到,我们最后一次提交的具体内容了,这个内容是以之前那个 Hash 码命名的。很巧的是,我们上一次的提交和最新的提交 Hash 码开头差不多,所以 git 通过计算前两位 hash 码将两者都放在了这个文件夹中。Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,git


4. Conclusion 总结

到此我们就知道了工作区、暂存区、本地仓库在自己的电脑到底是如何存在的,以及他们之间是如何运作产生联系的,本地仓库就是 .git/objects 文件夹,暂存区就是 index,HEAD 指向当前本地分支最新的提交,这个提交对应有一个 commit id, 以 Hash 值表示,获取或者推送某个提交需要拿着 Hash 值去本地仓库也就是 .git/objects 里找到具体的提交内容。

4.1 关系图

下图是我总结出的工作区、暂存区及本地版本仓库的关系图 (以本地 learnGit 为例),供大家参考。

Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓,Git 专栏,git

感谢各位的阅读,如果你觉得我的博客对你有所帮助或启发,欢迎点赞收藏🚀~文章来源地址https://www.toymoban.com/news/detail-802263.html

到了这里,关于Git详解(带图) --- 本地电脑的工作区、暂存区、本地仓与远程仓的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Git - 基于IDEA/命令回滚工作区和暂存区的修改

    1. 使用命令行回滚工作区的修改(回滚文件的修改) 可能有一天我正在写代码,写了很久发现写错了,想恢复到一开始的状态,一个笨办法就是把刚刚写的代码一行一行的删除,不过这种方式成本太高,我们可以通过命令来回滚 工作区的代码修改: 测试: ① Test.java文件内

    2023年04月08日
    浏览(56)
  • Git--本地修改文件暂存工作区和恢复至工作区

    当克隆一个项目到本地之后,经常需要修改配置文件,那如何做到下次再更新代码,不重复修改配置文件。可通过暂存工作区内容进行恢复。 注意:默认恢复的就是最新一次stash 说明:会展示所有的stash列表 git stash apply 暂存名 说明:通过查看stash列表,把指定的stash记录删除

    2024年02月11日
    浏览(67)
  • git在工作区和本地库的操作命令

     本文介绍一些开发时,常用的在工作区和本地库之间的操作命令 工作树的修改内容要提交到本地库,首先需要先添加到缓存区stage,在commit到本地库。 你开发了一段时间,可能已经忘记了修改过那几个文件 可以使用 git status 查看 工作区和缓存区的内容 ,即修改过的文件和

    2024年02月15日
    浏览(43)
  • 01 - 工作区、暂存区、版本库、远程仓库 - 以一次连贯的提交操作为例

    查看所有文章链接:(更新中)GIT常用场景- 目录 以一次连贯的提交操作为例。 Git的工作区也就是我们平时编辑代码的目录文件夹。 新建一个kongfu_person.txt文件,工作区的变化:

    2024年02月13日
    浏览(34)
  • Git——工作区管理

    如何管理工作目录,以便用户可以更高效地新建提交。如何在处理工作区和暂存区文件的过程中修复错误,以及如何修复最近一次提交记录中的问题;同时还会了解到如何安全地使用暂存机制和多个工作目录处理工作流中的中断问题。 主要内容有以下几点: 忽略文件:特意

    2024年02月03日
    浏览(42)
  • git工作区删除了文件想更新回来

    删除了本地dev分支的几个文件,本地dev对应远端dev分支,想更新回来 法一、如果你知道文件夹名称或者文件名称: 法二、工作区的修改,其中就包括删除,这其实都会被git认为正常的操作,即使是你误操作 而针对你的操作,git提供了回退操作,如下图 法三,直接将本地库整

    2024年02月11日
    浏览(58)
  • idea将文件移出git的工作区

    之前使用idea在commit项目时候,忘记添加.gitignore文件了,导致提交了很多无关的文件进入远程仓库,网上有教程是使用git - reset head 方法,但是这个方法只是将上一次的commit文件覆盖当前的暂存区文件,而非移除暂存区文件,所以没有用   但是在idea工具好像并没有提供将文件移

    2024年02月13日
    浏览(45)
  • git 将其它分支的文件检出到工作区

    主要是使用如下命令: 覆盖与 pathspec 匹配的文件的内容。当没有给出 tree-ish (通常是一个commit)时,用 index 中的内容覆盖工作树。当给出 tree-ish 时,用 tree-ish 处的内容同时覆盖 index 和工作树。 由于前一个的合并失败,index 可能包含未合并的条目。默认情况下,如果您试图从

    2023年04月09日
    浏览(39)
  • VS Code工作区用法

    背景 VS Code可以通过\\\"文件/打开文件夹\\\"来打开本地项目,但是想要打开多个项目便需要来回切换,比较费劲。此时就可以使用工作区功能,将不同的项目放置到同一个工作区中,这样切换项目的时候就会非常方便。 操作方法 打开其中一个项目 执行命令:文件 》 打开文件夹

    2024年01月25日
    浏览(60)
  • VScode 工作区配置 和 用户配置

    通常不同的项目都有不同的配置,我一般都是使用eslint和prettier一起用,所以经常会有这几个文件: 这里简单介绍一下这几个文件的作用吧。 一般有两个文件,extensions.json和settings.json。 extensions.json 文件是用来配置推荐安装的 VS Code 插件的文件。在这个文件中,你可以列出你

    2024年01月24日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包