2020年1月11日 星期六

Git 學習筆記 (二) : Git Bash 基本操作

我在 2018 年底便已在 Inhon 筆電上安裝了 Git, 但一年來都沒有時間學習. 2020 新春伊始, 因為想要在 Heroku 上架站必須使用 Git, 就趁這機會好好把 Git 與 GitHub 搞定吧!

主要參考書籍 :
  1. 為你自己學Git (博碩, 2017)
  2. 版本控制使用Git (碁峰, 2013)
  3. 7天學會Git版本控制 (博碩, 2016)
  4. 完整學會Git,GitHub,Git Server的24堂課 (第二版) (碁峰, 2018)
這四本中我覺得第一本 "為自己學 Git" 的作者由淺入深一步步說明 Git 指令用法, 最適合初學者. 本系列前篇筆記參考 :

Git 學習筆記 (一) : 安裝 Git

安裝完 Git 後開啟 Git Bash 視窗介面, Git 主要的操作都在此命令列介面上. 除了從左下角開始尋找 Git 開啟 Git Bash 外, 也可以在桌面按滑鼠右鍵, 點選其中的 "Git Bash Here" 即可開啟 Git Bash 視窗 :





輸入 git --version 可查看 Git 版本. 常用 Git 指令如下表 :


 Git 常用指令 說明
 git init 將目前的目錄初始化為 Git 目錄, 建立本地儲存庫
 git config 設定或檢視 Git 設定檔資訊
 git add  將檔案加入 Git 暫存區
 git rm 將檔案移出 Git 暫存區
 git status  顯示 Git 狀態
 git commit  將暫存區的檔案提交至儲存庫納入版本控制
 git log 顯示過去歷次的版本異動
 git reflog 顯示完整的版本異動歷史紀錄
 git show 顯示指定版本的異動內容
 git branch 建立一個新分支 (branch)
 git checkout 取出分支內容還原為工作目錄
 git merge 合併分支
 git reset 重設某一版本
 git clone 從遠端儲存庫 (GitHub 或 Bitbucket) 複製副本至本地儲存庫
 git push 將本地儲存庫內容推送到遠端儲存庫
 git pull 將遠端儲存庫拉回合併更新到本地儲存庫


這些指令通常有選項需指定. 除了這些 Git 指令外, Git Bash 介面還提供了一些源自 Linux/Unix 的檔案管理相關指令.


一. Git Bash 常用指令 : 

Git Bash 是 Windows 版的 Git 模擬器, 可使用 Linux 指令操作 Window 的檔案系統, 常用的 Linux 與 Windows 檔案管理指令對照如下表 :


 Linux 命令 Windows 命令 說明
 pwd cd 顯示幕前目錄
 ls -al dir 顯示目前目錄下的檔案與子目錄列表
 mkdir tmp md tmp 建立子目錄 tmp
 rm -r tmp rd tmp 刪除子目錄 tmp
 cd tmp cd tmp 切換至子目錄 tmp
 cd .. cd ..  切換至上一層目錄
 touch test.txt copy nul > test.txt 建立空白文字檔案
 cat file/more type file 顯示檔案內容
 rm file del file 刪除檔案 file
 mv file1 file2 ren file1 file2 將檔案 file1 更名為 file2
 cp file1 file2 copy file1 file2 複製檔案 file1 為 file2
 date date 顯示日期 (Linux 含時間)
 clear cls 清除螢幕


注意, 在 Git Bash 視窗中存取檔案系統時, 路徑分隔字元必須照 Linux 用法使用右斜線  (slash) "/", 不可用 Windows 的倒斜線 "\", 例如 :

cd d:/git/test

參考 :

# Linux 常用指令
Unix 與 MS-DOS 指令對照表

為了測試上面指令, 我在 d: 下建立了 git/test 目錄, 例如 :

User@DESKTOP-QUTGKGU MINGW64 ~
$ pwd 
/c/Users/User      (預設路徑)

User@DESKTOP-QUTGKGU MINGW64 ~
$ cd d:/git/test   

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ pwd                 (顯示目前路徑)
/d/git/test

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ mkdir tmp      (建立子目錄)

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ cd tmp             (切換至子目錄)

