Git的原理与使用(一):Git的基本操作(包含:版本回退)

Git原理与使用一

  • 一.Git的初识与安装
    • 1.什么是Git
    • 2.如何安装Git
      • 1.git命令与git help(Git下的"man手册")
      • 2.centos下安装Git
      • 3.ubantu下安装Git
  • 二.Git的前置操作与前置知识
    • 1.创建Git本地仓库
    • 2.配置Git
    • 3.理解Git的分区
      • 1.工作区
      • 2.暂存区
      • 3.版本库
      • 4.分区关系总结
  • 三.添加文件
    • 1.git add
    • 2.git commit
    • 3.git log查看历史提交记录
    • 4.git log --pretty=oneline
  • 四.初步认识.git目录
    • 1.初步介绍
    • 2.HEAD跟master分支
    • 3.object和commit id
    • 4.总结
  • 五.git diff查看修改
  • 六.版本回退
    • 1.git reset
    • 2.演示
      • 1.--soft
      • 2.--mixed
      • 3.--hard
      • 4.版本回退的实质
      • 5.版本回退中的后悔药
  • 七.撤销修改
    • 1.未add
    • 2.已经add,还未commit
    • 3.已经commit了,但是还没有push
    • 4.已经push了
  • 八.删除文件
    • 1.能否直接rm呢?
    • 2.误删
    • 3.的确要删除

一.Git的初识与安装

1.什么是Git

Git是一个版本控制器
在这里插入图片描述
在这里我们重点介绍Linux操作系统下的Git的使用
因为在未来的开发过程中Linux操作系统的使用更为频繁
而且Git最初就是在Linux操作系统下面开发的

2.如何安装Git

1.git命令与git help(Git下的"man手册")

首先我们可以使用git命令来查看我们有没有安装Git

git
如果结果中有:
command not found:说明我们还没有安装Git

如果结果是这样的
在这里插入图片描述
说明我们已经安装过Git了
在这里我们可以使用

git help Git下的具体命令/概念

来查看对应命令/概念的使用文档
在这里插入图片描述
跟man手册类似,按q键退出

2.centos下安装Git

安装git命令:
sudo yum install -y git
查看git安装的版本:
git --version

在这里插入图片描述
在这里插入图片描述

3.ubantu下安装Git

安装git命令:
sudo apt-get install -y git
查看git安装的版本:
git --version

二.Git的前置操作与前置知识

我们要想对文件进行版本控制
就必须先创建出一个仓库出来

仓库:进行版本控制的一个文件目录

1.创建Git本地仓库

在这里插入图片描述
我们目前在gitblog目录下面,我们想在这个目录下面创建一个git的本地仓库
使用命令:

git init

在这里插入图片描述
这个.git目录是Git用来跟踪管理仓库的,不要手动修改这个目录里面的文件,如果改乱了,那么就把Git仓库给破坏了

关于Git仓库里面有很多细节,大家感兴趣的话可以看一看

tree .git

在这里插入图片描述
这里面的一部分属性我们以后都会介绍的

我们在以后的操作当中为了方便理解
也经常会去这样看这个Git仓库

2.配置Git

当我们安装完Git之后首先要做的事情就是
设置用户名称和email地址
如何进行配置呢?

git config user.name "用户名称"
git config user.email "email地址"还有一个选项:--global:
git config --global user.name "用户名称"
git config --global user.email "email地址"这个--global的意思就是:如果加上这个--global
那么就表示这台机器上的所有的Git仓库都会使用这个配置.如果你希望在不同仓库中使用不同的用户名或email地址
那么可以不加这个选项

查看配置:

git config -l

删除配置:

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

在这里插入图片描述
下面我在去配置一个用户名和email
这次我配置一个不带–global选项的
在这里插入图片描述
在这里插入图片描述
如何进行配置,如何查看配置,如何删除配置都给大家介绍完毕了
大家可以自行配置

3.理解Git的分区

1.工作区

工作区就是我们写代码或者文件的目录
也就是我们目前所处的

/home/wzs/wzsblog/gitblog

这个路径下(也就是包含.git的这个目录)
注意:
即使.git的确也是在gitblog这个目录下面
但是.git并不属于工作区!!!

平常我们在工作区中写代码(之所以被称为工作区也是这个原因)
写完之后如果想要将该文件交由Git来管理的话
就需要执行git add命令将该文件添加到暂存区

2.暂存区

暂存区也可以被称为索引区
一般是存放在.git目录下的index文件中

之所以被称为暂存区是因为只有当执行git commit命令之后,才能将暂存区中的文件添加到版本库中,才能让Git来管理这个文件!!

之所以被称为索引区,是因为暂存区其实存放的不是文件本身,而是文件的索引

这一点我们后续会详细介绍的,大家目前先知道这一点即可

当我们对于工作区修改或者新增的文件执行git add命令之后
就会更新暂存区中的文件索引

3.版本库

版本库其实就是这个隐藏文件.git
这个版本库里面的所有文件都会被Git管理起来
每一个文件的修改,删除都会被Git跟踪记录到
以便于我们任何时刻都可以追踪历史或者"还原"(也就是版本回退,这一点我们以后会介绍的)

4.分区关系总结

在这里插入图片描述
关于git add和git commit命令我们下面就会进行介绍

三.添加文件

下面我们通过一个场景来介绍git add和git commit的使用方法

场景:
我们想要在工作区创建一个test.txt文件
然后通过git add和git commit来将这个文件交由Git管理
这是我创建的一个test.txt文件
在这里插入图片描述
这里为了方便,使用了echo与重定向新建test.txt并向其中写入
hello git
在这里插入图片描述

1.git add

在这里插入图片描述
下面我们就选择第一种来演示一下吧
其他的大家感兴趣的话也可以试试

这里介绍一个命令:

git status
这个命令可以查看当前git仓库的状态
他会提示我们接下来的操作

在这里插入图片描述
它提示我们接下来要进行git commit操作

2.git commit

在这里插入图片描述
下面我们来演示一下
在这里插入图片描述

3.git log查看历史提交记录

截至目前,我们成功将test.txt文件提交到本地仓库交由Git管理了
但是随着我们写的代码越来越多,要维护的文件也越来越多
我们难免会遗忘很多信息

因此git log就派上用场了

git log

可以用来查看历史提交记录
在这里插入图片描述
可是当我们提交的文件变多了呢?
比方说我现在又创建并提交了3个文件
在这里插入图片描述
然后git log
在这里插入图片描述

注意:git log命令是现实最近到最远的提交日志

这才仅仅是进行了2次提交,如果未来我们要进行几十次,几百次提交呢?
那git log就太不"善解人意"了吧…

4.git log --pretty=oneline

有没有一种简易的方法呢?

git log --pretty=oneline

在这里插入图片描述
此时只会显示commit id和我们写的提交信息
而且每一次的提交信息只占行

四.初步认识.git目录

目前我们向本地仓库添加完文件了
下面我们再去

tree .git

看一下.git的目录结构
来初步认识一下.git中到底有什么

1.初步介绍

在这里插入图片描述

2.HEAD跟master分支

下面我们就来看一下
这个HEAD存放的是什么?master存放的是什么?
在这里插入图片描述

3.object和commit id

下面我们来看一下这个object存放的是什么
在这里插入图片描述
我们就查看这个最近的一次提交吧
commit id是:76ba3c583103ad526fb5cd5281a539eac782dc49

git cat-file 76ba3c583103ad526fb5cd5281a539eac782dc49

在这里插入图片描述
在这里我们只介绍-p选项
其他选项大家感兴趣的话可以试一下
在这里插入图片描述
在这里插入图片描述
至此,大家只需要知道:

tree的commit id 保存的是当前提交和当前提交之前的所有提交的commit idparent的commit id保存的是上一次提交时产生的commit id其中,我们git log显示的都是parent的commit id
如果我们想要查看具体某个文件的修改
先查看git log显示的那一次提交的commit id的内容
然后tree 
然后就能看到具体的文件的commit id了
然后就可以使用具体文件的commit id来查看对应文件的修改了

4.总结

