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,可以简单理解 成如下示意图:

相关推荐
米高梅狮子3 小时前
03.网络类服务实践
linux·运维·服务器·网络·kubernetes·centos·openstack
June`4 小时前
网络编程时内核究竟做了什么???
linux·服务器·网络
原来是猿4 小时前
腾讯云服务器端口开放完全指南
服务器·网络·腾讯云
你的保护色4 小时前
【无标题】
java·服务器·网络
楼兰公子4 小时前
RK3588 + Linux7.0.3 网络工程调试错误速查手册
linux·网络·3588
Elnaij4 小时前
Linux系统与系统编程(9)——自设计shell与基础IO
linux·服务器
IMPYLH5 小时前
Linux 的 unexpand 命令
linux·运维·服务器·bash
想唱rap5 小时前
IO多路转接之poll
服务器·开发语言·数据库·c++
|_⊙6 小时前
Linux 文件知识 补充
linux·运维·服务器
落羽的落羽6 小时前
【算法札记】练习 | Week4
linux·服务器·数据结构·c++·人工智能·算法·动态规划