入门系列 - Git的管理修改与撤销修改

news2024/11/15 21:34:15

在这里插入图片描述

本篇文章,是基于我自用Linux系统中的自定义文件夹“test_rep”,当做示例演示

具体Git仓库的目录在:/usr/local/git/test_rep

Git的管理修改与撤销修改

在讲这个之前,还是有必要再阐述一下“工作区和暂存区”。Git 和其它版本控制系统如 SVN 的一个不同之处就是有暂存区的概念。

工作区(Working Directory)

就是你在电脑里能看到的目录,比如我自己的测试 Git仓库目录/usr/local/git/test_rep文件夹就是一个工作区:

在这里插入图片描述

以上,是我本机测试的 Git 工作区,有两个用于测试的文件。

版本库(Repository)

工作区有一个隐藏目录.git,这个不算工作区,而是 Git 的版本库。Linux 系统下可以通过 ls -ah 命令就可以看见,其它操作系统想看见它就比较简单了。

Git 的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index)的暂存区,还有 Git 为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

在这里插入图片描述

分支和HEAD的概念这里就先不去探讨了。

我们都知道,把文件往 Git 版本库里添加的时候,是分两步执行的:

  • 第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
  • 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建 Git 版本库时,Git 自动为我们创建了唯一一个master分支,所以,git commit就是往master分支上提交更改。可以粗浅的理解为,需要提交的文件修改都放到暂存区,然后一次性提交暂存区的所有修改。

我们可以通过操作演示一下:

#查看read.txt文件的内容
$ cat read.txt
Git is a version control system.
Git is free software.
#上述内容,read.txt文件一共有两行文本而已
#针对read.txt文件追加一行数据
$ vim read.txt
Git is a version control system.
Git is free software.
Git OK.		#追加一行新的文本
#wq保存read.txt
#再在/usr/local/git/test_rep中创建追加一个新文件work
$ touch work
#此时查看一下查看仓库当前的状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   read.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	work

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

Git 非常清楚地告诉我们,read.txt被修改了,而work还从来没有被添加过,所以它的状态是Untracked

现在,使用两次命令git add,把read.txtwork都添加后,用git status再查看一下:

$ git add read.txt
$ git add work
#没执行commit操作
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   work
	modified:   read.txt

通过上面可知,暂存区现在已经通过刚才git add操作,增加了两个文件,分别是read.txtwork。所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

如果再提交:

#提交
$ git commit -m '测试操作'
[master fd63112] 测试操作
 2 files changed, 1 insertion(+)
 create mode 100644 work
#查看仓库状态
$ git status
On branch master
nothing to commit, working tree clean

一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。因为此时,暂存区的修改已经提交到版本库中了。

所以,Git 的暂存区是一个区别与其它版本控制系统的不同的地方。

修改的管理

什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。

所以我们说,Git 管理的是修改,并不是文件。下面我们再操作一下:

#先查看一下read.txt文件
$ cat read.txt
Git is a version control system.
Git is free software.
Git OK.
#追加一行内容
$ vim read.txt
Git is a version control system.
Git is free software.
Git OK.
Git very OK.	#新追加的一行文本
#添加
$ git add read.txt
#查看仓库状态
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   read.txt
#再对read.txt文件做个修改
$ vim read.txt
Git is a version control system.
Git is free software.
Git OK.
Git very OK,Good.	#此处修改了一下
#wq保存read.txt
#此时我没有再次git add read.txt,而是直接git commit了
$ git commit -m '测试管理'
[master e8dba17] 测试管理
 1 file changed, 1 insertion(+)
#提交后,再看看仓库状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   read.txt

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

通过上面的操作,你会发现第二次的修改没有被提交。没错,按照 Git 的基本操作要求,只有执行了git add命令才会把修改被放入暂存区,git commit命令才会把暂存区的的修改提交到版本库中。很明显,刚才我们的操作,第二次并没有执行git add命令,所以第二次修改并没有放入暂存区。

既然刚才我们已经最后提交了,用git diff HEAD -- read.txt命令可以查看工作区和版本库里面最新版本的区别:

$ git diff HEAD -- read.txt
diff --git a/read.txt b/read.txt
index 4b9a082..1773e22 100644		#此处index您肯定和我不一样
--- a/read.txt
+++ b/read.txt
@@ -1,4 +1,4 @@
 Git is a version control system.
 Git is free software.
 Git OK.
-Git very OK.
+Git very OK,Good.

可见,第二次修改确实没有被提交。

那怎么提交第二次修改呢?你可以继续git addgit commit,也可以别着急提交第一次修改,先git add第二次修改,再git commit,就相当于把两次修改合并后一块提交了:

第一次修改 -> git add -> 第二次修改 -> git add -> git commit

好,现在,把第二次修改提交了,以此类推。

通过上面可以看出,Git 管理的并不是什么文件的事,管理的是修改,不管是何种形式的修改。

撤销的修改

接着上面的继续聊,前提那两次修改都已经git addgit commit了。

#查看一下现在read.txt的内容,前提所有的修改都add并commit了
$ cat read.txt
Git is a version control system.
Git is free software.
Git OK.
Git very OK,Good.
#我们对read.txt进行修改操作
$ vim read.txt
Git is a version control system.
Git is free software.
Git OK.
Git very OK,Good.
Git is Cool.	#这是新增加了一行文本
#wq保存read.txt

增加了那个文本合适不合适我们不去讨论,假设增加的这行文本并不太合适(此时还没有git add文件),于是你完全可以恢复到之前那个版本状态,如下:

#之前并没有git add文件
#此时查看仓库状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   read.txt

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

你可以发现,Git会告诉你,git restore <file>可以放弃工作区的修改:

$ git restore read.txt	#执行完并没有信息输出
#查看仓库状态
$ git status
On branch master
nothing to commit, working tree clean
#查看一下read.txt的内容
$ cat read.txt
Git is a version control system.
Git is free software.
Git OK.
Git very OK,Good.

文件内容果然复原了。

好,我们继续再尝试一下:

#查看一下read.txt的内容
$ cat read.txt
Git is a version control system.
Git is free software.
Git OK.
Git very OK,Good.
#继续对read.txt进行修改操作
$ vim read.txt
Git is a version control system.
Git is free software.
Git OK.
Git very OK,Good.
Git is very Cool.	#这是新增加了一行文本
#wq保存read.txt
#此时修改完read.txt文件后,直接git add
$ git add

这次操作,在read.txt文件中追加了一行新的文本Git is very Cool.,然后就直接git add提交到暂存区了。但是此时,我还是觉得不太合适(此时已经git add文件了),于是:

#之前已经进行了git add文件
#此时查看仓库状态
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   read.txt

Git 同样告诉我们,用命令git restore --staged <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:

$ git restore --staged read.txt	#执行完并没有信息输出
#查看仓库状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   read.txt

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

你会发现,刚才执行了git restore --staged read.txt之后,再查看仓库状态,这时和之前我们的操作一样了。其实就是通过执行git restore --staged read.txt这个命令,我们把已经git add到暂存区的修改撤销丢弃了,现在仅剩下工作区有修改,所以再次告诉我们通过执行git restore <file>可以放弃工作区的修改:

$ git restore read.txt	#执行完并没有信息输出
#查看仓库状态
$ git status
On branch master
nothing to commit, working tree clean
#查看一下read.txt的内容
$ cat read.txt
Git is a version control system.
Git is free software.
Git OK.
Git very OK,Good.

整个世界终于清静了!

所以,此时有必要总结一下:

git restore 用法

  • git restore --staged <file_name> 将暂存区的修改重新放回工作区(包括对文件自身的操作,如添加文件、删除文件)。
  • git restore <file_name> 丢弃工作区的修改(不包括对文件自身的操作,如添加文件、删除文件)。

restore 与 reset 的不同

  • restore 是拥有撤销,撤销到原始HEAD版本库。
  • reset 是回退到某个版本,如果执行git reset HEAD 文件操作,其效果和git restore --staged 文件是一个效果。

删除的操作

在 Git 中,删除也是一个修改操作,我们实战一下。

还记得博文开始的时候,我曾经新增过一个文件work,如下图:

在这里插入图片描述

我们就拿它开刀:

#通常直接在文件管理器中把没用的文件删了,或者用rm命令删了
$ rm work
#执行上面命令会提示你,是否要删除掉这个文件的提示“rm: remove regular file 'xxx'? 
#输入 y 告诉git执行删除

此时,Git 已经知道了你删除了文件,因此,工作区和版本库就不一致了:

#查看仓库状态
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	deleted:    work

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

通过上面的提示,你会有两个操作选择,一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

$ git rm work
rm 'work'
$ git commit -m '移除work文件'
[master aa5d2d0] 移除work文件
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 work