在这里插入图片描述
后面在学习的过程中
大家最好能够将常见的git操作跟.git目录的结构内容的变化相对应起来
这样有助于我们理解git的细节流程

五.git diff查看修改

我们可以看出,上面那种查看修改的方法实在是有些麻烦
难道就没有什么更好的方法能让我们查看修改吗?
当然有啦

首先我们先对test.txt进行一次修改吧
在这里插入图片描述
我们使用追加重定向新增了两行内容
此时,本地仓库中的test.txt文件跟我们工作区的test.txt文件就不同了
我们也可以使用

git status

来查看在我们上一次提交之后有没有对文件进行再次修改
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时因为我们既没有add,更别提commit了
因此当前暂存区和版本库(本地仓库)中的内容是一样的
所以此时
git diff 和 git diff HEAD显示的结果是一样的
在这里插入图片描述
下面我们git add
让工作区和暂存区的内容一致
在这里插入图片描述
此时git diff就和git diff HEAD的结果不一致了
然后下面我在git commit
在这里插入图片描述
在这里插入图片描述
此时工作区的文件就跟暂存区和版本库中的文件没有任何差异了

六.版本回退

之前我们也提到过,Git 能够管理⽂件的历史版本,这也是版本控制器重要的能⼒
如果有⼀天你发现之前的代码出现了很⼤的问题,需要在某个特定的历史版本重新开始.
这个时候,就需要版本回退的功能了

1.git reset

在这里插入图片描述
关于具体的
–soft --mixed --hard这三个选项,大家可以看这个表格
在这里插入图片描述
下面我们修改test1.txt这个文件
并且进行add 和 commit操作来让暂存区和版本库的内容都更新为
test1
在这里插入图片描述
在这里插入图片描述
准备工作已经做好了

我们规定:
这三个选项的所有初始状态都是当前状态(初始版本都是当前版本)
都要回退到test1.txt的内容是test1.txt的那个版本
在这里插入图片描述
也就是这一个版本

2.演示

1.–soft

在这里插入图片描述
下面我们再使用git diff来看一下是否真的只有版本库被回退了
在这里插入图片描述
可见–soft的确是只会回退版本库
而不会回退暂存区和工作区
然后我们commit调整为我们规定好的初始状态
在这里插入图片描述

2.–mixed

下面我们用–mixed来回退
在这里插入图片描述
然后我们add commit调整为我们规定好的初始状态
在这里插入图片描述

3.–hard

下面我们用–hard来回退
在这里插入图片描述

4.版本回退的实质

在这里插入图片描述

5.版本回退中的后悔药

可是如果我不小心用–hard之后后悔了怎么办?
现实生活中很多时候是没有后悔药可吃的
但是git给了我们一次机会
我们可以使用

git reflog
这个命令是用来记录本地的每一次命令的
我们可以找到我们进行版本回退前的那个版本
然后我们就可以再次使用git reset回退到那个版本
就相当于吃了后悔药了

刚才演示完–hard之后,我后悔了
我要吃后悔药
下面给大家演示一下,顺便证明一下版本回退的实质
在这里插入图片描述
此时master里面存放的的确是我们之前规定好要回退到的那个版本
下面我们使用git reflog
在这里插入图片描述
可见Linux不仅仅是一种操作系统,它也是一种哲学,一种艺术啊
在这里插入图片描述
此时,回退成功
后悔药生效了
在这里插入图片描述
而且此时master分支当中存放的版本也改变了
这也证实了版本回退的实质

七.撤销修改

如果我们在我们的⼯作区写了很⻓时间代码,越写越写不下去,觉得⾃⼰写的实在是垃圾,想恢复到上⼀个版本
此时怎么办呢?
在这里插入图片描述
下面我们分为三种情况来介绍
我们这次对test2.txt进行操作
先修改test2.txt的内容
在这里插入图片描述

1.未add

直接执行

git checkout -- test2.txt

丢弃工作区的修改即可
在这里插入图片描述
成功撤销之前的修改
然后我们恢复成刚才的样子,并进行add为下面做准备
在这里插入图片描述

2.已经add,还未commit

