Git_原理及使用_修改文件_版本回退

✨✨ 欢迎大家来到小伞的大讲堂✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:Git原理与使用**
小伞的主页:xiaosan_blog**

gitee:许星让 (xu-xingrang) - Gitee.com****

制作不易!点个赞吧!!谢谢喵!!

Git比其他版本控制系统设计得优秀,因为 Git跟踪并管理的是修改,而非文件。

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

让我们将ReadMe文件进行一次修改:

修改前:

bash 复制代码
kexiye@kexiye-VMware-Virtual-Platform:~/git$ cat ReadMe 
hello

kexiye@kexiye-VMware-Virtual-Platform:~/git$ git status
位于分支 master
无文件要提交,干净的工作区

修改后:

bash 复制代码
kexiye@kexiye-VMware-Virtual-Platform:~/git$ cat ReadMe 
hello
hello git

kexiye@kexiye-VMware-Virtual-Platform:~/git$ git status
位于分支 master
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git restore <文件>..." 丢弃工作区的改动)
	修改:     ReadMe

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

上面的结果告诉我们,ReadMe被修改过,还没有完成添加与提交,目前我们只知道文件被修改了,如果能知道哪里被修改了呢

1、git diff (查看git文件的修改)

git就给了我们一个指令用来查看哪里被修改了

git diff [file]

bash 复制代码
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git diff ReadMe
diff --git a/ReadMe b/ReadMe
index ce01362..7aa2326 100644
--- a/ReadMe
+++ b/ReadMe
@@ -1 +1,2 @@
 hello
+hello git

git diff [file] 命令用来显示暂存区和工作区文件的差异,显示的格式正是Unix通用的dif格式。 也可以使用 git diff HEAD --[file] 命令来查看版本库和工作区文件的区别。知道了对ReadMe做了什么修改后,再把它提交到本地仓库就放心多了。

bash 复制代码
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git add ReadMe 
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git status
位于分支 master
要提交的变更:
  (使用 "git restore --staged <文件>..." 以取消暂存)
	修改:     ReadMe
bash 复制代码
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git status
位于分支 master
无文件要提交,干净的工作区

2、git reset (版本回退)

之前我们也提到过,Git能够管理文件的历史版本,这也是版本控制器重要的能力。如果有一天你发现之前前的工作做的出现了很大的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本回退的功能了。

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

git reset 命令语法格式为: git reset [--soft | --mixed | --hard] [HEAD]

  • --mixed 为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。
  • --soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
  • --hard 参数将暂存区与工作区都退回到指定版本。切记工作区有未提交的代码时不要用这个命令,因为工作区会回滚,你没有提交的代码就再也找不回了,所以使用该参数前一定要慎重。

HEAD 说明:

可直接写成commit id,表示指定退回的版本

  • HEAD 表示当前版本
  • HEAD^上一个版本
  • HEAD^上上一个版本
  • 以此类推...

可以使用~数字表示:

  • HEAD~0 表示当前版本
  • HEAD~1 上一个版本
  • HEAD^2 上上一个版本
  • 以此类推...
bash 复制代码
##第一次修改提交
kexiye@kexiye-VMware-Virtual-Platform:~/git$ cat ReadMe 
version1
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git add ReadMe 
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git commit -m "version1"
[master bf37fd7] version1
 1 file changed, 1 insertion(+), 2 deletions(-)

##第二次修改提交
kexiye@kexiye-VMware-Virtual-Platform:~/git$ cat ReadMe 
version1
version2
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git add ReadMe 

##第三次修改提交
kexiye@kexiye-VMware-Virtual-Platform:~/git$ cat ReadMe 
version1
version2
version3
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git add ReadMe 
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git commit -m "version3"
[master 67fec9c] version3
 1 file changed, 1 insertion(+)
bash 复制代码
##查看历史提交记录
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git log --pretty=oneline
67fec9ca9c728e2e964b6d451d60b9326ac9335a (HEAD -> master) version3
c61deee3efa2bb16578ccceb595571e69051c267 version2
bf37fd7f14d6e28a85c854b059ca3fe5655d82b4 version1
fa75933c7753735806140204bd351438c0ed4e9b modified test
97bb4e572fbad68e81ca7b4452ed1c8b8fd90a0f modified ReadMe

