不可不知的版本控制系統Git No.2-本地數據庫中Git可以做到的事情?(下)

這篇文章是繼續深入研究在上傳到遠端數據庫前還有哪些實用的指令碼。

commit紀錄查詢及修改

詳談 git log 查詢紀錄

一般狀況下,使用$ git log就可以查詢到所有commit的紀錄,但有時候只是想查看某一個commit的詳細紀錄,或是想快速知道每個commit紀錄的內容,或是想查詢特定內容的commit紀錄,這時候就有不同的參數可以搭配使用。

  • 簡單的commit紀錄

    1
    $ git log --oneline
  • commit紀錄摘要

    1
    $ git log --stat
  • commit紀錄圖形化

    1
    $ git log --graph
  • 列出某幾位作者發表的commit紀錄
    如果要找多位作者的話,請記得用 \ (反斜線)和 | (或)。

    1
    $ git log --author='Mark(\|Celeste)'
  • 列出符合指定字串的commit紀錄

    1
    $ git log --grep='P'
  • 列出修改的檔案內容有指定字串的commit紀錄

    1
    $ git log -S'box'
  • 列出某段日期的commit紀錄
    –before=’2020-05-25’ => 2020/05/25 之前。
    –after=’2020-05-21’ => 2020/05/21 之後。
    2個參數都可以單讀使用,或結合其他參數使用。

    1
    $ git log --before='2020-05-25' --after='2020-05-21'
  • 列出某段時間的commit紀錄
    –since=’6pm’ => 下午6點之後。
    –until=’9pm’ => 下午9點之前。
    2個參數都可以單讀使用,或結合其他參數使用。

    1
    $ git log --since='6pm' --until='9pm'

參考資料:
高見龍-檢視紀錄
git log

接下來就來講講儲存在本地數據庫後,Git還可以做些甚麼…。

修改commit紀錄

  • 修改最後一次commit紀錄的註解內容

    1
    $ git commit --amend -m '修改的註解內容'
  • 追加檔案到最後一次的commit裡

    1
    $ git commit --amend --no-edit

    必須先將檔案加入($ git add .)到索引區,才可以利用$ git commit --amend --no-edit來將索引區內的檔案加入到最後一次的commit裡,而不用在新增一個commit紀錄。

reset的功用

在上一篇中有提到$ git reset HEAD <fileName>可以將已經提交到索引區的檔案退回到工作目錄區,其實$ git reset HEAD也可以將檔案從本地數據庫退回到索引區,或是工作目錄區,亦或是全部刪除。

回到過去的reset

有2種使用reset的方法,以下有附圖:

  • 相對模式
    以HEAD為基準點,並使用~或是^往前還原,還原成前面第幾個commit紀錄內容就要取決於~後面所加的數字。

    1
    $ git reset HEAD~2

    這個意思是還原到目前的HEAD提交紀錄的前2個提交紀錄。

  • 絕對模式

    1
    $ git reset <SHA-1編號>

    可以先使用$ git log --oneline查詢SHA-1編號,並直接用這個編號去做還原。

reset參數代表…

$ git reset有幾個參數,分別代表了幾個不同的模式:

  • mixed
    預設值,reset後會將檔案退回到工作目錄區,但是檔案內容還是最後一次commit過後的內容,如上圖。

  • soft
    reset後會將檔案退回到索引區,但是檔案內容還是最後一次commit過後的內容。

  • hard
    reset後檔案內容會變成還原的那次commit裡所儲存的檔案內容,如還原到第一次commit,就只會呈現第一次commit的檔案內容,之後所有有修改過的內容都會消失。

參數 –mixed –soft –hard
經過多次commit修改的檔案內容 存在,並退回工作目錄區 存在,並退回退回索引區 消失,並完全還原成指定的commit紀錄所存的檔案內容

$ git log所列出的紀錄是會受到$ git reset的影響,只會列出還原的commit紀錄之前的紀錄,假如還原到第3次commit紀錄,那麼第4次之後的紀錄並不會顯示。
如果想知道詳細的commit紀錄(包含被reset過後的commit紀錄),可以透過$ git reflog,這個指令列出的就是所有進行過的commit紀錄及reset紀錄。

從上圖可以看出,$ git reflog列出了所有commit紀錄的變更(包含reset的紀錄)。

其他指令碼

  • 刪除檔案

    • 永久刪除
      1
      $ git rm index.html -f
    • 變成未被追蹤(Untracked)的檔案
      1
      $ git rm index.html --cached
  • 幫檔案改名
    把index.html的檔名變成cart.html。

    1
    $ git mv index.html cart.html
  • 查詢每行程式碼最後編輯的詳細資訊

    1
    $ git blame index.html

    圖中紅色框框即是commit提交紀錄的代碼。

參考資料:
高見龍-Git 教學
W3HexSchool-Git 還原
六角學院Git免費影音