当前位置: 首页 > news >正文

【Git原理与使用一】Git概念与基本操作

文章目录

  • 1. Git 的概念
  • 2. Git 的安装
  • 3. Git 的认识
    • 3.1 创建本地仓库
    • 3.2 配置Git
    • 3.3 认识工作区、暂存区、版本库
  • 4. Git 的基本操作
    • 4.1、认识几个指令
      • 1)git add 添加命令
      • 2)git commit 提交命令
      • 3)git log 查看日志命令
      • 4)git cat-file 打印命令
      • 5)git status 查看状态命令
      • 6)git diff 比较差异命令
      • 7)git reset 版本回退命令
      • 8)git reflog 记录本地每次命令
      • 9)git checkout -- 恢复工作区文件命令
      • 10)git rm 删除命令
    • 4.2 添加文件
    • 4.3 修改文件
    • 4.4 再看.git
      • 总结.git中几个特殊的文件或者目录
    • 4.5 回退版本
    • 4.6 撤销修改
      • 情况1:
      • 情况2:
      • 情况3:
    • 4.7 删除文件

1. Git 的概念

**提出问题: ** 在工作或者学习时,编写各种文档中,为了防止文档丢失或者更改失误,能使失误后恢复到某个版本,就需要复制一个副本。日积月累的情况下,版本数量会不断增多,那怎么清楚每个版本修改了什么呢?

解决方案: 版本控制器。所谓的版本控制器,通俗的讲就是一个可以记录工程的每一次改动和版本迭代的一个管理系统,同时也方便多人协同作业。

目前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的文件,对于我们开发人员来说,Git 最重要的就是可以帮助我们管理软件开发项目中的源代码文件

注意事项:

所有的版本控制系统,包括Git ,只能跟踪文本文件的动,比如 TXT 文件,网页,所有的程序代码等等。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词 “Windows”。

而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,具体修改的内容无从知道。

2. Git 的安装

对于Linux环境下:

1)centos安装 Git并查看版本验证是否安装成功

sudo  yum install -y git
git --version

2)ubuntu安装Git并查看版本验证是否安装成功

sudo apt install -y git
git --version

对于Windows环境下,进入Git官网进行下载安装包:Git - Downloads

更多安装步骤可以参考这篇mukes大佬mukes-CSDN博客的博客:Git 详细安装教程(详解 Git 安装过程的每一个步骤)_git安装-CSDN博客

3. Git 的认识

下面将在centos7环境下进行Git操作指令的使用和讲解:

3.1 创建本地仓库

仓库是进行版本控制的一个文件目录,要想对文件进行版本控制,就必须先创建一个仓库出来。创建一个 Git 本地仓库对应的命令如下:

git init

创建仓库

创建完成后会发现当前目录下多一个.git隐藏文件,该文件是用来追踪管理仓库的,不能手动修改这个目录文件,否则容易破坏仓库用tree .git查看目录结构,文件只有存入.git后才能被Git管理

目录结构

3.2 配置Git

该配置是设置你的 用户名称 和 e-mail 地址,这是关乎仓库操作的重要环节。配置指令如下,其中–global 是一个可选项,使用这个选项表示该机器全部Git仓库都用此配置

# 把 Name 改成自己的昵称
# 把 email@example.com 改成邮箱的格式,只要格式正确即可
# 在配置时可以直接配置成自己的昵称和邮箱
git config --global user.name "Name"
git config --global user.email "email@example.com"

使用查看命令查看是否配置成功:

git config -l

如果需要进行删除或修改配置,可以用以下命令完成:

注意:如果使用了–global配置,则删除时也要使用该选项,否则无法删除

git config --global --unset user.name
git config --global --unset user.email

配置

3.3 认识工作区、暂存区、版本库

工作区: 是在电脑上你要写代码或文件的目录。
暂存区: 英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,我们把暂存区有时也叫作索引(index)。
版本库: 又名仓库,英文名 repository 。工作区有一个隐藏目录 .git ,它不算工作区,而是 Git 的版本库。这个版本库里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