此时我们先进行暂存区的版本回退
使用–mixed选项

git reset --mixed HEAD

在这里插入图片描述
通过版本回退将暂存区回退了之后,下面我们只需要回退工作区即可

git checkout -- test2.txt

在这里插入图片描述
回退成功
然后继续为下面做好准备
在这里插入图片描述

3.已经commit了,但是还没有push

下面会说明什么是push的
此时我们就要用

git reset --hard HEAD^
这里为什么是HEAD^呢
因为我们commit之后把版本库的HEAD指针更新了
所以要回退到上一次HEAD指向的版本

在这里插入图片描述
其实跟直接版本回退的情况是一样的

4.已经push了

注意:只有commit之后才可以push
在这里插入图片描述

八.删除文件

注意,在Git中不仅新建文件是修改操作
删除文件也是修改操作
下面我们要删除test2.txt

1.能否直接rm呢?

我们来演示一下:
在这里插入图片描述

2.误删

git checkout -- test2.txt

在这里插入图片描述
成功恢复

3.的确要删除

git rm test2.txt
git commit -m "提交信息"

在这里插入图片描述
在这里插入图片描述
成功删除

以上就是Git的原理与使用(一):Git的基本操作跟版本回退到的全部内容,希望能对大家有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/174946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot启动Table ‘xxx‘ already exists

jpa.generate-ddl和jpa.hibernate.ddl-auto都可以控制是否执行datasource.schema脚本,来初始化数据库结构,只要有一个为可执行状态就会执行,比如jpa.generate-ddl:true或jpa.generate-ddl:update,并没有相互制约上下级的关系。 要…

Android修行手册 - 使用ViewPager2实现画廊效果

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…

小航助学题库蓝桥杯题库stem选拔赛(22年3月)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSDN博客 需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSD…

解决ansible批量加入新IP涉及known_hosts报错的问题

我们把一批新的IP加入到ansible的hosts文件,比如/etc/ansible/hosts,往往会有这样的提示, 因为本机的~/.ssh/known_hosts文件中并有fingerprint key串,使用ssh连接目标主机时,一般会提示是否将key字符串加入到~/.ssh/…

如何使用内网穿透将Tomcat网页发布到公共互联网上【内网穿透】

文章目录 前言1.本地Tomcat网页搭建1.1 Tomcat安装1.2 配置环境变量1.3 环境配置1.4 Tomcat运行测试1.5 Cpolar安装和注册 2.本地网页发布2.1.Cpolar云端设置2.2 Cpolar本地设置 3.公网访问测试4.结语 前言 Tomcat作为一个轻量级的服务器,不仅名字很有趣&#xff0…

中国北斗:守护萨雷兹湖一方安澜

中国北斗:守护萨雷兹湖一方安澜 在第三届“一带一路”国际合作高峰论坛数字经济高级别论坛上,由中国经济信息社、国家发展改革委高技术司、国家数据局联合编制的《数字“慧”就发展之路》中英文图文集正式发布,展现了中国与共建“一带一路”国…

PHP中关于func_get_args()方法

首先呢这个函数出现的是比较早的,大致应该是PHP4出现的, func_get_args — 返回一个包含函数参数列表的数组 说明 func_get_args(): array 获取函数参数列表的数组。 该函数可以配合 func_get_arg() 和 func_num_args() 一起使用,从而使得用户自定义函数可以接…

如何将mobi、awz3、epub格式转化为pdf

偶然之间有个需求就是网上下载了一些书籍的格式没法打开看,或者是想把kindle的书籍转换成pdf 那么经过一番折腾找到了两个可以用的工具站分享给大家,有需要的可是尝试下,小编这边测试了可以用,就是下载的时候慢的一匹。。。 第一…

PHP 双门双向门禁控制板实时监控源码

本示例使用设备&#xff1a; 实时网络双门双向门禁控制板可二次编程控制网络继电器远程开关-淘宝网 (taobao.com) <?PHPheader("content-type:text/html;charsetGBK");$ThisIpget_local_ip(); //获取电脑IP地址 $server udp://.$ThisIp.:39192; $sock…

