1. 版本回退
在實際工作中,我們腦子里怎么可能記得一個幾千行的文件每次都改了什么內容,不然要版本控制系統干什么。版本控制系統肯定有某個命令可以告訴我們歷史記錄,在Git中,我們用 git log 命令查看:

退出git log命令行是: q。
Git提供了一個命令 git reflog 用來記錄你的每一次命令:

如果我們要實現回退, Git必須知道當前版本是哪個版本,在Git中,用 HEAD 表示當前版本,也就是最新的提交009befc...711741(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^ ,上上一個版本就是 HEAD^^ ,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。
現在,我們要把當前版本回退到上一個版本,就可以使用 git reset 命令:

我們也可以是使用 commit_id 來在不同版本之間回退。

使用 git commit命令將文件添加到本地倉庫,要撤銷文件修改,可以使用如下命令:
git reset --hard commit_id
2. 版本庫(Repository)
工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。
Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。

前面講了我們把文件往Git版本庫里添加的時候,是分兩步執行的:
第一步是用 git add 把文件添加進去,實際上就是把文件修改添加到暫存區;
第二步是用 git commit 提交更改,實際上就是把暫存區的所有內容提交到當前分支。

2. 撤銷修改
1. 在Git中,git checkout -- file 可以丟棄工作區的修改:

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區的修改全部撤銷,這里有兩種情況:
一種是readme.txt自修改后還沒有被放到暫存區,現在,撤銷修改就回到和版本庫一模一樣的狀態;
一種是readme.txt已經添加到暫存區后,又作了修改,現在,撤銷修改就回到添加到暫存區后的狀態。
總之,就是讓這個文件回到最近一次 git commit 或 git add 時的狀態。
git checkout -- file 命令中的 -- 很重要,沒有 --,就變成了“切換到另一個分支”的命令,我們在后面的分支管理中會再次遇到git checkout命令。
2. 如果我們修改了文件,還 git add 到暫存區了,慶幸的是,在commit之前,你發現了這個問題。用git status查看一下,修改只是添加到了暫存區,還沒有提交:
Git同樣告訴我們,用命令 git reset HEAD file(即撤銷git add 命令修改的文件)可以把暫存區的修改撤銷掉(unstage),重新放回工作區:
git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本。再用git status查看一下,現在暫存區是干凈的,工作區有修改:然后按照第一步的方法回退。總結如下:

