结论

git工作区状态:

  1. git status

查看全部修改内容:

  1. git diff

查看指定文件修改内容:

  1. git diff <file>

回退到指定版本

  1. git reset --hard commit_id

回退到上一个版本

  1. git reset --hard HEAD^

回退到上上一个版本

  1. git reset --hard HEAD^^

回退到上n个版本

  1. git reset --hard HEAD~n

查看详细提交历史

  1. git log

查看简化提交历史

  1. git log --pretty=oneline

查看分支合并图

  1. git log --graph

查看命令历史

  1. git reflog

说明

我们多次修改文件,如果不小心删除了某些东西,可以使用版本回退来实现复原

步骤

继续上一节的内容,修改readme.txt,增加了一行内容,执行:

  1. git status

结果如下:

  1. $ git status
  2. On branch master
  3. Changes not staged for commit:
  4. (use "git add <file>..." to update what will be committed)
  5. (use "git checkout -- <file>..." to discard changes in working directory)
  6. modified: readme.txt
  7. no changes added to commit (use "git add" and/or "git commit -a")

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有提交修改。

此时,如果想查看具体我们修改了readme.txt的哪一部分内容,执行:

  1. git diff

结果如下:

  1. $ git diff
  2. diff --git a/readme.txt b/readme.txt
  3. index cc3b095..6b77a0b 100644
  4. --- a/readme.txt
  5. +++ b/readme.txt
  6. @@ -1,2 +1,3 @@
  7. git is very famous!
  8. -第一次追加内容
  9. \ No newline at end of file
  10. +第一次追加内容^M
  11. +第二次追加内容
  12. \ No newline at end of file

知道修改了什么内容,就可以放心提交了,依次执行git add git commit -m ""即可,提交完毕,执行git status查看状态,显示如下:

  1. $ git status
  2. On branch master
  3. nothing to commit, working tree clean

好了,经过多次提交之后,如果想退回到某个版本,先执行:

  1. git log

结果如下:

  1. $ git log
  2. commit f09d57ce853e850551e8802b9a4be3643ba894c0 (HEAD -> master)
  3. Author: rumosky <rumosky@163.com>
  4. Date: Sun Nov 3 16:02:23 2019 +0800
  5. 第三次追加内容
  6. commit c3b8908ddddd8364ac8b2681b56e948885e49b1d
  7. Author: rumosky <rumosky@163.com>
  8. Date: Sun Nov 3 16:00:36 2019 +0800
  9. 第二次追加内容
  10. commit a82d91a6bb97b1acc158d98bc1f82697df938e3b
  11. Author: rumosky <rumosky@163.com>
  12. Date: Sun Nov 3 15:49:55 2019 +0800
  13. 第一次追加内容
  14. commit 69997611303057230d8fa50c81681bd823644553
  15. Author: rumosky <rumosky@163.com>
  16. Date: Sun Nov 3 15:28:27 2019 +0800
  17. 第一次提交

可以看到有四次提交,其中,commit后面的一串字符是commit_id,若觉得日志内容很长,可以添加参数—pretty=oneline,结果如下:

  1. $ git log --pretty=oneline
  2. f09d57ce853e850551e8802b9a4be3643ba894c0 (HEAD -> master) 第三次追加内容
  3. c3b8908ddddd8364ac8b2681b56e948885e49b1d 第二次追加内容
  4. a82d91a6bb97b1acc158d98bc1f82697df938e3b 第一次追加内容
  5. 69997611303057230d8fa50c81681bd823644553 第一次提交

回到上一个版本,结果如下:

  1. $ git reset --hard HEAD^
  2. HEAD is now at c3b8908 第二次追加内容

现在,我们回退到了上一个版本,但是如果我们后悔了,想恢复到新版本怎么办?没事,此时,先执行git reflog找到最新版的commit_id,结果如下:

  1. $ git reflog
  2. c3b8908 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
  3. f09d57c HEAD@{1}: commit: 第三次追加内容
  4. c3b8908 (HEAD -> master) HEAD@{2}: commit: 第二次追加内容
  5. a82d91a HEAD@{3}: commit: 第一次追加内容
  6. 6999761 HEAD@{4}: commit (initial): 第一次提交

第三次追加内容commit_idf09d57c,执行回退命令,结果如下:

  1. $ git reset --hard f09d57c
  2. HEAD is now at f09d57c 第三次追加内容

此时,查看readme文件,发现已经恢复了:

  1. $ cat readme.txt
  2. git is very famous!
  3. 第一次追加内容
  4. 第二次追加内容
  5. 第三次追加内容

commit_id没有必要全部输入,至少输入前四位就可以找到该commit