Git ~ 回到过去 , 进入未来 ~ Git

时间:2023-03-09 06:55:55
Git ~ 回到过去 , 进入未来 ~ Git

概述

我们已经成功的添加了一个 readme.txt文件 , 现在是时候 继续工作了 , 于是 我们开始尝试一下 Git给我们所带来的便利下面修改read.txt 改成如下内容

为了尝试 Git 给我们带来的便利 这是 第一次修改 !

现在运行 git  status 查看 暂存去的状态 .

 xpower@xpower-CW65S:~/learngit$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: readme.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

上面的命令告诉我们 readme.txt 已经被修改了 , 但是没有修改的内容 , 如果想查看修改的内容的话 需要用 git diff 查看修改的内容

xpower@xpower-CW65S:~/learngit$ git diff
diff --git a/readme.txt b/readme.txt
index 8fd42a5..fa79f95
--- a/readme.txt
+++ b/readme.txt
@@ -, + @@
-git is version control systen.
-git is free software
-
+为了尝试 Git 给我们带来的便利 这是 第一次修改 !

git diff 顾名思义就是查看 difference , 显示的格式正式 Unix 通用的 diff 格式 , 可以从上面的命令输出看到我们将 原文内容修改了 .

下面我们就开始将暂存去区的内容 , 转移到工作区 .

xpower@xpower-CW65S:~/learngit$ git commit -a

这时候会出来 VIM 编译器 用于输入 这次修改的注释

 xpower@xpower-CW65S:~/learngit$ git status
位于分支 master
无文件要提交,干净的工作区

版本回退

现在再将文件修改

 为了尝试 Git 给我们带来的便利 这是 第二次修改 !

然后查看一下 暂存区 状态

xpower@xpower-CW65S:~/learngit$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动) 修改: readme.txt 修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

像这样 , 你不断的对文件进行修改 , 然后不断的提交修改到版本库里面 , 就好比玩RPG游戏的时候 , 每次通过一个关卡的时候就会自动把游戏状态存盘 , 如果某一关没过去 , 你还可以读取前一关的状态 . 有些时候打Boss  前你会手动存盘 以便万一失败 可以从最近的地方重新开始 . Git也是一样 , 当你觉得文件修改到了一定的程度的时候你可以 " 保存一个快照 "这个快照在Git中被称为 commit . 一但你的文件弄坏了 , 就可以从最近的一个 commit 回复 , 然后继续工作 , 而不是把几个月的工作成果全部丢失 .

现在我们回复一下 readme.txt文件一共有几个版本被提交到了 Git仓库里面

版本 1 :

 Git is a version control system.
Git is free software.

版本 2 :

为了尝试 Git 给我们带来的便利 这是 第一次修改 !

版本 3 :

为了尝试 Git 给我们带来的便利 这是 第二次修改 !

当然了 在实际工作当中 , 我们脑子里面怎么可能记得一个几千行的文件每次都修改了什么内容

这时候就可以使用 版本控制里面的 git log

 xpower@xpower-CW65S:~/learngit$ git log
commit 2d8b618e4a5ef0cb501d5b4f06fd92651b811c8a
Author: xpower <@qq.com>
Date: Sun Aug :: + 这是我进行的第二次修改为了尝试版本退回 commit a57e93105963a9060cd6ce6d3ddf62ec3fbd9397
Author: xpower <@qq.com>
Date: Sun Aug :: + 这修改 是我为了测试 而作的 commit 75cc461de80b076dc9b229442c78034bea4458e8
Author: xpower <@qq.com>
Date: Sun Aug :: + wrote a readme file

好了 我们现在将 文件退回 上一个版本

首先 Git 必须知道当前的版本是那个版本 , 在Git 当中 , 用 HEAD 表示当前版本 , 也就是最新提交的.  2d8b618e4a5ef0cb501d5b4f06fd92651b811c8a 上一个版本就是 HEAD^ 上上一个就是HEAD^^ 当然如果要上一百个版本的话 咋办 ? 写一百个 ^ ? 所以我们 写成这样 HEAD~100

现在我们将版本退回到上一个版本 .

xpower@xpower-CW65S:~/learngit$ git reset --hard HEAD^
HEAD 现在位于 a57e931 这修改 是我为了测试 而作的

上次我们所写的注释也会一并输出 .  --hard 是干啥的呢 ? 这个后面再说 .

看看 readme.txt 的内容是不是    改变了

Git ~ 回到过去 , 进入未来 ~ Git        果真回到了我们第一次修改的内容 ,

现在 查看一下记录

xpower@xpower-CW65S:~/learngit$ git log
commit a57e93105963a9060cd6ce6d3ddf62ec3fbd9397
Author: xpower <@qq.com>
Date: Sun Aug :: + 这修改 是我为了测试 而作的 commit 75cc461de80b076dc9b229442c78034bea4458e8
Author: xpower <@qq.com>
Date: Sun Aug :: + wrote a readme file

现在版本库已经看不到第二次修改了 , 但是你有发现原来删除的就是最好的 怎么办 ?

办法就是根据该版本的版本号来退回该版本 . 如果你的终端期间没有关闭 , 那么往上翻 , 找到你想到达的版本 , 用   git reset --hard 版本号 退回       如果终端关闭了怎么办 ? 你可以使用 git refgitlog 来查看你的名词命令

 xpower@xpower-CW65S:~/learngit$ git reflog
a57e931 HEAD@{}: reset: moving to HEAD^
2d8b618 HEAD@{}: commit: 这是我进行的第二次修改为了尝试版本退回
a57e931 HEAD@{}: commit: 这修改 是我为了测试 而作的
75cc461 HEAD@{}: reset: moving to HEAD^
294198b HEAD@{}: reset: moving to HEAD^^
2b2b62f HEAD@{}: commit: understand how stage works
d197255 HEAD@{}: reset: moving to d1972551358f74925aceb7967b56d576f9ff374c
75cc461 HEAD@{}: reset: moving to HEAD^
294198b HEAD@{}: reset: moving to HEAD^
d197255 HEAD@{}: reset: moving to d1972551358f74925aceb7967b56d576f9ff374c
75cc461 HEAD@{}: reset: moving to HEAD^
294198b HEAD@{}: reset: moving to HEAD^
d197255 HEAD@{}: reset: moving to d1972551358f74925aceb7967b56d576f9ff374c
294198b HEAD@{}: reset: moving to HEAD^
d197255 HEAD@{}: reset: moving to d1972551358f74925aceb7967b56d576f9ff374c
75cc461 HEAD@{}: reset: moving to HEAD^
294198b HEAD@{}: reset: moving to HEAD^
d197255 HEAD@{}: commit: append GPL
294198b HEAD@{}: commit: add distributed
75cc461 HEAD@{}: commit (initial): wrote a readme file

找到版本号之后 , git reset --hard 2d8b618 让 HEAD 指向该版本 Git ~ 回到过去 , 进入未来 ~ Git

工作区和暂存区的概念

  工作区(Working Dire)

就是电脑里面的那个目录 , 例如我电脑里面的 learngit 这就是一个工作区

  版本库(Repository)

工作区有一个隐藏目录 .git (在之前我们已经说过了.) 这个不是工作区 , 而是Git的版本库 .

Git的版本库里面 存储了很多东西 , 其中最为重要的就是成为 stage (或者index)的暂存区 , 还有Git为我们自动创建的第一个分支 master (注意这里所说), 以及指向master的一个指针叫做HEAD.
前面我们曾经说过将文件添加到 GIt 版本库里面的时候 , 我们分两步执行

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

因为我们创建版本库的时候 , Git 自动为我们创建一个 Master 分支  , 所以现在 , git commit 就是往 master分支上提交更改 .