前面的話
本文將以一個簡單實例的形式來介紹Git版本切換
初始版本
首先,在一個自定義的位置,創建目錄a,比如在D盤下
[注意]本文會用到一些常用的Linux的Shell命令,詳細信息移步至此
先使用cd d:命令,切換到d盤,然后使用mkdir a命令,在d盤下新建一個名稱為a的文件夾。最后,使用ls命令,查看d盤下的所有文件及文件夾,發現a是存在的,所以操作成功

然后,使用cd a命令,進入d盤下的a文件夾

接下來,使用git init命令,初始化一個Git倉庫。創建倉庫的本質就是在當前文件夾下創建一個.git文件夾


然后使用git status命令,查看當前的文件狀態

接下來,在a文件夾下,使用touch 1.txt命令,新建一個1.txt文本文件,再使用git status命令,查看當前的文件狀態。在狀態報告中可以看到新建的1.txt文件出現在“Untracked files”下面,表示該文件為未跟蹤的文件

接著,使用git add 1.txt命令,跟蹤該文件。此時再運行git status命令,會看到1.txt文件已被跟蹤,并處于暫存狀態。只要在“Changes to be committed”這行下面的,就說明是已暫存狀態

再運行提交命令git commit -m 'add 1.txt',提交文件1.txt。提交后它會提示,當前是在哪個分支(master)提交的,本次提交的完整SHA-1校驗和是什么(beac21a),以及在本次提交中,有1個文件修訂過,0行添改,0行刪改過
再運行命令git status時,因為文件已經被提交了,所以提示沒有什么可供提交的了,工作目錄很干凈

新版本
接下來,我們使用cat > 1.txt命令,將1.txt文件的內容從無內容修改為'1'。使用git status時,提示當前文件沒有放置在暫存區

使用git add 1.txt命令,放置在暫存區,再使用git status時,提示1.txt文件已被跟蹤,并處于暫存狀態

使用git commit -m 'alter to 1'命令,來提交文件1.txt。提交后它會提示,本次提交的完整SHA-1校驗和是f73e651,以及在本次提交中,有1個文件修訂過,1行添改過

接下來,照貓畫虎,創建1.txt的第三個版本,將其內容修改為'2'并提交。本次提交的完整SHA-1校驗和是74833f8,以及在本次提交中,有1個文件修訂過,1行添改過、1行刪改過

查看版本
現在,我們總共把三個版本的1.txt文件提交到Git倉庫中了
版本1:空內容 版本2:'1' 版本3:'2'
當然了,在實際工作中,我們處理的文件比較復雜,并不能記得每次都改了什么內容。在Git中,我們用git log命令查看提交歷史
git log命令顯示從最近到最遠的提交日志,我們可以看到3次提交,最近的一次是alter t0 2,上一次是alter to 1,最早的一次是add 1.txt

如果嫌輸出信息太多,可以加上--pretty=oneline參數

git log有許多選項,下表列出了一些常用的選項及其釋義
選項 說明 -p 按補丁格式顯示每個更新之間的差異 --word-diff 按 word diff 格式顯示差異 --stat 顯示每次更新的文件修改統計信息 --shortstat 只顯示 --stat 中最后的行數修改添加移除統計 --name-only 僅在提交信息后顯示已修改的文件清單 --name-status 顯示新增、修改、刪除的文件清單 --abbrev-commit 僅顯示 SHA-1 的前幾個字符,而非所有的 40 個字符 --relative-date 使用較短的相對時間顯示(比如,“2 weeks ago”) --graph 顯示 ASCII 圖形表示的分支合并歷史 --pretty 使用其他格式顯示歷史提交信息可用的選項包括oneline,short,full,fuller 和format(后跟指定格式) --oneline `--pretty=oneline --abbrev-commit` 的簡化用法
我們常用-p選項展開顯示每次提交的內容差異。可以看到,最近一次更新和上一次更新的區別是將1修改為2。上一次和上上一次更新的區別是從空內容變成內容為1

有時候圖形化工具更容易展示歷史提交的變化,隨Git一同發布的gitk就是這樣一種工具。它是用Tcl/Tk寫成的,基本上相當于git log命令的可視化版本,凡是git log可以用的選項也都能用在gitk上。在項目工作目錄中輸入gitk命令后,就會啟動下圖所示的界面

版本切換
現在,我們準備把1.txt回退到上一個版本,也就是內容為'1'的那個版本
首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交(74833f8172d219dbf755dff7cdc64356bff39aad),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100
現在,我們要把當前版本“alter to 2”回退到上一個版本“alter to 1”,就可以使用git reset命令
首先,使用cat 1.txt命令查看該文件的內容為'2',接著使用命令git reset --hard HEAD^,將文件返回到上一個版本,再使用cat 1.txt命令查看該文件的內容為'1'

我們用git log再看看現在版本庫的狀態,發現最新的那個版本“alter to 2”已經看不到了

如果想返回到最新的版本,可以使用命令git reset --hard commit_id來實現
但是,如果找到最新版本的1.txt的commit id呢?Git提供了一個命令git reflog,該命令按照之前經過的所有的commit路徑按序來排列,用來記錄你的每一次命令

從git reflog命令返回的結果中發現,第五行的beac21a是上上個版本的1.txt文件的是commit id,第四行的f73e651是上個版本的,第三行的74833f8就是最新版本的
下面使用git reset命令,將文件恢復到最新版本

總結
Git允許我們使用命令git reset --hard commit_id在版本的歷史之間切換
HEAD可以用來替換commit_id,HEAD指向的版本是當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,往上100個版本寫成HEAD~100
當然了,^和~這兩個特殊符號,除了用在HEAD上外,還可以用在<branchName>上或Commit ID上。如master^,代表master的上一個版本;1f2f476~1代表Commit ID為1f2f476的上一個版本
可以用git log可以查看提交歷史,或者用git reflog查看命令歷史,以便確定要切換的版本的版本號
文章列表