Git 的各種狀況劇


Posted by saffran on 2020-12-01

這篇要介紹的是,在使用 Git 時可能會遇到的各種情況以及該如何解決

我 commit 了但是想改 commit message

git commit --amend

amend 是「修訂,修正」的意思

  1. 當我改完檔案,在 commit 出去後,我發現我的 commit message 拼錯字了
    git commit -am 'add new codn'
    
  2. 補救的方法是:輸入指令 git commit --amend,就會進入一個 vim 編輯器,在這裡就可以修正 “上一次” 的 commit message
  3. 修正完成,離開 vim 編輯器之後,使用 git log 就可以看到:“上一次” 的 commit message 已經變成修正後的了

注意!

如果你已經 commit 而且又 push 了,那就不要再去改 commit message 了,因為如果你又在 local 端改的話可能會造成其他人的困擾(兩邊的 commit message 不一致)。

建議是 push 之前先檢查一下,避免錯的 commit message 被放到遠端去了。

我 commit 了可是我又不想 commit 了

當我改完檔案後,新增一個 commit 後,我又不想 commit 了

git commit -am 'a wrong decision'

要把這個 commit 刪除掉,有兩種做法:

作法一:用版本號回到上一次的 commit

使用 git log 查看歷史記錄,把「上一個 commit」的版本號給複製起來,接在 git reset 後面:

git reset 98fea67ac2fcc974b00499a10a82f112fe14d92b

作法二:指令 git reset HEAD^

  • HEAD 代表「最新的 commit」
  • ^ 代表「前一個」
  • 所以,HEAD^ 就是:回到「最新的 commit」的前一個,也就是「上一個 commit」

git reset HEAD^ 後面如果不接參數的話,預設值是 --mixed,可參考:Git reset 的三種模式( soft mixed hard )比較

git reset HEAD^ 後面接上兩種不同的參數:

git reset HEAD^ --hard

適用情境:這次的 commit 我不要了,連我修改過的檔案內容我也都不想要了!

使用 --hard 的話,檔案會完全回復到上一次 commit 的狀態--> 這是最極端的做法

git reset HEAD^ --soft

適用情境:這次的 commit 我不要了,但是我改過的檔案還是要留著

使用 --soft 的話,我修改過的檔案都還是會保留著--> 這個是較常使用的指令,可以讓你把檔案再做一下修改後再次 commit

我還沒 commit,但我改的東西我不想要了

要怎麼把檔案回復到我還沒改過的狀態呢?

其實,用 git status 就會提示你這個指令

git restore 檔案名稱

我修改了 code.js 的檔案內容後,使用指令 git restore code.js,就可以把還在 working directory 中的修改內容捨棄掉

git restore .

我想要把專案中的所有檔案,我有修改過但還沒 commit 的內容,全部都回復到修改前的狀態

我想改 branch 的名字

  1. 我在新增 branch 時,把 branch 名稱打錯了
    git branch featurrr
    
  2. 這時,就先切換到這個 branch
    git checkout featurrr
    
  3. 使用指令 git branch -m feature,就可以把 branch 名稱改成正確的(feature)了

注意!一定要先切換到我要改名的 branch,再輸入指令 git branch -m 要改的名稱

把遠端的 branch 抓下來

git checkout 遠端分支名稱

假設,在 GitHub 有一個 issue 分支是我同事建立的,我想要把這個 branch 抓下來到我的本地端

雖然現在在我的本地端沒有 issue 分支,但 Git 神奇的地方是:
我只要在我的本地端輸入指令 git checkout issue,Git 就會把 issue 分支從遠端抓下來到本地端

客製化各個階段:Git hook

hook 是什麼?

在歌曲中,hook 就是「最吸引人的地方」,通常指的是副歌

在程式的領域中,hook 就是:我有一個鉤子,我把它掛在某個東西上面,這個東西只要一動,鉤子就會有反應--> 也就是「發生某事的時候通知我」

以 Git 來說,就會例如說是:

  • 有人 commit 時,就通知我
  • 有人 push 時,就通知我

Git hook 簡介加簡單示範

在 .git 資料夾中,有一個「hooks 資料夾」,裡面有一些 sample 可以使用

要如何使用這些 Git hooks 呢?

以 pre-commit.sample 為例

pre-commit:在 commit 前,會檢查你的程式碼是否有符合規範,如果不符合規範的話,就不給你 commit,例如:

  • 檢查是否有放帳號密碼在程式裡
  • 是否有修改到不該改的檔案
  1. 首先,把原本的檔名 pre-commit.sample 改成 pre-commit
  2. 在 vs code 開啟 pre-commit 這個檔案,然後寫一些 shell script

exit 1

  1. 回到 CLI,不管我有沒有修改檔案,只要我新增 commit
    git commit -am 'changed code.js again'
    
  2. 這時,就會出現我剛剛想要印出的東西 echo 'hello!',但是,都不會執行 commit

原因是:
我用 exit 1 這行程式碼,把 commit 給擋掉了

exit 0

  1. 如果把 exit 1 改成 exit 0
  2. 這時,除了會印出 hello! 之外,也會執行 commit

因此,我就可以設計成:
在 commit 前,做一些檢查,也就是說
exit 1 前面加上一些 if 條件判斷(如果...的話),就把 commit 擋掉,並且印出提示訊息「You can not pass!」

如果通過檢查,就可以 commit (exit 0


#Git #Github







Related Posts

[JavaScript] 關於模組化、匯入、匯出

[JavaScript] 關於模組化、匯入、匯出

[#002] 28. Implement strStr()

[#002] 28. Implement strStr()

Day4 真不想承認啊,因為自己太過年輕所犯下的錯誤

Day4 真不想承認啊,因為自己太過年輕所犯下的錯誤


Comments