现在,如果我们在提交完version3后,发现version3 编写错误,想回退到version2,重新基于version 2 开始编写。 由于我们在这里希望的是将工作区的内容也回退到 version 2 版本,所以需要用到 --hard 参数, 示例如下:

bash 复制代码
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git reset --hard c61deee3efa2bb16578ccceb595571e69051c267 
HEAD 现在位于 c61deee version2
kexiye@kexiye-VMware-Virtual-Platform:~/git$ cat ReadMe 
version1
version2

我们发现,此时ReadMe文件的内容,已经回退到了version2了,当前,我们再次使用git log查看一下提交日志,发现HEAD指向了version2,如下所示:

bash 复制代码
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git log --pretty=oneline
c61deee3efa2bb16578ccceb595571e69051c267 (HEAD -> master) version2
bf37fd7f14d6e28a85c854b059ca3fe5655d82b4 version1
fa75933c7753735806140204bd351438c0ed4e9b modified test
97bb4e572fbad68e81ca7b4452ed1c8b8fd90a0f modified ReadMe

到这里一般回退功能就演示完了,但现在如果我后悔了,想再回到version 3怎么办?我们可以继续使用 git reset 命令,回退到 version 3 版本,但我们必须要拿到 version 3 的 commitid去指定回退的版本。

但我们看到了 git log 并不能打印出 version 3 的 commit id,运气好的话我们可以从终端上去找找之前的记录,运气不好的话 commit id已经被我们搞丢了。

Git还提供了一个 git reflog 命令能补救一下,该命令用来记录本地的每一次命令。

3、git reflog(记录本地每次命令)

bash 复制代码
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git reflog
c61deee (HEAD -> master) HEAD@{0}: reset: moving to c61deee3efa2bb16578ccceb595571e69051c267
67fec9c HEAD@{1}: commit: version3
c61deee (HEAD -> master) HEAD@{2}: commit: version2
bf37fd7 HEAD@{3}: commit: version1
fa75933 HEAD@{4}: commit: modified test
97bb4e5 HEAD@{5}: commit (initial): modified ReadMe

这样,你就可以很方便的找到你的所有操作记录了,但 d95c13f 这个是啥东西? 这个是 version3 的 commit id 的部分。没错,Git版本回退的时候,也可以使用部分 commit id 来代表目标版本。示例如下:

bash 复制代码
# 回退到v3
kexiye@kexiye-VMware-Virtual-Platform:~/git$ git reset --hard 67fec9c
HEAD 现在位于 67fec9c version3
kexiye@kexiye-VMware-Virtual-Platform:~/git$ cat ReadMe 
version1
version2
version3

值得说的是,Git的版本回退速度非常快,因为 Git在内部有个指向当前分支(此处是master)的HEAD 指针, refs/heads/master 文件里保存当前 master 分支的最新 commit id 。 当我们 在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储一个特定的version,可以简单理解 成如下示意图:

相关推荐
ldj20202 小时前
Linux系统开放端口命令
linux
草莓熊Lotso2 小时前
MySQL 数据库基础入门:从概念到实战
linux·运维·服务器·数据库·c++·人工智能·mysql
芒果披萨2 小时前
linux系统管理基本命令行
linux·运维·服务器
珠海西格2 小时前
聚焦痛点|分布式光伏消纳困境的三大表现及红区治理难点
服务器·网络·分布式·安全·区块链
Will_11302 小时前
Linux运维自动化常用的Python库
linux·运维·自动化
程序设计实验室2 小时前
2026年的Linux桌面环境选择,哪些适合Debian服务器?
linux
旭日跑马踏云飞2 小时前
【阿里云】扩容操作指南
服务器·阿里云·云计算
牛马鸡niumasi2 小时前
Linux I/O重定向
linux·运维·服务器
老一岁2 小时前
linux vim及ps到tar包的详解
linux·运维·vim
qzhqbb2 小时前
OpenClaw(系统服务模式与独立进程模式)
linux·人工智能