User@DESKTOP-QUTGKGU MINGW64 /d/git/test/tmp
$ cd ..                  (回上一層目錄)

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ ls -ls                 (顯示檔案與子目錄列表)
total 0
0 drwxr-xr-x 1 User 197121 0 一月    8 16:47 tmp/

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ touch test.txt    (建立檔案)

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ ls -ls                  (顯示檔案與子目錄列表)
total 0
0 -rw-r--r-- 1 User 197121 0 一月    8 16:53 test.txt
0 drwxr-xr-x 1 User 197121 0 一月    8 16:47 tmp/

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ echo "hello world!"       (輸出訊息)
hello world!

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ echo "hello world!" > test.txt        (輸出訊息至檔案)

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ cat test.txt                      (顯示檔案內容)
hello world!

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ rm -r tmp                       (刪除目錄)

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ ls -ls                                (顯示檔案與子目錄列表)
total 1
1 -rw-r--r-- 1 User 197121 13 一月    8 16:54 test.txt

Git Bash 視窗中所下過的命令會被暫存起來, 可按上下鍵叫出之前下過的指令重新執行, 可節省再次輸入之時間.


二. Git Bash 的文字編輯器 : 

在 Git Bash 編輯文字檔可用 Vim 或輕巧的 nano 編輯器. Vim 是 Unix 元老級文字編輯器 Vi 的改進版 (Vi Improved), 它有三個操作模式 :
  • Command mode (指令模式) : 可進行複製, 貼上等操作 
  • Command-line mode (命令列模式) : 可進行存檔與關檔等操作
  • Insert mode (編輯模式) : 可輸入檔案內容
在 Git Bash 輸入 vim, VIM, 或 Vim 均可開啟 Vim 編輯器視窗, 也可在 vim 後面指定要編輯之已存在檔案 :

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
$ vim               (開啟空白檔案)
$ vim test.txt   (開啟舊檔)




Vim 視窗開啟後預設是進入指令模式, 在此模式可按滑鼠右鍵選 Paste 貼上資料, 但不能編輯, 必須按 i, o, 或 a 這三個鍵的任一個才會進入編輯模式 (左下角會出現 '插入'), 這時才能用鍵盤輸入資料. 按 ESC 則可以跳出編輯模式回到指令模式.

在指令模式按冒號 : 會進入命令列模式, 這時可以在冒號 : 後面輸入 q 跳出 Vim, 輸入 w 存檔, 或輸入 wq 存檔後關閉 Vim, 例如 :

:q                     (跳出 Vim)
:w test.txt        (存檔)
:wq test.txt      (存檔後跳出 Vim)

注意, 如果檔案有修改輸入 :q 會出現 "E37 已更改過檔案但尚未存檔" 訊息, 這時要改用 :wq 才能跳出 Vim.




三個模式間的切換如下圖所示 :




參考 :

第九章、vim 程式編輯器

Git Bash 另外一個可用的編輯器是 Nano, 我在樹莓派中經常使用 Nano, 覺得比 Vim 好用, 只要輸入 nano 或 nano 檔名即可開啟檔案, 直接可進行編輯, 沒有 Vim 那麻煩的模式切換 :

User@DESKTOP-QUTGKGU MINGW64 /d/git/test
nano                (開啟空白檔案)
nano test.txt   (開啟舊檔)




它的操作方式在程式最底下的兩排說明中, ^ 表示要按住 Ctrl 鍵, 常用的是下面這三個 :

Ctrl + O : 存檔
Ctrl + X : 跳出 Nano
Ctrl + C : 取消目前操作





不過 Git 2.41.1 版的 Nano 有一個 Bug, 開啟時會出現如下錯誤訊息 :

Error in /usr/share/nano/git.nanorc on line 1: Regex strings must begin and end with a " character
" not understoodare/nano/git.nanorc on line 2: Command "

修正的方法是先關閉 Git Bash, 然後以管理員身分重新開啟 Git Bash :




然後執行下列指令即可 :