MATLAB中fft与fftshift的区别

两者的区别在于&#xff1a; fft函数将时域信号转换为频域信号&#xff0c;即将信号从时间域转换为频率域。fftshift函数用于对fft计算结果进行移位操作&#xff0c;将频域信号的零频率分量移到频谱的中心&#xff0c;方便观察和处理。fftshift函数将fft计 算结果沿着中心点进…

MySQL--InnoDB引擎

InnoDB引擎 逻辑存储引擎 表空间→段→区→页→行 Tablespace 表空间&#xff08;ibd文件&#xff09;&#xff1a;一个mysql实例可以对应多个表空间&#xff0c;用于存储记录、索引等数据Segment 段&#xff1a;段分为数据段、索引段、回滚段&#xff0c;InnoDB是索引组织表…

【Unity程序技巧】加入缓存池存储地图资源,节省资源,避免多次CG

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

Python语言学习笔记之二(基础语法)

本课程对于有其它语言基础的开发人员可以参考和学习&#xff0c;同时也是记录下来&#xff0c;为个人学习使用&#xff0c;文档中有此不当之处&#xff0c;请谅解。 Python几种字符串的表示&#xff1a; 在Python中&#xff0c;字符串是一种基本的数据类型&#xff0c;可以使…

ChatGPT等模型:到2026年,将消耗尽高质量训练数据

《麻省理工技术评论》曾在官网发表文章表示&#xff0c;随着ChatGPT等大模型的持续火热&#xff0c;对训练数据的需求越来越大。大模型就像是一个“网络黑洞”不断地吸收&#xff0c;最终会导致没有足够的数据进行训练。 而知名AI研究机构Epochai直接针对数据训练问题发表了一…

Python Subprocess教程:创建和管理子进程的完整指南

更多Python学习内容&#xff1a;ipengtao.com 在Python中&#xff0c;Subprocess模块为我们提供了强大的工具&#xff0c;使得创建和管理子进程变得十分便捷。本文将深入探讨Subprocess的各种功能和用法&#xff0c;通过丰富的示例代码&#xff0c;带你领略其强大的子进程管理能…

s_v_web_id或fp协议过签名,dy滑块

某音s_web_id或fp协议过签名 ‘h5_sdk_version’, ‘2.36.0’ "search_impr":{"entity_id":"1135137973613200"},"link_item_list":null,"user_permissions":null,"offline_info_list":null,"is_cf":…

迁移redis数据库中的数据到另一台服务器

方案一 下面我使用的redis是用docker安装的&#xff0c;不是通过下载安装包安装的&#xff0c;所以和我安装方式不一样的小伙伴可以不看&#xff0c;因为很多操作是基于docker的 话不多说&#xff0c;直接开搞&#xff01; 1.首先一定要确保两台服务器上面的redis版本要一致…

C++:OJ练习(每日练习系列)

编程题&#xff1a; 题一&#xff1a;把字符串转换成整数 把字符串转换成整数_牛客题霸_牛客网 示例1 输入&#xff1a; "2147483647" 返回值&#xff1a; 2147483647思路一&#xff1a; 第一步&#xff1a;it从str的第一个字符开始遍历&#xff0c;定义一个最后输…

使用 SIEM 管理安全事件

每家公司都必须处理检测、管理和解决安全事件&#xff0c;未能制定事件响应计划可能会对任何组织产生重大的影响&#xff0c;无论是在财务损失还是声誉损害方面。本文探讨了事件响应的重要性、检测和管理事件的关键要素&#xff0c;以及帮助组织处理安全事件的最佳实践。 安全…

感染了后缀为.404mckay-V-XXXXXXXX勒索病毒如何应对?数据能够恢复吗?

导言&#xff1a; 近年来&#xff0c;网络安全威胁日益严峻&#xff0c;其中之一便是V系列的勒索病毒之.404mckay-V-XXXXXXXX勒索病毒和.ad3for-V-XXXXXXXX勒索病毒。本文将深入介绍这一威胁的特点、感染方式&#xff0c;并提供详尽的数据恢复方法和有效的预防措施&#xff0c…