Git1 基础

2023-11-06

1 什么是git

1.1 简介

GIT是一种分布式版本控制系统,通俗点说版本控制就是当文档写错了,能够让你回退到之前某个正确的版本,给你一着悔棋。

1.2 版本控制系统
1.2.1 本地版本控制系统

许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间进行区别。这么做的唯一好处就是简单,坏处也不少:有时候会混淆所在的工作目录,一旦弄错了文件数据就没办法撤销恢复。为了解决这个问题,人们很久以前就开发了许多本地版本控制系统,大多是采用某种简单的数据库来记录文件的历次更新差异。

1.2.2 集中式版本控制系统

接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作?于是,集中化的版本控制系统(Centralized Version Control Systems)应运而生。这类系统,诸如CVS、Subversion等,都有一个单一的集中管理服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。

这么做带来了很多好处,特别是相对于本地版本控制系统来说。现在,每个人都可以在一定程度上看到项目中的其他人正在做什么,管理员也可以轻松掌握每个开发者的权限,看到每个人每天的提交记录。这样做最大的缺点就是中央服务器的单点故障。如果宕机一小时,那么在一小时内所有人都无法提交更新,也就无法协同工作。要是中央服务器的磁盘发生故障,碰巧没有备份或者备份不及时,就会有丢失数据的风险。最坏的情况是彻底丢失整个项目的所有历史更改记录,而被客户端提取出来的某些快照数据除外,但是不能够保证所有的数据都已经有人事先完整的提取出来。

本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。

1.2.3 分布式版本控制系统

分布式版本管理系统就是为了解决这个单点问题,在这类系统中,像Git、Mercurial、Bazaar以及Darcs等,客户端并不只是提取最新的文件快照,而是把原始的代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。更进一步,这类系统都可以指定和若干不同的远端代码仓库进行交互。因此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。你可以根据需要设定不同的协作流程。

1.3 Git与SVN等常规版本控制软件的区别
1.3.1 直接记录快照,而非差异比较

Git和其他版本控制系统的主要差别在于,Git只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS、Subversion等)每次记录都有哪些文件做了更新,以及更新了哪些行的什么内容,如下图:

这里写图片描述

Git 并不保存这些前后变化的差异数据。实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照 的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。Git 的工作方式就像下图所示:

这里写图片描述

这是 Git 同其他系统的重要区别。它完全颠覆了传统版本控制的套路,并对各个环节的实现方式作了新的设计。Git 更像是个小型的文件系统,但它同时还提供了许多以此为基础的超强工具,而不只是一个简单的 VCS。

1.3.2 支持离线工作(近乎所有操作都是本地执行),本地提交可以稍后提交到服务器上;
1.3.3 时刻保持数据完整性;
1.3.4 多数操作仅添加数据;

2 git的组成

每个GIT工程的三个组成部分: git目录(Git Directory),工作目录(Working Directory),以及暂存区(stage area)。

2.1 Git目录(Git Directory)(HEAD)

Git目录是GIT里面最重要的一部分,文件夹名字为“.git”。你从服务器clone一个项目的时候,其实就是clone一个 “.git”的文件夹!

Git目录里面包括了所有的元数据:当前分支,所有本地分支,remote信息,配置文件等等,另外最重要也是最大的就是所有的GIT对象,这些GIT对象记录了所有的历史记录以及文件改动。

2.2 Git目录(Working Directory)

从GIT角度看,一个工作目录就是GIT的一个版本,里面的文件是从压缩的GIT数据库里面解压出来,然后放在你的文件系统里。从使用的角度看,我们开发时用到的所有文件都是工作目录里面的文件。这些文件都放在项目的根目录下,跟“.git”在同一文件层次目录。

2.3 暂存区(Stage Area)

暂存区保存着下一个commit将会包含的所有改动。但实际上,暂存区只是一个文件,而不是一个文件夹。暂存区的这个文件一般叫”index”,保存在”.git”目录下。

这里写图片描述

3、git的工作流程

基本的git工作流程如下:

  1. 在工作目录中修改某些文件。

  2. 对修改后的文件进行快照,然后保存到暂存区域。

  3. 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中。

  4. 将更改后的代码提交到远程库。

每个文件的状态不是tracked就是untracked。 track指的是该文件已经在GIT的监控范围之内了,该文件的每一点改动GIT都能跟踪到;untrack指的是该文件不在GIT的监控范围之内,它的改动GIT是不会去跟踪的。
而每个tracked的文件将会处于如下四种状态的其中一种:unmodified,modified,staged, committed。