在当前目录下,新建文件后进行任何操作前,他们之间的关系如下:

关系

因此,通过新建或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。必须要通过使用 git add 和 git commit 命令才能将文件添加到仓库中进行管理!

4. Git 的基本操作

4.1、认识几个指令

首先,先认识几个命令的具体内容,然后再对指令组合进行各类操作:

1)git add 添加命令

将工作区中的文件添加到暂存区(stage/index)中,空目录是执行不了操作的

git add [file1] [file2] ...  # 添加一个或多个文件到暂存区
git add [dir]  # 添加指定目录到暂存区,包括子目录
git add .  # 添加当前目录下的所有文件改动到暂存区

2)git commit 提交命令

将暂存区中文件提交到本地仓库中,一般会带上 -m 选项,这样后面就可以跟上 message 进行描述本次提交文件的细节,方便记录版本改动情况

git commit -m "message"  # 提交暂存区全部内容到本地仓库中
git commit [file1] [file2] ... -m "message"  #提交暂存区的指定文件到仓库区

3)git log 查看日志命令

可以查看从最近到最远的提交日志,并且可以看到我们 commit 时的日志消息。

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数简化,–decorate则是可以看到head的指向信息

git log --pretty=oneline --decorate

4)git cat-file 打印命令

对于git log中出现的一长串字符就是对象,可以用该进行查看对象,选择 -p 选项可以更加简洁显示出来,

其中, tree对象记录了当前提交对应的项目根目录结构,包括文件和子目录的信息;每个文件对应一个blob对象(存储文件内容),子目录则对应另一个tree对象(递归描述目录结构);通过这个 tree 对象,Git 可以完整重建提交时的目录和文件状态。

parent对象 则是上一次提交的对象

git cat-file -p HEAD

5)git status 查看状态命令

查看上一次提交到现在是否对文件进行过修改

git status

6)git diff 比较差异命令

查看暂存区和工作区文件的差异,显示的格式是Unix通用的diff格式。也可以使用 git diff HEAD – [file] 命令来查看版本库和工作区文件的区别。

git add file

7)git reset 版本回退命令

用于回退版本,可以指定退回某一次提交的版本。“回退”本质是要将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定:

–mixed 为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。

–soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本

–hard 参数将暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前一定要慎重

git reset [--soft | --mixed | --hard] [HEAD]

在上面对test进行了修改,第一次输入git,第二次再输入git2,现在以表格形式说明应该用什么选项进行回退。

说明工作区暂存区版本库操作选项
当前版本git,git2git,git2git,git2
回退版本库git,git2git,git2git–soft
回退暂存区git,git2gitgit–mixed(默认选项)
回退工作区gitgitgit–hard(慎用)

HEAD说明:
1)可直接写成 commit id,表示指定退回的版本

2)HEAD 进行选择

​ HEAD 表示当前版本
​ HEAD^ 上一个版本
​ HEAD^^ 上上一个版本
​ 以此类推…
3)可以使用 ~数字表示:
​ HEAD~0 表示当前版本
​ HEAD~1 上一个版本
​ HEAD^2 上上一个版本
​ 以此类推…

8)git reflog 记录本地每次命令

该命令可以记录本地操作中的每一次命令,从而可以查询各种命令的id,该id是commit id的一部分,比较短的,但和objects的对象id是相等的

git reflog

9)git checkout – 恢复工作区文件命令

将工作区的指定文件恢复到最近一次提交的状态(丢弃未提交的修改),如果文件已添加到暂存区,则不会影响暂存区内容,仅覆盖工作区

git checkout -- [file]

10)git rm 删除命令

用于从版本控制中删除文件的命令,它会同时从 Git 仓库(暂存区)和工作目录中移除文件

git rm [file]

4.2 添加文件

