早上菜鸟写了深入浅出计算机组成原理,感觉照搬的果然还是没自己写有意思,所以下午菜鸟就来学习git了,自己打,感觉nice φ(゜▽゜*)♪
话不多说,直接上
上一次,我们已经成功地把一个文本文件加入到了git,这里菜鸟希望,各位不看昨天的,然后再创建一个文本文件上传到git仓库。
如果你成功了,那么可以接着往后看,没成功,请回到 上一讲 复习
好了,现在进入今天的知识
读者可以任意选择你已经上传到git仓库的一个文本文件,然后修改(危:Windows不要用记事本),菜鸟改成了如下:
I come git first time!
git is a free!
three try change!
try diff!
现在,运行 git status ,菜鸟的运行结果:
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: gitone.txt
no changes added to commit (use "git add" and/or "git commit -a")
git status 命令可以让我们时刻掌握仓库当前的状态(这意味着,咳咳咳,大家要多用 (* ^ _ ^ *) ),上面的命令输出告诉我们,readme.txt被修改过了,但还没有准备提交的修改。
不过 git status 命令虽然能告诉你,文件被修改了,但是却不知道修改了哪里,如果你忘记了上次修改的什么,你应该怎么办呢?
这时候就该 git diff 上场了,diff就是different的缩写,所以顾名思义,就是两次的差别!
diff --git a/gitone.txt b/gitone.txt
index 4834687..28da96d 100644
--- a/gitone.txt
+++ b/gitone.txt
@@ -1,4 +1,4 @@
I come git first time!
-git is a free safeware!
+git is a free!
three try change!
try diff!
\ No newline at end of file
不同的修改显示不一样,读者可以随意发挥!
这时候,需要做的就是将新改的,给传入git仓库了,还是两步走
git add gitone.txt
这时先不要着急,记住上面我说的了吗? git status 得多用,这时候输入,显示结果:
On branch master
Changes to be committed:
(use "git restore --staged ..." to unstage)
modified: gitone.txt
git status 告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了。
这里提交菜鸟就不展示了。
提交后,依旧是 git status ,显示为:
On branch master
nothing to commit, working tree clean
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。
这里,我们已经有两个版本,如果下去还自己弄了的话,那就有很多版本。
那么我们怎么产看版本呢 ?没错,就是 git log 。
输入 git log 后,显示如下:
commit d696468860aab706dfb385ea4c85a11a0e37d86f (HEAD -> master)
Author: ******************
Date: Wed Jul 1 15:51:10 2020 +0800
read boke to change
commit d0e121c1329a54c6224a45c1a0a4952a9d420e40
Author: ******************
Date: Wed Jul 1 15:39:34 2020 +0800
add four line
commit ff8a5d3a208ac8f170ee00806205cc997824ad23
Author: ******************
Date: Wed Jul 1 15:09:00 2020 +0800
add three line
commit 5222f9d5ca0ea5ef06bf8b43d74ae1ea066d30c9
Author: ******************
Date: Wed Jul 1 15:04:59 2020 +0800
add one line
commit c471641b05472dda4ae61331250062da0844ce5a
Author: ******************
Date: Mon Jun 29 19:25:28 2020 +0800
2020 6 29
(这里菜鸟因为隐私关系,将Author弄成了****,其实是你一开始输入的user name 和 user Email)
注意:这里需要读者注意的是,如果版本少还好说,其不会出现问题,一但版本多了,其会出现没有显示的部分,这个时候就应该按 enter 键,到最后 git bash 上出现 END 时,输入 q 就能退出!也可以直接输入 q 退出,但是有一部分你会看不见!
git log 命令显示从最近到最远的提交日志,我们可以看到5次提交,最近的一次是read boke to change,上一次是add four line,最早的一次是2020 6 29。
如果感觉 git log 显示的太过臃肿,读者可以加上–pretty=oneline参数。
git log --pretty=oneline
友情提示:你看到的一大串类似5222f9…的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和菜鸟的肯定不一样,以你自己的为准。
为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交d696468860aab706dfb385ea4c85a11a0e37d86f(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^ ,上上一个版本就是HEAD^ ^ ,当然往上100个版本写100个 ^ 比较容易数不过来,所以写成HEAD~100。
这里菜鸟建议,直接记下两个就好:一个是HEAD^;另一个就是HEAD~XX。(其实还可以通过版本号跳回,具体见下面的版本前进)
现在我们要把当前版本回退到上一个版本,需要用到 git reset 命令,显示如下:
git reset --hard HEAD^
HEAD is now at d0e121c add four line
注意:
asus@XXX MINGW64 /e/Git_warehouse (master)
$ git reflog
6be4087 (HEAD -> master) HEAD@{0}: merge dev: Fast-forward
80b9641 (origin/master) HEAD@{1}: checkout: moving from dev to master
6be4087 (HEAD -> master) HEAD@{2}: commit: remove gittwo
80b9641 (origin/master) HEAD@{3}: checkout: moving from master to dev
80b9641 (origin/master) HEAD@{4}: commit: try github push
65f07fd HEAD@{5}: commit: add abc in text
ae3edd9 HEAD@{6}: commit: remove 123
asus@pbw MINGW64 /e/Git_warehouse (master)
$ git reset --hard 80b9641
HEAD is now at 80b9641 try github push
这个时候你会发现notepad++,会说文件内容以改变,当你点击是,就会看到上一个版本的内容。(也可以直接输入 git log ,你会发现最近的一版不会显示了;也可以直接使用cat < filename > 读取文件内容)
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL:
改为指向add distributed:
然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。
这里有个git的缺点得告诉大家,那就是可以回到过去却没办法穿梭回未来,通过上面的 git log 就可发现,因为根本不会出现最近的版本,最近的版本已经变成了上一个版本!
那这个时候咋回去?那就只能通过版本号了
git reset --hard d69646(版本号)
注意:版本号,不要写太少,不然可能有重复,而使git无法确定具体是哪一个版本!
现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?
在Git中,总是有后悔药可以吃的。当你用$ git reset --hard HEAD^回退到某个版本时,再想恢复到最新版,就必须找到最新版的commit id。Git提供了一个 命令git reflog 用来记录你的每一次命令(只有reset和commit,即:对版本库的操作):
git reflog
ff8a5d3 HEAD@{1}: reset: moving to HEAD^
d0e121c HEAD@{2}: reset: moving to HEAD^
d696468 (HEAD -> master) HEAD@{3}: commit: read boke to change
d0e121c HEAD@{4}: commit: add four line
ff8a5d3 HEAD@{5}: reset: moving to ff8a5d
c471641 HEAD@{6}: reset: moving to HEAD~2
ff8a5d3 HEAD@{7}: commit: add three line
5222f9d HEAD@{8}: commit: add one line
c471641 HEAD@{9}: commit (initial): 2020 6 29
幸运的是,你的commit被记录了,所以你可以看见你最新版本的版本号:d696468。