如果是 Git 目录中保存着的特定版本文件,就属于已提交状态(committed);如果作了修改并已放入暂存区域,就属于已暂存状态(staged);如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态(modified)。

  • unmodified说的就是这个文件木有动过
  • modified是指你的文件已经改动了,但是还没有保存到你的本地数据库里面;
  • staged是指你的文件改动了,并且添加到暂存区里面,下次提交就会把这些改动保存到本地数据库;
  • committed是指你的文件改动了,并且已经保存到本地数据库

每个真正进入版本库的文件都需要按照这种顺序执行:modified -> staged -> committed。同时这三种状态是互斥的,也就是说一个文件只能同时处于其中的一种状态而已!

举个栗子:

先对文件做修改:

$ echo haha >>README.md

然后查看状态:

$ git status

On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

从上面得到信息,GIT跟踪到文件README.md已经处于modified的状态了,但是并没有加入到暂存区(Changes not staged for commit)。

然后将文件加入到暂存区:

$ git add README.md

如果在执行add操作时出现warning: LF will be replaced by CRLF in README.md设置git config core.autocrlf false即可解决。或是放任不管也没关系。

再来观察状态:

$ git status

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   README.md

GIT的信息说明了README.md的改动已经在暂存区里面了,下一步的工作就是使用commit就文件变动存入到本地数据库中继而将文件push到远程库中。

做一个比喻:文件修改就好比是商品,暂存区就好比是购物车。当我们修改好文件(选好商品)之后,通过 git add命令(拿起商品放到)放到暂存区 (购物车),然后通过commit(买单)将改动加到代码库(将商品拿回家里去)。当然,在这个过程当中,暂存区的文件是可以再回到工作区的(把商品放回货架上)。

参考
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git1 基础 的相关文章

  • SSH 到 Openshift 服务器失败

    我正在 openshift 服务器上使用 jboss catridge 我希望与其他人共享此实例并添加其他用户的公钥 id rsa pub 当其他人尝试访问该实例时 他会收到以下错误 我在他的实例中尝试了同样的方法 但看到了同样的错误 与
  • 推送时发生 Git 错误 - update_ref 失败

    当我尝试推送本地提交时遇到问题 这可能是在 Android Studio 崩溃时发生的 这是错误 update ref 引用 refs remotes origin master 失败 无法锁定 ref refs remotes origi
  • 分支明显不同,但提交历史是相同的

    git status告诉我我的分支和我在另一个存储库上开始的分支已经分歧 On branch master Your branch and origin master have diverged and have 13 and 13 dif
  • 代表 Git 存储库的数学结构是什么

    我正在学习 Git 如果我能描述一下代表 Git 存储库的数学结构 那就太好了 例如 它是一个有向无环图 它的节点代表提交 它的节点有代表分支等的标签 每个节点最多一个标签 没有标签使用两次 我知道这个描述不正确 我只是想解释我正在寻找的内
  • 如何从 android.googlesource.com 或 github.com 下载单个目录?

    我想下载 https android googlesource com platform frameworks base git master tools aapt https android googlesource com platfo
  • git diff - 只显示哪些目录发生了变化

    有没有办法只列出已更改的目录 如果我在 git root 的话 project 我更改的文件是 project subtool file1 project subtool file2 project subtool3 file1 我只是想
  • 丢失了我在 GIT 中的提交。你会不小心删除提交吗?

    我正在使用 git gui 但看不到我的分支 我知道我今天检查了一些东西 在完成提交并使用分支查看器验证后 我更改为较早的分支 我对之前的分支进行了更改 然后想返回到当前的分支 但我再也看不到它了 任何帮助都会很棒 回答你的问题 在大多数情
  • git 别名中的 AWK 语句

    我正在尝试创建一个 git 别名来以特定格式打印日志中的所有拉取请求 但是 我在使用 AWK 删除双空格时遇到问题 这是使用以下命令的 git log 的输出 git log merges grep pull request pretty
  • VS 2015 + Bower:在防火墙后面不起作用

    Problem 在 Visual Studio 2015 中 使用 Bower 我的包在防火墙后面时恢复失败 并出现类似以下内容的错误 ECMDERR 无法执行 git ls remote tags heads git github com
  • Netbeans 和 Git,.obj 文件被忽略

    我正在开发一个涉及 obj 文件的小型 git 项目 当我查看 项目选项卡 时 我发现它们被忽略了 但如果我查看我的 gitignore 我无法理解为什么 DepthPeeling nbproject private DepthPeelin
  • git 认为文件已更改

    我在一台机器上对一个项目做了一些工作 然后推送到 github 在另一台机器上克隆并做了一些工作 然后推送 然后我回到第一台机器并做了一个pull 现在 第一台机器认为项目中最初的所有文件都已更改 我试过了 git checkout f a
  • 如何使用 AWS Lambda 安装 Git?

    我在代码提交存储库中有代码 我正在编写一个 lambda 函数来为代码提交存储库的每个签入 事件 构建代码 我无法安装 git 因此无法克隆存储库 我该怎么办呢 正如其他人提到的 在 lambda 上安装 git 要么非常困难 要么完全不可
  • git 提交错误:检测到大文件

    您好 我正在为 ios 8 1 开发一个应用程序 xcode 我已经使用 googleMaps 框架来实现自动完成功能 当我尝试在 Git 中推送我的项目时 我收到大文件检测错误 后来尝试使用 git lfs 并跟踪 git 检测到的文件
  • Git 2.2.x 无缘无故更新旧包文件的时间戳

    Git 2 2 0 和 2 2 1 似乎修改了旧的时间戳 git objects pack pack pack偶尔会无缘无故地文件 它只是改变时间戳 内容是相同的 调试这一点很困难 因为它似乎很少进行更改 我在 2 2 0 之前的任何 Gi
  • Git difftool 未启动外部 DiffMerge 程序

    我一直遵循 戴夫的博客条目 http www davesquared net 2009 05 setting up git difftool on windows html 链接在此answer https stackoverflow co
  • Git 到 TFS 源代码管理迁移

    我想看看 TFS 如何为我的命令工作 所以我想将我们当前的 GIT 存储库移动到 TFS 数据库 我们使用 GIT 来获得普遍的分支支持 因此我想使用 TFS 2010 来解决该问题 现在的问题是 如何将 GIT 存储库导出到 TFS 显然
  • 仅使用 Git grep 的文件名

    我只想查看文本中包含特定单词的不同文件 current directory git grep word 显示文件中具有匹配单词的每一行 所以我尝试了这个 current directory git grep word files with
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • git 是否有任何静态接口?

    我一直在寻找一个宁静的 git api 但似乎没有找到 我得到的最接近的是 Github 的 api 来访问一些存储库信息 还有其他的实施吗 Orion Git API http wiki eclipse org Orion Server
  • git 2.32 git push -u origin master 没有任何反应

    I ve starting to use git github and I m stucked on how to push my codes to github I m following some tutorials and when