友情提示:此处git rm workgit add work,此时效果是一样的。之前执行了rm work,再执行一下git rm work代表通知 Git 移除文件。或者是git add work更合理,我们说过,Git 管理的是修改,我们把work文件删除了,就是做了修改操作,把做了修改的文件提交git add work,更符合我们之前学的操作:先git add操作,再git commit提交。

第二个操作就是,觉得这文件删错了还没提交呢,通过git restore <file>撤销删除操作:

$ git restore work
#或者直接
$ git checkout -- work	#这个命令很好了解,直接版本库里的版本替换工作区的版本

从某种意义上理解,删除操作不用太担心,即使已经被提交到版本库,我们完全可以从版本库“一键还原”回来,前提是只能恢复文件的最新版本,期间文件的修改会丢失。

重命名

文件的重命名,很好理解,在 Git 中我们使用git mv命令用于移动或重命名一个文件、目录或软连接:

$ git mv [file] [newfile]

如果新文件名已经存在,但还是要重命名它,可以使用 -f 参数:

$ git mv -f [file] [newfile]

例如我们一下操作:

$ git add README 

然后对其重命名:

$ git mv README README.md

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

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

相关文章

计算机毕业论文java毕业设计选题源代码S2SH校园BBS论坛系统

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之S2SH校园论坛_哔哩哔哩_bilibili计算机毕业设计java毕设之S2SH校园论坛共计2条视频&#xff0c;包括&#xff1a;计算机…

机器学习与数据挖掘——分类与预测模型

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;瞳孔空间 一&#xff1a;分类与预测 分类(Classification)&#xff1a;分类是找出描述并区分数据类或概念的分类函数或分类模型(也常常称作分类器)&#xff0c;该模型能把数据库中的数据项映射到给…

设计行业文档管理怎么做?天翎群晖全新解决方案来了!

编者按&#xff1a;解决设计行业文档管理难题&#xff0c;天翎群晖全新解决方案来帮忙&#xff01;本文分析了设计行也中的文档管理难点&#xff0c;并从五个方面介绍了天翎群晖是如何解决这些难题的。 关键词&#xff1a;免安装&#xff0c;免维护&#xff0c;私有化部署&…

ant design select 搜索同时支持输入和下拉选中

这个需求看着简单&#xff0c;但是实现起来走了不少弯路。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/74008ea8204c47e5b33ada2e82c56e26.png 1. 需求 当输入关键词时&#xff0c;远程搜索内容&#xff0c;有返回则下拉展示&#xff0c;无返回也要展示当前输入的关键…

学了C语言基本的语法,感觉转化代码的能力还是不强,编程能力到底该怎样提升?

刚开始学习编程的时候&#xff0c; 想写段不报错的代码吧&#xff0c;需要耗时十几分钟到一个小时。刷一道 Leetcode 上面的算法题呀&#xff0c;需要一个到几个小时。实现一个稍微复杂点的功能需求&#xff0c;跑通时间无比长。。。 当时&#xff0c;想一夜之前变成写代码的高…

ThreadLocal分析

每个线程都会有属于自己的本地内存&#xff0c;在堆中的变量在被线程使用的时候会被复制一个副本线程的本地内存中&#xff0c;当线程修改了共享变量之后就会通过JMM管理控制写会到主内存中。 很明显&#xff0c;在多线程的场景下&#xff0c;当有多个线程对共享变量进行修改的…

瑞格尔侯爵葡萄酒之城大师班

11月28日&#xff0c;美夏国际酒业携手西班牙瑞格尔侯爵酒庄&#xff08;Marqus de Riscal&#xff09;在上海的“苏河江宴”举办了一系列瑞格尔侯爵明星产品的大师班品鉴会。 开场前&#xff0c;一杯清爽的瑞格尔侯爵酒园白葡萄酒&#xff08;Marqus de Riscal Rueda Verdejo …

大一学生HTML个人网页作业作品——火影忍者动漫7页面带特效带轮播(HTML+CSS+JavaScript)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

深度学习: BatchNormlization论文详细解读

《Batch Normlization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》 论文详细解读&#x1f4a1;目录<center>《Batch Normlization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》 论文详细解读基础知识面…

机器学习11支持向量机SVM(处理线性数据)

