✨✨ 欢迎大家来到小伞的大讲堂✨✨
🎈🎈养成好习惯,先赞后看哦~🎈🎈
所属专栏: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,可以简单理解 成如下示意图:

