git速成(2)

3.4 版本穿梭

怎么执行版本回退呢?先看下提交日志。Head是一个指针,指向当前的提交操作。如果信息很多,需要多屏显示,b翻页。

$ git log
commit 826245132989264cfa91b6350195413bfb219826 (HEAD -> master)
Author: wz <wz@qq.com>
Date:   Wed Oct 20 21:38:40 2021 +0800

    hello,world!

当提交信息很多,可以使用git log --pretty=oneline,每次提交以一行显示。 git reflog还可以显示回退到各个版本指针需要移动的次数,而且显示所有的提交版本数(包括当前版本之前和之后的)。

$ git reflog
23d261d (HEAD -> master) HEAD@{0}: commit: hello
8262451 HEAD@{1}: commit (initial): hello,world!

回退的方式很简单。

git reset --hard commitid

也可以使用^表示回退的版本个数,回退两步走起。

git reset --hard^^

注意到--hard参数。reset还有两个同等级别的参数--soft--mixed工作中后两个参数用的不多。这里做简单介绍。

  • --soft仅仅会移动本地库的指针。
  • --mixed会移动本地库的指针,同时也会重置暂存区。
  • --hard会移动本地库的指针,同时会重置暂存区和工作区。
3.5 删除文件找回
3.5.1 永久删除文件找回

如果一个文件被永久的删除了,但是创建这个文件时提交到了本地版本库,那么这个添加文件的记录将一直被保存,我们使用git reset --hard commitid回退到文件添加的版本就可以把对应的文件找回了。

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ vim deletetest.txt

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ git add .
warning: LF will be replaced by CRLF in deletetest.txt.
The file will have its original line endings in your working directory.

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ git commit -m "add deletedtest.txt"
[master 34615c1] add deletedtest.txt
 1 file changed, 1 insertion(+)
 create mode 100644 deletetest.txt


24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ ls
deletetest.txt  hello,world.txt  hello.txt

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ rm deletetest.txt


24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ git add deletetest.txt

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ git commit -m "delete deletedtest.txt"
[master e83281c] delete deletedtest.txt
 1 file changed, 1 deletion(-)
 delete mode 100644 deletetest.txt

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ ls
hello,world.txt  hello.txt


24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ git reflog
e83281c (HEAD -> master) HEAD@{0}: commit: delete deletedtest.txt
34615c1 HEAD@{1}: commit: add deletedtest.txt
dc1a70c HEAD@{2}: reset: moving to dc1a70c
dc1a70c HEAD@{3}: reset: moving to HEAD
dc1a70c HEAD@{4}: reset: moving to dc1a70c
8262451 HEAD@{5}: reset: moving to 8262451
dc1a70c HEAD@{6}: commit: hello add again
23d261d HEAD@{7}: commit: hello
8262451 HEAD@{8}: commit (initial): hello,world!

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ git reset --hard 34615c1
HEAD is now at 34615c1 add deletedtest.txt

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ ls
deletetest.txt  hello,world.txt  hello.txt
3.5.2 暂存区删除文件找回

如果一个创建的文件删除了,但是还没有将文件删除的记录提交到本地库,可以用git reset --hard HEAD来恢复(前提是创建文件已经commit了)。

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ vim apple.txt

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ git add .
warning: LF will be replaced by CRLF in apple.txt.
The file will have its original line endings in your working directory.

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ git reset --hard HEAD
HEAD is now at 34615c1 add deletedtest.txt

24724@LAPTOP-OCSC7S98 MINGW64 /e/gitworkspace/gitviedo/wechat (master)
$ ls
deletetest.txt  hello,world.txt  hello.txt
3.6 比较文件

git diff [filename] 将工作区的文件将暂存区的进行比较。git diff HEAD可以将工作区的文件和本地库的文件进行比较,甚至使用git diff HEAD^等和历史版本中的文件进行比较。