dos2unix /usr/share/nano/git.nanorc 

參考 :

fix bug with Git for Windows nano error

對 Windows 使用者來說, 老實說 Vim 實在有點難用, Nano 則還好. 其實也可以先在 Windows 用記事本或熟悉的編輯器編輯好後, 再到 Git Bash 中操作.


三. 使用者名稱與郵件設定 :

因為 Git 在做版本控制時會記錄是誰 (名稱 + email) 提交了這一個版本的檔案, 因此在使用 Git 進行版本控管之前最好先用 git config 指令先做好使用者名稱與郵件設定, 否則在用 git commit 提交檔案至儲存庫時必須用 --author 選項指定使用者名稱與郵箱地址. 如果先用設定檔設置使用者資料, 則提交時就不需要用 --author 選項指定使用者名稱與信箱了. 若設定檔找不到使用者資料而且 git commit 也沒有用 --author 指定的話, 提交時會出現 "fatal: unable to auto-detect email address" 錯誤訊息.

其實 Git 有三個不同優先層級的設定檔, 高優先權之設定檔內容會覆蓋低優先權之設定內容 :
  • 專案目錄下子目錄 .git 下的設定檔 (最高優先權 : local)
  • 登入帳號內的 .gitconfig 設定檔 (次高優先權 : global)
  • Git 安裝目錄系統設定檔 (最低優先權 : system)
 Windows 的 Git  系統設定檔在 C:\Program Files\Git\mingw64\etc 下. Git 會按照優先權高低順序從 local 到 system 依序尋找設定檔來套用, 如果在較高順序位置沒有找到設定檔, 才會往下找.

設定全域使用者名稱與 email 指令如下 :

$ git config --global user.name "Tony Huang"                   (使用者名稱)
$ git config --global user.email "blablabla@gmail.com"   (使用者信箱)

選項 global 表示這會套用到所有的 Git 專案, 所以這指令只要執行一次即可, 可以隨時再執行來更改設定, 不過每次更改之後, 之前版本控制資訊中的使用者資料不會同時更新, 還是維持當時的使用者資料.

設定完後可用 --list (或 -l 亦可) 選項顯示設定值 :

$ git config --list 
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
core.editor="C:\\Program Files\\EditPlus 3\\editplus.exe"
credential.helper=manager   (以上為系統設定)
user.name=Tony Huang
user.email=blablabla@gmail.com    (以上為 global 設定)
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true    (以上為 local 設定)

用 --system 選項只顯示系統設定 (即 mingw64\etc\.gitconfig 檔) :

$ git config --system -l 
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
core.editor="C:\\Program Files\\EditPlus 3\\editplus.exe"
credential.helper=manager

用 --global 選項只顯示全域設定 (即登入帳戶) :

$ git config --global -l 
user.name=Tony Huang
user.email=blablabla@gmail.com
core.editor=notepad

也可以用 cat 顯示登入帳戶的設定檔內容 :

cat ~/.gitconfig 
[user]
        name = Tony Huang
        email = blablabla@gmail.com
[core]
        editor = notepad

如果某個專案要用不同的使用者資料可用 local 選項來設定 :

git config --local user.name "Amy Huang"                   (使用者名稱)
git config --local user.email "amy@gmail.com"           (使用者信箱) 

再用 --list 選項檢視 Git 設定 : 

$ git config --list   
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=C:/Program Files/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
core.editor="C:\\Program Files\\EditPlus 3\\editplus.exe"
credential.helper=manager
user.name=Tony Huang                      (global 使用者名稱)
user.email=blablabla@gmail.com      (global 使用者郵箱)
core.repositoryformatversion=0          (區域設定)
core.filemode=false
core.bare=false
core.logallrefupdates=true                 
core.symlinks=false
core.ignorecase=true                           
user.name=Amy Huang                      (local 使用者名稱)
user.email=amy@gmail.com              (local 使用者郵箱)

可見目前專案目錄下有兩組使用者設定, 前面是全域設定, 後面是區域設定, 區域設定只會套用到目前的專案目錄 (亦即蓋掉 global 的設定).

用 --local 選項只顯示區域設定 :

$ git config --local -l 
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
user.name=Amy Huang
user.email=amy@gmail.com


四. 使用 Git 進行版本控制 : 

使用 Git 來管控專案版本的方式很簡單, 簡言之只有三個指令 :
  • git init : 將目前目錄納入 Git 版本控管
  • git add : 將檔案放入 Git 暫存區
  • git commit : 將暫存區中的檔案放進 Git 儲存庫
指令 git init 只是將專案目錄初始化, 接下來分兩個階段將專案目錄下的檔案納入版本控制, git add 先將檔案放入暫存區追蹤; 而 git commit 才是正式放如儲存庫進行版本控制.


1. 初始化版本控制 :

在任一目錄中下 git init 指令就是將此目錄納入 Git 版本控管了 (Git 初始化), 這時 Git 會在此目錄下產生一個 .git 子目錄, Git 的版本控制功能都是在此 .git 隱藏目錄中進行, 被控管的檔案就存放於此隱藏目錄中, 只要將 .git 目錄刪除就脫離 Git 版本控制了. 不過這個 .git 目錄是隱藏的, 必須在檔案總管檢視中勾選 "隱藏的選項" 才會顯示 :




例如 :

mkdir tmp      (建立新資料夾 tmp)
cd tmp             (切換目錄)
git init              (將目錄納入版控)
Initialized empty Git repository in D:/Git/test/tmp/.git/

可見 git init 已將 tmp 目錄納入 Git 版本控制, 可用 git status 檢視狀態 :

$ git status 
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

此處 "nothing to commit" 表示 Git 暫存區 (staging area) 並沒有檔案可以提交給儲存區 (repository) 存放, 並提示使用 git add 指令將檔案納入追蹤, 首先用 echo 指令或 nano 製作一個簡單的 hello.htm 檔案 (也可以在 Git Bash 外用記事本編輯) :

$ echo "Hello!" > hello.htm       (建立一個檔案)
$ ls      
hello.htm     

再用 git status 檢視版控狀態 : 

$ git status     
On branch master 

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        hello.htm

nothing added to commit but untracked files present (use "git add" to track)

Git 發現被版控的目錄 tmp 底下有一個未被追蹤 (untracked) 的檔案 hello.htm, 提示用 git add 指令可將此檔案 hello.htm 納入被追蹤 (tracked) 檔案. 


2. 將檔案納入追蹤 : 

以 git add 將檔案納入 Git 追蹤, 它會將檔案放進 Git 暫存區 (staging area 或 cache), 等待被提交至儲存庫 (repository) :

$ git add hello.htm         (將檔案納入追蹤)
warning: LF will be replaced by CRLF in hello.htm.
The file will have its original line endings in your working directory
用 git status 檢視狀態 :

$ git status    
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   hello.htm

顯示有一個新檔案 hello.htm 已納入追蹤 (加入暫存區中) 尚未被提交, 並提示可用 git rm --cached hello.htm 取消追蹤. 

可以使用 * 萬用字元一次新增多個檔案, 或用 --all 選項或句點 . 新增全部檔案 :

$ git add *.htm         (將全部 .htm 檔納入追蹤)
git add .                  (將全部檔案納入追蹤)
$ git add --all            (將全部檔案納入追蹤)

注意, git add --all 與 git add . 雖然都是將全部檔案納入追蹤, 但範圍有差別, 指令 git add . 會將目前目錄與所有子目錄下的檔案都加入暫存區; 而 git add --all 則是不論在哪一個子目錄下此指令都會將整個專案目錄下的檔案都加入暫存區. 


3. 將被追蹤的檔案提交至儲存庫 : 

用 git commit 指令可將目前暫存區內被追蹤的檔案全部提交到儲存庫 (repository) 中正式納入 Git 版本控制, 儲存庫才是是 Git 真正保存與控管檔案版本的地方. 

$ git commit -m "first commit of hello"    
[master (root-commit) 2a93fdc] first commit of hello
 1 file changed, 1 insertion(+)
 create mode 100644 hello.htm

注意, git commit 指令後面必須用 -m 選項附上提交備註, 說明此次提交相關的資訊, 應簡潔明確描述變動原因 (中英文均可), 例如修正某個 bug 等等. 如果 git commit 後面沒有附上提交備註, Git 預設不會完成提交動作. 

每一次提交都會為被提交之檔案在儲存庫中建立一個新的版本, 而且只提交那些已用 git add 放進暫存區中追蹤的檔案, 而專案目錄下那些尚未用 git add 加入暫存區的檔案並不會被提交.

指令 git log 可用來檢視 Git 提交的歷史紀錄 :

$ git log                           (檢視 Git 操作的歷史紀錄)
commit 2a93fdc1a214476af1623096d9a91a0393afebde (HEAD -> master)
Author: Amy Huang <amy@gmail.com>
Date:   Sat Jan 11 12:29:53 2020 +0800

    first commit of hello

在 commit 後面的一長串英數字是此次提交之版本編號, Git 使用 SHA-1 雜湊演算法根據檔案內容計算出一組 40 個字元的 16 進位字串, 除了檔案內容外 SHA-1 還會加入其他資訊使計算結果重複的機率降到非常低, 因此可用來辨識不同之版本.

版本編號後面的 HEAD 是指向目前分支的指標, 此處是指向主分支 (master), 可以用 cat .git/HEAD 檢視其指向哪一分支 :

$ cat .git/HEAD                        (檢視分支指標)
ref: refs/heads/master                 (指向主分支 master)

可見主分支版本編號放在 .git/refs/heads/master 檔內, 可用 cat 檢視其內容 :

$ cat .git/refs/heads/master     (檢視主分支內容)
2a93fdc1a214476af1623096d9a91a0393afebde  

這正是最近一次提交的版本編號. 用 git branch 可顯示目前有哪些分支 :  

$ git branch   
* master

可見現在只有一個分支, * 號所在即為目前 HEAD 指標所指之分支. 

如果檔案提交後又有修改, 必須重新用 git add 加入暫存區並再次用 git commit 提交, 這樣 Git 才能管理此檔案的版本變化. 例如用 nano 將 hello.htm 內容改為 "Hello Git!" :

$ nano hello.htm         (將檔案內容改為 "Hello Git!")
$ git add hello.htm      (須重新加入暫存區)
warning: LF will be replaced by CRLF in hello.htm.
The file will have its original line endings in your working directory
$ git commit -m "second commit of hello"    (再次提交檔案)
[master 4b5d913] second commit of hello
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git log   
commit 4b5d913232cd924aa1f1c85fa588b94298403d11 (HEAD -> master)
Author: Amy Huang <amy@gmail.com>
Date:   Tue Jan 14 14:57:09 2020 +0800

    second commit of hello

commit 2a93fdc1a214476af1623096d9a91a0393afebde
Author: Amy Huang <amy@gmail.com>
Date:   Sat Jan 11 12:29:53 2020 +0800

    first commit of hello

可見從 git log 可知 hello.htm 已經有過兩個版本了, 各次提交版本會照提交先後順序由下到上排列 (越新的在上面). git log 指令後面可用 --oneline --graph 選項以便得到單行的精簡結果 :

$ git log --oneline --graph
* 4b5d913 (HEAD -< master) second commit of hello
* 2a93fdc first commit of hello

用 git show 指令後面指定版本編號可以顯示該版本的變化, 版本編號不需要全碼, 只要輸入至少前四碼即可, 例如 :

$ git show 4b5d    
commit 4b5d913232cd924aa1f1c85fa588b94298403d11 (HEAD -> master)
Author: Amy Huang <amy@gmail.com>
Date:   Tue Jan 14 14:57:09 2020 +0800

    second commit of hello

diff --git a/hello.htm b/hello.htm
index 10ddd6d..106287c 100644
--- a/hello.htm
+++ b/hello.htm
@@ -1 +1 @@
-Hello!          (舊版本內容)
+Hello Git!   (新版本內容)

可見 git show 這指令會用 diff 去比對 hello.htm 前後版本是哪裡有變更.