随机推荐

  • java将字符串生成二维码并上传到七牛云

    之前碰到一个需求是将一个url链接生成二维码 并且能够让用户通过二维码扫码打开这个链接 在此记录一下 云存储用的是七牛云OSS 所以首先需要引用七牛云的maven架包
  • 2023全网最全requests库和requests模块使用详解(建议收藏)

    一 requests简介 简介 使用requests可以模拟浏览器的请求 比起之前用的urllib requests模块的api更加便捷 本质就是封装了urllib3 注意 requests库发送请求将网页内容下载下来以后 并不会执行js代
  • C++ 简单乘积

    C 语法基础题目第2题 简单乘积 题目 简单乘积 题目来源 acwing 605题 读取两个整数值 在此之后 计算它们的乘积并将结果存储在名为PROD的变量中 输出结果如下例所示 输入格式 共两行 每行包含一个整数 输出格式 输出格式为 P
  • 11-3 读写一个字符

    1 读一个字符 读一个字符的函数有三种 分别为 getchar getc 以及 fgetc 其中 getc 和 fgetc 实现方式不一样 但功能相同 getc 利用宏实现 fgetc 利用函数实现 此外 注意上述函数返回值均为整数 且 s
  • 深度学习--TensorFlow(5)BP神经网络(混淆矩阵、准确率、精确率、召回率、F值)

    目录 一 混淆矩阵 二 准确率 三 召回率 四 精确率 五 综合评估指标 F值 一 混淆矩阵 也程 误差矩阵 是表示 精度评价的一种标准格式 用n行n列的矩阵形式来表示 在机器学习领域 混淆矩阵又称为可能性表格或者是错误矩阵 它是一种特定的
  • laravel查看sql语句

    方法一 我们有时候想测试一段代码生产的 SQL 语句 比如 我们想看 App User all 产生的 SQL 语句 我们简单在 routes php 做个实验即可 app Http routes php Route get test sq
  • Caused by: java.lang.NoClassDefFoundError: org/apache/curator/shaded/com/google/common/collect/Maps

    出现上述错误 我发现的原因是 springboot版本和Curator版本不对应 springboot是1 5 Curator版本为4 0 我是这么解决的 Curator版本改为2 7 0
  • Python文件直接操作文件描述符open的大坑

    17 fr1 open file1 readlines 18 fr2 open file2 readlines 如果是fr2 open file2 那么for 嵌套循环会报错 19 sh dict 20 cnt mil 0 21 cnt e
  • Lombok中@Slf4j 注解报错

    1 检查项目中是否引入lombok的依赖
  • springboot运行时内存溢出_SpringBoot 使用 Caffeine 本地缓存

    点击上方 SpringForAll社区 轻松关注 及时获取有趣有料的技术文章 本文来源 http www mydlq club article 56 一 本地缓存介绍 二 缓存组件 Caffeine 介绍 1 Caffeine 性能 2 C
  • 双色球笔记3--输出所有中奖号码

    双色球笔记3 输出所有中奖号码 1 功能 本文主要根据中奖类别输出所有中奖号码 双色球奖项分为6种 如下所示 一等奖 6 1 中奖概率为 红球33选6乘以蓝球16选1 1 17721088 0 0000056 二等奖 6 0 中奖概率为 红
  • ❤ElementUI Table表格

    ElementUI Table表格操作 一 实战部分一 1 表格基础属性 1 表格赋值数据 data
  • 通过 jd-gui 查看 jeeSite 的framework

    最近有一个单体应用开发 综合比对下选择了jeeSite 前端虽有瑕疵 后台功能确实做的不错 一切准备就绪 环境搭建好了 准备开发 需要修改角色信息 发现代码当中竟然没有 后来查看了下maven仓库下的jeesite framework 4
  • Qt信号与槽传递自定义数据类型

    Qt信号与槽之间传递typedef定义的数据类型或其他类型 在编译时不报错 但在执行时会报如下错误 QObject connect Cannot queue arguments of type elemType Make sure elem
  • R语言报错记录The following objects are masked from ‘package:stats’:decompose, spectrum

    报错记录 大家好 这里是想做生信大恐龙 的生信小白 这是一条简短的报错记录 参考了其他博主的方法 如有侵权 请联系删除 报错记录 报错记录 报错原因 解决方法 总结 报错原因 使用R语言第三方包 igraph 时出现了以下报错 The fo
  • 【Qt教程】3.5 - Qt5 QPainter绘图抗锯齿、相对坐标/平移坐标系、QPainter画图片、手动调用QPainter绘图事件

    GitHub源码仓库 Qt学习例程 1 QPainter绘图抗锯齿 抗锯齿测试 painter drawEllipse QPoint 100 50 50 50 设置 抗锯齿能力 抗锯齿会让绘图效率较低 painter setRenderHi
  • CVPR 2021

    双图层实例分割 物体的互相遮挡在日常生活中普遍存在 严重的遮挡易带来易混淆的遮挡边界及非连续自然的物体形状 从而导致当前已有的检测及分割等的算法性能大幅下降 本文通过将图像建模为两个重叠图层 为网络引入物体间的遮挡与被遮挡关系 从而提出了一
  • pip install PIL 报错

    使用 pip install PIL 时报如下错误 Collecting PIL Could not find a version that satisfies the requirement PIL from versions No ma
  • kubernetes常用命令汇总

    1 查询命名空间 kubectl get ns 2 查询服务名 kubectl get po 3 查询对应命名空间下的服务名 kubectl n namespace get po 4 根据命名空间下某个服务的查询日志 kubectl n n
  • Git1 基础

    1 什么是git 1 1 简介 GIT是一种分布式版本控制系统 通俗点说版本控制就是当文档写错了 能够让你回退到之前某个正确的版本 给你一着悔棋 1 2 版本控制系统 1 2 1 本地版本控制系统 许多人习惯用复制整个项目目录的方式来保存不