通过以下 git add 和 git commit 2个命令就可以将工作区的文件添加进本地仓库了

注意:一方面一定是先将工作区的文件添加到暂存区,然后再从暂存区添加进仓库;另一方面,在Git中,空目录不会被追踪,因此创建空目录进行2个命令操作,Git也会提示nothing to commit

git add . 
git commit -m "add file"

添加

使用 git log可以 查看提交记录

git log

查看log

4.3 修改文件

首先先对test文件添加多一行,接着可以先使用 git status 查看在上次提交之后是否有对文件进行过修改

修改文件

上面告诉我们存在修改,但不知道哪些被修改的,因此可以使用 git diff test 命令进行对比

对比

之后就是进行添加文件操作,完成修改。需要注意的是,进行git add 后,就看不到 no changes added to commit (use “git add” and/or “git commit -a”) 的消息了,接下来继续 git commit 即可

修改

4.4 再看.git

3个区对应的.git文件如下图所示:

结构

而我们知道 git log 可以看到提交信息,那么是否检验这些信息能够对应到.git的信息呢?

日志

首先查看HEAD的指向,可以发现指向refs/heads/master,继续打印master的内容会出现一串字符,通过对比发现就是最新一次提交的字符串信息,而这个字符串其实就是对象,即objects存放的内容

这个对象是一个SHA1计算出来的非常大的数字,用十六进制表示;前面2位是目录名称,后面38位是文件名称

对象

对象是经过安全哈希算法加密的,因此此时要用 git cat-file 命令操作进行查看,会显示tree、parent、提交的user和email,以及最新一次提交的信息。

最新提交

其中,parent对象可以通过对比发现是上一次提交的对象,而tree对象是什么呢?继续用 git cat-file 命令操作进行查看

当前提交对应的项目根目录结构

通过对比发现,tree对象其实就是当前提交对应的项目根目录结构

继续打印test对应的对象,就可以显示该文件最新的内容

内容

总结.git中几个特殊的文件或者目录

1)index:暂存区, git add 后会更新该内容。

2)HEAD:默认指向 master 分支的一个指针。

3)refs/heads/master: 文件里保存当前 master 分支的最新commit id 。

4)objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。

4.5 回退版本

用 --hard 选项进行演示,直接回退到第一次提交,用 git reset --hard [commit id] 完成回退,log也随之改变

回退1

这时如果后悔了怎么办?也可以继续用这个 git reset --hard [commit id] 指令,在commit id中写上最后一次的id就可以完成回退

撤销回退

那如果忘记了这个commit id要怎么办?这时就可以使用 git reflog查看,这时就可以查找较短的commit id,也就可以进行版本回退了。首先先回退到第一个版本,然后查询id,最后进行回退

查看本地指令log

为什么回退速度这么快?

因为 Git 在内部有个指向当前分支(此处是master)的HEAD 指针, refs/heads/master 文件里保存当前 master 分支的最新commit id 。当我们在回退版本的时候,Git 仅仅是给refs/heads/master 中存储一个特定的version,所以速度会很快

指针指向

4.6 撤销修改

撤销的目的就是不影响远程仓库的代码。如果我们在我们的工作区写了很长时间代码,越写越写不下去,觉得自己写的实在是垃圾,想恢复到上一个版本。他们的基本场景有以下几项:

初始情况说明工作区暂存区版本库操作说明
情况1:只在工作区中进行增加、修改、删除操作,未进行addadd code1、手动修改撤销,容易出错;2、推荐用 git checkout – test指令
情况2:添加到暂存区中未进行commit操作add codeadd code1、git reset --hard test;2、先git reset test,然后用git checkout – test
情况3:已经commit但未进行push操作add codeadd codeadd codegit reset --hard HEAD^

情况1:

1

情况2:

2

情况3:

3

4.7 删除文件

