Git:Git的一些基本操作

2023-10-27

基本认识

首先要对Git有一个基本的认知:

Git本质上是一个版本控制器,可以对一个信息的多个版本进行一些控制,而能对版本的控制的好处就是,不管需要哪个版本的内容,都可以借助Git这个工具找到所需要的信息

Git是一个软件,它又是客户端又是服务器
Git是一个只会记录变化的软件
Git是分布式软件,去中心化的

而我们熟知的所谓的GithubGitee,实际上都是网站,这两个网站都是基于Git软件搭建的网站,简单来说,就是让版本的管理可视化而非命令行,有助于进行版本的管理

使用方法

下面进行Linux中关于Git的一些使用场景:

创建本地仓库

在使用Git前,首先要对创建一个Git的仓库:

git init

此时目录下看似没有信息,实际上已经有了一个信息:.git

在这里插入图片描述
而这个.git中是存在许多信息的:

在这里插入图片描述
而这个文件就是代码在本地的一个仓库,仓库就创建好了

配置本地仓库

对于本地仓库的配置,首先要配置的是nameemail的信息

配置name和email

# 配置用户名为xxx
git config user.name "xxx"
# 配置邮箱地址为xxxxxx
git config user.email "xxxxxxxxxx"
# 查看配置的信息
git config -l

删除name和email

信息有录入的途径,也会有删除的途径,Git本地仓库配置删除操作有:

# 删除name
git config --unset user.name
# 删除email
git config --unset user.email

此时再次查看配置信息就没有之前的信息了

–global的概念

在录入信息和删除中可以加入--global这个选项:

git config --global user.name "xxx"
git config --global user.email "xxxxxxxxxx"
git config --global --unset user.name
git config --global --unset user.email

这个选项的意思是,表示这台机器上的所有的Git仓库都采用了这个配置,因为在一台机器上是可以存在多个仓库的

为什么要配置仓库的用户名和邮箱?

这是由于Git本身的功能决定的,对于一个人提交的代码来说,在一个大型项目中重要的一步是这个项目的代码可以溯源,当找到一份异常的提交后,可以根据提交者的用户名和邮箱找到这份代码对应是由谁来完成的,这是Git所应具备的一项功能,因此在提交代码前需要将仓库信息进行初步的配置

工作区、暂存区、版本库的概念

在Git仓库中有上面的三个名词,那么三个词的概念如下:

工作区:就是电脑上要写的代码或文件的目录

暂存区:也叫做stage或index,一般来说是出于.git目录下的index文件下,也叫做索引

版本库:也叫做仓库,版本库中有一个隐藏的目录.git,前面也有提到这是一个隐藏文件,而这个.git实际上就是我们所谓的仓库,实际上它不算是工作区,是Git的一个版本库,这个版本库中的所有文件都能被Git进行管理,对于工作区中文件的各种操作,比如说新增删除等都能进行一定的追踪,在未来可以对于某个版本进行还原等操作

下面用一张图来阐述这三个区的一个基本概念:

在这里插入图片描述
上图就表明了关于Git中的三个模块的一个基本概念,左侧就是工作区,右侧是版本库,版本库中又存在了一个临时暂存区和master的概念,而实际上版本库中还有对象库的概念,也就是objects,对象库中存储的是关于这些文件的一个索引

关于版本库中还有一个HEAD,这个HEAD其实是一个指针,文件是树形结构,因此必须有一个头指针用来对文件进行一些操作

下面对于工作区和版本库的一些操作进行阐述:

当对于工作区进行修改的时候,如果执行了git add的命令,那么出于暂存区的目录树的内容就会被更新,文件的索引也会被更新,但是这些更新都是暂时的,因为这些信息都被存储在暂存区中,而commit的存在就是对于master分支的一个更新,也就是说,只有在进行了commit的操作后,master的分支进行了相应的更新,也就可以理解为是暂存区的目录树进入到了真正的版本库中

由此可以引出一些结论:

首先要明确的是,.git就是我们所谓的仓库,但不能直接向仓库中写入东西,应该要在仓库所在的工作区下进行写入或其他操作

如果只是用新建或粘贴等的一些操作,并不能是向仓库中添加文件,只是在工作区进行了一定的写入和修改,必须要用add的操作将你所修改的目录树上传到stage暂存区,再从暂存区中commit文件到仓库,才能真正进行管理

添加文件

上面总结了一些关于文件的操作,那么下面具体的使用:

现在在.git所在目录下新建了一个test文件,那么就可以使用add的命令把文件添加到暂存区

# test所指的是文件名
git add test
# 表示直接将当前目录下的所有内容都新增到暂存区
git add .

再使用commit的命令将暂存区的内容都添加到本地仓库中

# message表示的就是关于本次提交的一些描述性的语言,用来记录提交细节
git commit -m "message"

查看.git文件

先看刚创建的git下的目录树:

[test@VM-16-11-centos GitCode]$ tree .git
.git
|-- branches
|-- config
|-- description
|-- HEAD
|-- hooks
|   |-- applypatch-msg.sample
|   |-- commit-msg.sample
|   |-- post-update.sample
|   |-- pre-applypatch.sample
|   |-- pre-commit.sample
|   |-- prepare-commit-msg.sample
|   |-- pre-push.sample
|   |-- pre-rebase.sample
|   `-- update.sample
|-- info
|   `-- exclude
|-- objects
|   |-- info
|   `-- pack
`-- refs
    |-- heads
    `-- tags

现在我们创建了一个test文件,接着把这个文件进行addcommit操作:

[test@VM-16-11-centos GitCode]$ tree .git
.git
|-- branches
|-- COMMIT_EDITMSG
|-- config
|-- description
|-- HEAD
|-- hooks
|   |-- applypatch-msg.sample
|   |-- commit-msg.sample
|   |-- post-update.sample
|   |-- pre-applypatch.sample
|   |-- pre-commit.sample
|   |-- prepare-commit-msg.sample
|   |-- pre-push.sample
|   |-- pre-rebase.sample
|   `-- update.sample
|-- index
|-- info
|   `-- exclude
|-- logs
|   |-- HEAD
|   `-- refs
|       `-- heads
|           `-- master
|-- objects
|   |-- 22
|   |   `-- 7d6160665cbf086283c40409fe293725aba9c0
|   |-- de
|   |   `-- 52fd134820bcfe69a77b154d8f429ba43d954a
|   |-- f2
|   |   `-- 2a908e15bc9989e5a8de489dd757e37ca2e728
|   |-- info
|   `-- pack
`-- refs
    |-- heads
    |   `-- master
    `-- tags

使用git log命令可以查看历史的提交记录:

在这里插入图片描述
则此时显示的就是关于git提交的一些历史记录,这当中commit中有一组数据,我们要记录下来:

#  commit后生成的一段十六进制编号
de52fd134820bcfe69a77b154d8f429ba43d954a

下面对比进行提交前后的目录树:

在这里插入图片描述
从中可以看出的第一个变化,就是提交后的目录树新增了一个index目录,而这也印证了前面所说的关于Git的暂存区的概念

前面又提到了,HEAD就是默认指向master分支的一个指针,因此可以在Linux下查看HEAD指向的内容:

在这里插入图片描述
从内容中可以看出,master路径下存放的是一段编号:

de52fd134820bcfe69a77b154d8f429ba43d954a

而这段编号和我们前面所看到的内容是一样的,这段内容保存的就是当前最新的commit id

下面继续来看树更新的部分:

在这里插入图片描述
objects中也进行了一些更新,而前面说到过,objects实际上就是Git的对象库,里面包含了创建的各种版本库对象和内容,当执行git add的命令的时候,暂存区的目录树被进行了更新,同时工作区的内容就被写入了对象库中的一个新的对象中,而这个对象就位于objects目录下,那么如何查看这个路径下的内容?

在查找的时候要把commit id分成两个部分,前两位是文件夹的名称,后面是文件的名称,因此就定位到了de文件夹下的相关内容

而如何查看这个文件的具体内容?实际上这个内容是不可以被直接查看的,因为这个内容被安全哈希算法进行了一定程度的加密形成的文件,但也有解决方法,可以用git cat-file命令来查看版本库对象的内容

# xxxx表示的是commit id
git cat-file -p xxxx

在这里插入图片描述
由此可以看出,这个commit id下存储的信息就是当初在commit -m后所写的更新信息

由此我们可以看出:

  1. HEAD是一个默认指向master分支的一个指针
  2. refs/heads/master文件中存储的是当前master分支的最新的一个commit id
  3. objects中包含了创建的各种版本库对象的内容,可以说是存放了Git维护中的所有的修改

关于add和commit的一些额外命令

git status

该命令用于查看在你上次提交后是否对于文件有进行新的修改

# xxx表示要对比的文件名
git diff xxx

下面进行一些实验:

现在重新写一个内容进行更新:

在这里插入图片描述
此时这里使用vim又输入了一些内容,此时输入命令后就提示要先提交到暂存区,再进行提交,下面执行addcommit命令

在这里插入图片描述

此时就提示已经工作区没有需要提交的内容

版本回退

既然是版本控制工具,那么想要得到之前的版本也是应该具备的一项功能,那么在Linux中如何实现版本回退?

需要用到reset指令!

# soft表示只改变版本库
git reset --soft [commit id]
# mixed表示改变暂存区内容
git reset --mixed [commit id]
# hard表示将暂存区和工作区都退回到以前版本
git reset --hard [commit id]

因此从中看出,hard指令在使用的时候是需要慎重的,如果你所写的代码没有进行提交,直接使用这个命令会导致代码被覆盖

简单来说,git reset命令的核心就是前面所说的commit id,如果能找到commit id就可以实现一系列的功能,因此下面Git还提供了一个找commit id的方法:

git reflog

Git回退的机理是什么?

对于当前的Git版本来说,Git版本的回退是相当快的,因为在Git内部有一个指向当前分支的HEAD指针,而在master文件中存储着最新的commit id,因此当在回退版本的时候,Git仅仅是把master中存储一个特定的版本,而当回退的时候,只需要让HEAD指针指向的master指向前面的一个版本就可以了

撤销修改

本小节主要介绍的是关于Git使用中版本回退的问题:

下面展示多个场景的不同使用方法:

1. 对于工作区内还没有add的代码

  1. 直接手动删除

这样的操作是有风险的,可能会多删或其他问题情况出现

  1. 使用命令
# xxx表示文件名
git checkout -- xxx

这个命令的作用就是将当前工作区的代码回退到上一次add时所提交的代码

2. 对于已经add没有commit的代码

对于这种情况,可以考虑使用前面的reset命令,选项可以采用mixedhard都可以

这里要补充一点,reset并非必须使用commit id,也可以直接使用HEAD和^的组合:

# 这里的xxx可以是commit id,也可以直接写HEAD表示当前版本,也可以写HEAD^表示上一个或HEAD^^...
git reset [选项] xxxx

3. 对于已经commit没有push的代码

对于这种情况,直接使用HEAD^进行版本回退即可

git reset HEAD^

4. 如果进行push后的代码如何处理

此时涉及到远程仓库的概念,后面进行一些总结

删除操作

删除操作有两种:

  1. 直接使用Linux下的删除命令
rm -f [file]
git add [file]
git commit -m "xxx"
  1. 直接使用Git本身提供的删除命令
git rm [file]
git commit -m "xxx"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Git:Git的一些基本操作 的相关文章

  • 在centos上设置jenkins:ssh密钥和git的问题

    经历了很多问题 但似乎没有什么能解决我的问题 或者更准确地说 我不确定我是否正确地完成了整个事情 所以这里是 已安装centos 6 3操作系统 然后我按照以下指南安装詹金斯 https wiki jenkins ci org displa
  • 未能将一些参考推送至 [email protected]

    当我尝试推送到 Heroku 存储库时收到此错误 我已经设置了autocrlf false在gitconfig中 但这个问题仍然存在 我也尝试过这个解决方案here https stackoverflow com questions 566
  • 我在哪里? *(无分支)

    我已经熟悉了创建 合并和删除分支 我想知道我在哪里 这样我就不会将工作提交到错误的分支 我用git branch a看看我有哪些分支 我认为星号 显示我当前所在的分支 当我得到以下信息时 这意味着什么 no branch master or
  • 如何签出仅在“git ls-remote”中列出的分支?

    我遇到了无法切换到仅列出的分支的情况git ls remote 这是详细信息 我分叉了一个 github repoA 作为 repoB 创建了自己的分支并将其推送到 ComputerA 中的 repoB 在 ComputerB 中 我将分叉
  • 如何生成类似github的影响图?

    是否有一些程序 或者我错过的一些神奇的 git 插件 可以从 git 存储库获取影响图或类似的东西 而无需通过 github 就数据收集而言 我可以生成图表 我不确定从哪里开始编写自己的代码 我假设有一些标志我可以传递给 git log 来
  • 如何关闭分支而不将其从 git 的历史记录中删除?

    我想提交并关闭其分支 而不将其从历史中删除 有了水银我会commit close branch then update转到上一个 然后继续工作 有了 git 我很困惑 没有与 Git 中关闭分支完全相同的方法 因为 Git 分支比 Merc
  • git-svn 如何知道要提交到哪个分支?

    我的存储库是 SVN 我使用 git 进行所有开发 我们有一个标准布局 我用以下命令初始化了我的本地存储库git svn init s
  • SSL 适用于浏览器、wget 和curl,但不适用于 git

    我有一个网站 用于托管 redmine 和几个 git 存储库 这非常适合 http 但我无法使用 https 进行克隆 即 git clone http mysite com git test git 工作正常 但是 git clone
  • TortoiseGit - 更改默认合并消息

    系统描述 Windows 7的 git版本2 10 1 windows 1 乌龟Git 2 3 0 0 I want 合并提交消息在不同的情况下有所不同fully自动方式 no manual amend Summary 在windows上
  • Git:以新名称签出旧版本的目录

    如何以新名称查看目录的先前版本 我一直都有一个目录foo在我的仓库中 我想创建一个目录foo old在我当前的工作树中 其内容是HEAD 2 foo 我同时需要两个版本 以确保它们给出相同的结果 测试这需要相当多的代码 并且需要同时提供两个
  • 如何使用 git --word-diff 显示空格差异?

    为了说明问题 参见diff https github com nim lang Nim commit 47c7fd037ed28b7de3d120b003d059d30e18f128 diff split diff 8af935b2312d
  • http.h:6:23: 致命错误:curl/curl.h:没有该文件/目录

    我在 CentOS 7 中下载 git 包 wget https www kernel org pub software scm git git 2 0 1 tar gz tar xzf git 2 0 1 tar gz 当我编译git时
  • Git 中的数据完整性?

    我现在已经多次听到提到 Git 提供数据完整性 但是 这是什么意思 据我所知 git 中的所有对象都是使用 SHA 1 校验和来访问的 并且该校验和是根据文件的内容计算的 这意味着如果文件发生更改 您将得到不同的校验和 但这如何提供数据完整
  • Smartgit:自动插入提交消息

    有没有办法使用钩子脚本在 Smartgit 中自动插入提交消息 重击 如果用户提交了他的更改 我想预加载提交消息字段 我没有看到任何SmartGit配置 http www syntevo com smartgit documentation
  • 结帐时出现 Git 错误:“致命:引用不是树”

    当我决定弄清楚为什么我正在从事的项目如此重要时 这一切就开始了 我运行了以下脚本 git rev list objects all git cat file batch check objecttype objectname objects
  • 为什么从网上下载Git 2.0,总是得到1.9.4的安装包?

    为什么从网上下载Git 2 0 总是得到1 9 4的安装包 为什么你不能在互联网上的任何地方找到一个不仅标记为 2 0 而且你下载的安装存档也标记为这样的 Git 安装程序包 例如 这个2 1 3 站点 http git scm com d
  • 如何为单集群(独立集群)ElasticSearch 配置单节点

    我在本地计算机上安装了elasticsearch 我想将其配置为集群中唯一的一个节点 独立服务器 这意味着每当我创建新索引时 它只能用于我的服务器 它将无法被其他人的服务器访问 我当前的情况是 这些索引可供其他服务器使用 这些服务器形成在集
  • 有什么方法可以从提交的消息中获取提交的 SHA 值吗?

    当做一个git tag 我并不总是擅长记住 HEAD 6 例如 是包含的还是排他的 鉴于我的大多数提交都以问题号为前缀 我想知道是否有一些神奇的命令可以从其消息的一部分中搜索提交 SHA 我知道这很容易做到git log并从那里开始工作 但
  • 如何在 git 中将我的功能分支变基到开发分支,尽可能减少冲突?

    我的功能分支已超过大约 30 次或更多提交 与此同时 在开发分支中 其他开发人员还推出了一些其他功能 因此 每次在开发中发布新功能时 我都会被要求 将开发分支重新建立到我的功能分支上 解决冲突 如有 继续在您的功能分支中开发 问题 第二步就
  • 我如何才能看到 Github 风格的东西,例如 git -repo 的打孔卡和时间线?

    我正在寻找一个可以可视化 git repo 工作的软件 我喜欢 Github 的一些功能和 Bitbucket 的一些功能 所以我不想使用它们 因为它们并不完美 我正在寻找创建类似视觉特征的方法 下面你可以找到一些部分 但仍然缺少很多谜题

随机推荐

  • final的分析

    源自 http www cnblogs com dolphin0520 p 3736238 html 1 修饰类 当用final修饰一个类时 表明这个类不能被继承 2 修饰方法 使用final方法的原因有两个 第一个原因是把方法锁定 以防任
  • 寻找第k大元素,时间复杂度是多少?

    寻找第k大元素可以通过多种算法实现 其中时间复杂度最优的是基于快速排序的算法 称为快速选择 QuickSelect 算法 快速选择算法的基本思想是选择一个基准元素 然后将数组划分为比基准元素小和比基准元素大的两个子数组 如果第k大元素在比基
  • 关于图像的傅里叶变换的理解

    最近再学opencv关于图像的傅里叶变换的知识 自己感觉很难理解 查阅相关书籍和博客发现很多写的都比较含糊 下面是转载自知乎一个博主关于图像的傅里叶变换的通俗解释 通俗讲解 图像傅里叶变换 文末加了一点冈萨雷斯 数字图像处理 中的关于频谱中
  • Arduino for ESP8266&ESP32适用库ESPAsyncWebServer:请求与响应

    文章目录 目的 解析客户端请求 服务器进行响应 URL重定向 总结 目的 WebServer功能很多 最主要的一块就是解析来自用户的HTTP请求 然后根据功能需求将响应的消息发送给客户 这篇文章将粗略介绍ESPAsyncWebServer中
  • 组成原理---控制器

    文章目录 控制器的组成及指令的执行 基本的计算机组成和功能 控制器的组成 时序及控制方式 数据通路和指令的执行过程 简单计算机系统主机各部件的实现方案 简单计算机系统中指令的执行过程 MIPS单周期CPU的数据通路和指令的执行过程 硬布线控
  • 机器学习实战——6.支持向量机

    目录 6 1 基于最大间隔分隔数据 6 2 寻找最大间隔 6 2 1 分类器求解的优化问题 6 2 2 SVM应用的一般框架 6 3 SMO高效优化算法 6 3 1 Platt的SMO算法 6 3 2 应用简化版SMO算法处理小规模数据集
  • springboot 全局异常处理类

    目录标题 springboot 全局异常处理类 依赖 代码 springboot 全局异常处理类 依赖
  • 在CocosCreator的3.x版本中实现贝塞尔曲线

    使用环境参考 CocosCreator v3 7 3 前情提要 在之前的 2 x 版本中 CocosCreator 关于贝塞尔曲线是内置了 API 可以让节点动画直接使用 但在升级到 tween 实现后 灵活了但没有了现成的贝塞尔曲线的实现
  • 2020年高教社杯全国大学生数学建模竞赛---校园供水系统智能管理(Python代码实现)

    目录 1 概述 2 问题 3 运行结果 4 Python代码 1 概述 校园供水系统是校园公用设施的重要组成部分 学校为了保障校园供水系统的正常运行需要投入大量的人力 物力和财力 随着科学技术的发展 校园内已经普遍使用了智能水表 从而可以获
  • 用geoda软件进行空间自相关分析示例

    毕业论文需要用到空间自相关 所以摸索摸索了好久 终于弄出了大概的流程了 情景1 如果你没有shp格式的文件数据 那么我建议你下载geoda095i这个版本 因为最新版本的我不太会操作 明确问题 假如我们要对广东省各市2005人均GDP进行空
  • 算法设计与分析 期末考试试卷

    1 渐进表示法中f n O g n 意味着f n 的数量级 不大于 g n 的数量级 填 小于 大于 不小于 或 不大于 平时各种教材中见到的O n2 表达的意思是算法的复杂度 等于 n2数量级 填 小于 等于 或 大于 2 算法的正确性通
  • 【C语言】超详细的移位、位操作符详解(含力扣实战)

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 1 整数的二进制表示 2 移位操作符 2 1左移操作符 低
  • 第086讲: Pygame:碰撞检测

    今天我们来学习碰撞检测 大部分游戏都是需要做碰撞检测的 因为你需要知道小球是否发生了碰撞 子弹是否击中了目标 主角是否踩到了狗屎 那应该如何实现呢 说白了 它这个原理很简单 就是检测两个精灵之间是否存在重叠的部分 像我们上节课的小球 在图1
  • innodb_flush_method理解(图解)

    innodb flush method这个参数控制着innodb数据文件及redo log的打开 刷写模式 对于这个参数 文档上是这样描述的 有三个值 fdatasync 默认 O DSYNC O DIRECT 默认是fdatasync 调
  • wsl2 出现 Vmmem内存占用过大问题解决

    分步解决方法 定期执行缓存删除 在WSL bash上 执行 sudo crontab e u root 并添加以下行 15 sync echo 3 gt proc sys vm drop caches touch root drop cac
  • AD常用DRC规则简单介绍

    前言 最近在复习AD中画PCB板时的DRC规则 在这里做一个常用规则的简单总结 虽然有时候可以无脑将除电气规则以外的其他规则全部取消勾选 但是这样并不好 正文 Electrical Clearance Constraint 走线的线路间隔
  • Cannot construct instance of `com.baomidou.mybatisplus.core.metadata.IPage

    Feign调用无法解析 IPage包裹的数据 目前解决方案有两种 一种是转Page 另一种是序列化 一 转Page传递 api接口 PostMapping value queryEnterprise public Result
  • Mysql基础(入门)

    一 数据库介绍 1 什么是数据库 数据库就是 个存放计算机数据的仓库 这个仓库是按照 定的数据结构 数据结构是指数据的组织形式或数据之间的联系 来对数据进 组织和存储的 可以通过数据库提供的多种 法来管理其中的数据 2 数据库的种类 最常
  • cuda的Shuffle技术以及自定义双精度版本

    还是数组求和问题引起的 发现之前那个版本http blog csdn net lingerlanlan article details 24630511 对于数组的维度是有要求的 因为归约每次变为一半 所以对于线程块的数量和每个线程块线程的
  • Git:Git的一些基本操作

    文章目录 基本认识 使用方法 创建本地仓库 配置本地仓库 工作区 暂存区 版本库的概念 添加文件 版本回退 撤销修改 删除操作 基本认识 首先要对Git有一个基本的认知 Git本质上是一个版本控制器 可以对一个信息的多个版本进行一些控制 而