文章目录一、什么是支撑向量机&#xff1f;二、Hard Margin SVM思想逻辑推理点到直线的距离&#xff1a;推论&#xff1a;再推&#xff1a;换符号替代&#xff1a;最大化距离&#xff1a;三、Soft Margin SVM和SVM正则化Hard Margin SVM缺点&#xff1a;所以我们必须思考一个机…

YOLO v1

参考 YOLO v1 - 云社区 - 腾讯云 摘要 我们提出了一种新的目标检测方法YOLO。 先前的目标检测工作重新利用分类器来执行检测。 相反&#xff0c;我们将对象检测作为空间分离的边界框和相关类概率的回归问题。 在一次评估中&#xff0c;一个单一的神经网络直接从完整的图像预…

内核态的文件操作函数:filp_open、filp_close、vfs_read、vfs_write、set_fs、get_fs

关于用户态的文件操作函数我们知道有open、read、write这些。但是这些的实现都是依赖于库的实现&#xff0c;但是在内核态是没有库函数可用的。最近做测试&#xff0c;在内核态中&#xff0c;需要学习一下在内核态里面的文件操作函数。分为三对出现。 感谢前辈的优秀文章&…

企业网站怎么建立?【企业网站的建设】

不少的实体企业都会考虑建立一个自己的企业网站&#xff0c;那么在企业网站的建设之前需要做好功课。那么企业网站怎么建立&#xff1f;下面给大家说说大概的流程。 1、申请域名 企业可以申请一个和自己企业名称相关的域名&#xff0c;而且域名尽量不要太长&#xff0c;否则难…

Java学习之多态数组

目录 一、定义 二、举例说明 要求1 父类-Person 子类-Student 子类-Teacher main类 运行结果 要求2 思路分析 main类中的代码 运行结果 一、定义 数组的定义类型为父类类型&#xff0c; 里面保存的实际元素类型为子类类型&#xff08;也可以有父类&#xff09; 二、…

Cat.1无线数据传输终端/Cat.1 DTU/LTE Cat.1 DTU/Cat 1模组功能

LTE Cat.1无线数传终端F2C16将借助成熟的LTE网络以更好的覆盖、更快的速度、更低的延时&#xff0c;完美取代传统2G/3G网络&#xff0c;为中低速率物联网行业提供优质的无线连接服务。 工业级芯片设计&#xff0c;设备稳定联网 ●全工业级芯片设计&#xff0c;宽温宽压&#xf…

「虚拟社交」爆火,资深玩家「当道」

⬆️“政企数智办公行业研究报告及融云新品发布会”明天直播&#xff01; 一切应用都将社交化。关注【融云全球互联网通信云】回复【融云】抽取高颜值大容量高端可乐保温杯哦~ 中国政企数智办公平台行业研究报告 融入社交能力&#xff0c;创造增长奇迹。激活用户在不同场景的社…

6个改善【客户体验】的自动电子邮件营销回复示例

关键词&#xff1a;客户体验、电子邮件营销 电子邮件自动回复器是将跨境电商的客户体验 (CX) 提升到一个新水平的一种方式。为了帮助跨境电商决定应该设置哪种自动电子邮件&#xff0c;我们汇总了对客户体验影响最大的 六个电子邮件自动回复示例。 这里有一些统计数据可以正确看…

国内各行业领域是否能通过与元宇宙和虚拟数字人的结合振兴数藏经济?

在过去几年&#xff0c; NFT和数字藏品已被广泛用于数字经济。 根据中国数字藏品行业协会早在2021年发布的市场发展报告中就指出了当年中国数字藏品市场规模达到2166亿元。 今年&#xff0c;国内元宇宙概念被炒得火热&#xff0c;从故宫博物院联合腾讯、网易等推出「故宫系列」…

关于C++11

文章目录&#x1f60d;C11优势&#x1f60e; 列表初始化&#x1f601;变量类型推导&#x1f44c;为什么需要类型推导&#x1f44d;decltype类型推导&#xff08;了解&#xff09;&#x1f61c;final 与 overridefinal&#x1f91e;override❤️默认成员函数控制&#x1f929;显…

TH10-数据统计与内容审核

TH10-数据统计与内容审核1、用户冻结解冻1.1 用户冻结ManageControllerManageService1.2 用户解冻ManageControllerManageService1.3 查询数据列表UserInfoManageService1.4 探花系统修改UserFreezeService2、数据统计2.1 数据采集2.1.1 部署RabbitMQ2.1.2 消息类型说明2.1.3 实…