1)先在工作区用rm删除文件,在进行add和commit操作,完成删除,因此使用的Git版本是2.0以下,所以删除操作要带上-A记录全部操作的选项
删除1
2)使用git rm命令删除文件,然后直接commit就可以完成删除了
删除2

在学完 Git 操作之后,就进入下一个板块内容:Git 的分支管理:Git 的分支管理,欢迎大家继续阅读!

相关文章:

【Git原理与使用一】Git概念与基本操作

文章目录 1. Git 的概念2. Git 的安装3. Git 的认识3.1 创建本地仓库3.2 配置Git3.3 认识工作区、暂存区、版本库 4. Git 的基本操作4.1、认识几个指令1)git add 添加命令2)git commit 提交命令3)git log 查看日志命令4)git cat-f…...

kettle工具使用从入门到精通(一)

安装 可以从链接: 官网(下载链接在Pentaho.pdf文件里)或者网络上查找对应的版本安装 Kettle (PDI) 版本与 JDK 版本对应关系 Kettle (PDI) 版本支持的 JDK 版本备注PDI 9.x 及以上JDK 11 或更高版本推荐使用 OpenJDK 或 Oracle JDK 11。PDI 8.xJDK 8 …...

Java 实现 Oracle 的 MONTHS_BETWEEN 函数

介绍 因为系统迁移, 有一些函数要转成 Java 版本, Oracle 的 官方介绍 - MONTHS_BETWEEN MONTHS_BETWEEN returns number of months between dates date1 and date2. The month and the last day of the month are defined by the parameter NLS_CALENDAR. If date1 is late…...

windows下使用msys2编译ffmpeg

三种方法: 1、在msys2中使用gcc编译 2、在msys2中使用visual studio编译(有环境变量) 3、在msys2中使用visual studio编译(无环境变量) 我的环境: 1、msys2-x86_64-20250221 2、vs2015 3、ffmpeg-7.1…...

Vivado常用的时序约束方法