4. 回復指定版本 : 

現在重點來了, Git 的版本控制主要的目的就是可以讓我們退回到舊版或退回後返回較新的版本, 其指令為 git reset, 但後面必須使用 --hard 選項與指定版本編號.

$ git reset --hard 版本編號 

例如上面被控管的檔案 hello.htm, 其內容從 "Hello!" 改成 "Hello Git!" 後, Git 紀錄了前後兩個版本的 hello.htm, 其版本編號分別為 "2a93f ..." (舊版) 與 "4b5d9 ..." (新版), 如果想要回到舊版, 可在 --hard 選項後面指定要回復之版本編號 :

$ git reset --hard 2a93f          (退回到前一版本 2a93f ....)
HEAD is now at 2a93fdc first commit of hello   

此指令使 HEAD 指標指向第一個版本, 用 cat 指令檢視 hello.htm :

$ cat hello.htm          (檢視檔案內容)
Hello!

可見 hello.htm 內容以退回第一個版本了. 用 git log 檢視提交紀錄 :

$ git log   
commit 2a93fdc1a214476af1623096d9a91a0393afebde (HEAD -> master)
Author: Amy Huang <amy@gmail.com>
Date:   Sat Jan 11 12:29:53 2020 +0800

    first commit of hello

結果第二版本紀錄不見了, 但可以用 git reflog 檢視歷史紀錄 :

$ git reflog 
2a93fdc (HEAD -> master) HEAD@{0}: reset: moving to 2a93f
4b5d913 HEAD@{1}: commit: second commit of hello
2a93fdc (HEAD -> master) HEAD@{2}: commit (initial): first commit of hello

可見事件是由下往上疊, 如果退回後反悔, 想要再回到第二版, 只要用 git reset --hard 指令指定要回去的版本編號即可, 例如此處第二版編號為 4b5d913 開頭 :

$ git reset --hard 4b5d9 
HEAD is now at 4b5d913 second commit of hello 

可見 HEAD 又重新指向第二版了, 用 car 檢視 hello.htm 內容 :

$ cat hello.htm   
Hello Git!

果然第二版的 hello.htm 又復活了!

下 git log 指令發現原本的提交紀錄回復了 :

$ git log 
commit 4b5d913232cd924aa1f1c85fa588b94298403d11 (HEAD -> master)
Author: Amy Huang <amy@gmail.com>
Date:   Tue Jan 14 14:57:09 2020 +0800

    second commit of hello

commit 2a93fdc1a214476af1623096d9a91a0393afebde
Author: Amy Huang <amy@gmail.com>
Date:   Sat Jan 11 12:29:53 2020 +0800

    first commit of hello

而 git reflog 則會紀錄全部指標移動過程 :

$ git reflog
4b5d913 (HEAD -> master) HEAD@{0}: reset: moving to 4b5d9
2a93fdc HEAD@{1}: reset: moving to 2a93f
4b5d913 (HEAD -> master) HEAD@{2}: commit: second commit of hello
2a93fdc HEAD@{3}: commit (initial): first commit of hello

以上 Git 基本操作程序摘要如下圖 :




注意, 隱藏目錄 .git 是 Git 版控運作的核心, 只要它被刪除, 這個專案目錄就脫離 Git 管理, 亦即無法再透過 Git 還原舊檔案了.

參考 :

30 天精通 Git 版本控管
連猴子都能懂的Git入門指南
Git 教學(1) : Git 的基本使用
Git達人教你搞懂GitHub基礎觀念
Git 介紹與在Windows系統下安裝
Git Bash 基礎指令 和 懶人包
30 天精通 Git 版本控管 (16):善用版本日誌 git reflog 追蹤變更軌跡

3 則留言 :

匿名 提到...

感謝分享!新手受益良多,很多遇到的問題都在這篇得到解答。

小狐狸事務所 提到...

感謝留言!

匿名 提到...

感謝分享!
其他教學都沒提到要開啟Git Bash來使用Git,結果我用cmd亂做一通難怪跟別人不一樣哈哈