1,create_clock :创建时钟约束 create_clock -period 20.000 -name sys_clk [get_ports sys_clk 该约束含义是创建一个时钟周期20ns的时钟,时钟名字为sys_clk。注意:如果是差分时钟,只需要约束差分时钟的P端,N端不用约束。 2,set_clock_uncertainty:设置时钟不确定性 s…...

力扣HOT100之哈希:1. 两数之和

这道题之前刷代码随想录的时候已经刷过好几遍了&#xff0c;看到就直接秒了。这道题主要是通过unordered_map<int, int>来建立哈希表&#xff0c;其中键用来保存向量中的元素&#xff0c;而对应的值则为元素的下标。遍历整个向量&#xff0c;当遍历到nums[i]时&#xff0…...

如何在rust中解析 windows 的 lnk文件(快捷方式)

一、从标题二开始看&#x1f601; 这些天在使用rust写一个pc端应用程序&#xff0c;需要解析lnk文件获取lnk的图标以及原程序地址&#xff0c;之前并没有过pc端应用程序开发的经验&#xff0c; 所以在广大的互联网上游荡了两天。额&#x1f97a; 今天找到了这个库 lnk_parse很…...

豆包大模型 MarsCode AI 刷题专栏 001

001.找单独的数 难度&#xff1a;易 问题描述 在一个班级中&#xff0c;每位同学都拿到了一张卡片&#xff0c;上面有一个整数。有趣的是&#xff0c;除了一个数字之外&#xff0c;所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上…...

python语言总结(持续更新)

本文主要是总结各函数&#xff0c;简单的函数不会给予示例&#xff0c;如果在平日遇到一些新类型将会添加 基础知识 输入与输出 print([要输出的内容])输出函数 input([提示内容]如果输入提示内容会在交互界面显示&#xff0c;用以提示用户)输入函数 注释 # 单行注释符&…...

leetcode15 三数之和

1.哈希法 为了避免重复 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {set<vector<int>> temple;//使用 set 来存储符合条件的三元组&#xff0c;避免重复vector<vector<int>> out;//存放最终输…...

深入探讨AI-Ops架构 第一讲 - 运维的进化历程以及未来发展趋势

首先&#xff0c;让我们一起回顾运维的进化之路&#xff0c;然后再深入探讨AI-Ops架构的细节。 运维的进化历程 1. AI 大范围普及前的运维状态 (传统运维) 在AI技术尚未广泛渗透到运维领域之前&#xff0c;我们称之为传统运维&#xff0c;其主要特点是&#xff1a; 人工驱动…...

Android Native 之 文件系统挂载

一、文件系统挂载流程概述 二、文件系统挂载流程细节 1、Init启动阶段 众所周知&#xff0c;init进程为android系统的第一个进程&#xff0c;也是native世界的开端&#xff0c;要想让整个android世界能够稳定的运行&#xff0c;文件系统的创建和初始化是必不可少的&#xff…...

常用word python matlab快捷键

这里写自定义目录标题 WordMatlabpythonlinuxWord Matlab 1 结构体 字符串成员做索引,必须()类似python* 解包作用,转化字符串到属性类型 如果属性名存入列表 a = [“para1”] 比如stru1.para1 = [‘c’,‘d’]; 那么若要用a中para1来索引,必须要加圆括号; ==》 X Strut…...

MySQL------存储引擎和用户和授权

9.存储引擎 1.两种引擎 MyISAM和InnoDB 2.两种区别 1.事务&#xff1a; MyISAM不支持事务 2.存储文件: innodb : frm、ibd MyISAM: frm、MYD、MYI 3.数据行锁定: MyISAM不支持 4.全文索引: INNODB不支持&#xff0c;所以MYISAM做select操作速度很快 5.外键约束: MyISAM…...

react拖曳组件react-dnd的简单封装使用

分享原因 由于项目中需要使用拖曳组件(需求:全局&#xff0c;跨组件&#xff0c;跨数据)&#xff0c;我选择了react-dnd 概念 React DnD 是一组 React 高阶组件&#xff0c;我们在使用的时候只需要将目标元素进行包裹&#xff0c;就可以实现目标元素具有拖动或接受拖动的功能。…...

Excel中COUNTIF用法解析

COUNTIF 是 Excel 中一个非常实用的函数&#xff0c;用于统计满足某个条件的单元格数量。它的基本语法如下&#xff1a; 基本语法 COUNTIF(范围, 条件) 范围&#xff1a;需要统计的单元格区域&#xff0c;例如 A1:A10 或整列 A:A。 条件&#xff1a;用于判断哪些单元格需要被…...

Uniapp 页面返回不刷新?两种方法防止 onShow 触发多次请求!

目录 前言1. 变量&#xff08;不生效&#xff09;2. 延迟&#xff08;生效&#xff09; 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 在 Uniapp 中&#xff0c;使用 onShow() 钩子来监听页面显示&#xff0…...

《论数据湖技术及其应用》审题技巧 - 系统架构设计师

论题写作框架 一、考点概述 “数据湖技术及其应用”这一论题主要考察的是软件测试工程师对于前沿数据存储与处理技术的理解及其在软件开发项目中的实际应用能力。具体而言&#xff0c;该论题涵盖了以下几个核心考点&#xff1a; 软件项目管理与开发经验 &#xff1a;要求考生…...

C++蓝桥杯基础篇(八)

片头 嗨~小伙伴们&#xff0c;大家好&#xff01;今天我们一起来学习C蓝桥杯基础篇&#xff08;八&#xff09;&#xff0c;练习相关字符串的习题&#xff0c;准备好了吗&#xff1f;Are you ready? Lets go! 第1题 字符串中的数字个数 这道题&#xff0c;我们用字符数组或者…...

AI 实战 - pytorch框架基于retinaface实现face检测

pytorch框架基于retinaface实现face检测 简介模型结构MobileNet-0.25SSH结构Head结构 Anchor编解码 环境开发环境 数据简介 训练测试参考 简介 RetinaFace是在RetinaNet基础上引申出来的人脸检测框架&#xff0c;所以大致结构和RetinaNet非常像。 主要改进&#xff1a;1.Mobi…...

如何在PHP中实现API版本管理:保持向后兼容性

如何在PHP中实现API版本管理&#xff1a;保持向后兼容性 在现代Web开发中&#xff0c;API&#xff08;应用程序编程接口&#xff09;是连接前端和后端的关键桥梁。随着业务需求的不断变化&#xff0c;API的版本管理变得尤为重要。良好的版本管理策略不仅能够确保新功能的顺利引…...

Docker Compose企业示例

利用容器编排完成haproxy和nginx负载均衡架构实施 1.mkdir docker.test 2.touch haproxy.yml 3.mkdir /var/lib/docker/volumes/conf 4.dnf install haproxy -y --downloadonly --downloaddir/xixi&#xff1a;下载内容到/xixi目录下 5. rpm2cpio haproxy-2.4.22-4.el9.x8…...

TMS320F28P550SJ9学习笔记6:SCI所有寄存器__结构体寄存器方式配置 SCI通信初始化__库函数发送测试

继续学习如何使用结构体寄存器的方式配置这款单片机的外设&#xff0c;这里配置SCI通信的初始化 但SCI gpio 的初始化还是调用的库函数比较方便&#xff0c;它的发送部分页调用了库函数 有关收发方面的逻辑&#xff0c;我会在之后重新自己写一次 文章提供测试代码讲解、完整…...

详细探索如何用脚本实现M小ySQL一键安装与配置,提升运维效率!

以下是基于脚本实现MySQL一键安装与配置的详细方案&#xff0c;涵盖Linux主流系统&#xff08;CentOS/Ubuntu&#xff09;及Windows环境&#xff0c;结合自动化部署与高可用性扩展&#xff0c;旨在提升运维效率&#xff1a; 一、Linux系统&#xff08;CentOS 7.x&#xff09;一…...

无人机推流/RTMP视频推拉流:EasyDSS无法卸载软件的原因及解决方法

视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可将上传的点播…...

增删改查 数据下载 一键编辑 删除

index 首页 <template><div class"box"><el-card :style"{ width: treeButton ? 19.5% : 35px, position: relative, transition: 1s }"><el-tree v-if"treeButton" :data"treeData" :props"defaultPro…...

【Go学习实战】03-2-博客查询及登录

【Go学习实战】03-2-博客查询及登录 读取数据库数据初始化数据库首页真实数据分类查询分类查询测试 文章查询文章查询测试 分类文章列表测试 登录功能登录页面登录接口获取json参数登录失败测试 md5加密jwt工具 登录成功测试 文章详情测试 读取数据库数据 因为我们之前的数据都…...

回溯算法(C/C++)

目录 一、组合问题 组合 组合剪枝 组合总和 III​编辑 组合总和​编辑 组合总和 II 电话号码的字母组合​编辑 二、分割问题 分割回文串 复原 IP 地址 三、集合问题 子集 子集 II 非递减子序列 四、排列问题 全排列 全排列 II 五、棋盘问题 N 皇后 课程&#x…...

物联网智慧农业一体化解决方案-可继续扩展更多使用场景

在智慧农业中,从种子、施肥、灌溉、锄地、农具管理、日常照料到蔬菜档案管理,以及与客户、供应商、市场的对接,可以通过物联网(IoT)、大数据、人工智能(AI)、区块链和云计算等技术,构建一个从生产到销售的全流程数字化、智能化农业生态系统。以下是实现方案和技术路径的…...

Jackson 详解

目录 前言 Jackson 是 Java 生态中最流行的 JSON 处理库之一&#xff0c;广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能&#xff0c;支持注解、模块化设计和多种数据格式&#xff08;如 XML、YAML&#xff09;。本文将详细介…...