這篇要介紹的是,在使用 Git 時可能會遇到的各種情況以及該如何解決
我 commit 了但是想改 commit message
git commit --amend
amend 是「修訂,修正」的意思
- 當我改完檔案,在 commit 出去後,我發現我的 commit message 拼錯字了
git commit -am 'add new codn'
- 補救的方法是:輸入指令
git commit --amend
,就會進入一個 vim 編輯器,在這裡就可以修正 “上一次” 的 commit message
- 修正完成,離開 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 的名字
- 我在新增 branch 時,把 branch 名稱打錯了
git branch featurrr
- 這時,就先切換到這個 branch
git checkout featurrr
- 使用指令
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,例如:
- 檢查是否有放帳號密碼在程式裡
- 是否有修改到不該改的檔案
- 首先,把原本的檔名 pre-commit.sample 改成 pre-commit
- 在 vs code 開啟 pre-commit 這個檔案,然後寫一些 shell script
exit 1
- 回到 CLI,不管我有沒有修改檔案,只要我新增 commit
git commit -am 'changed code.js again'
- 這時,就會出現我剛剛想要印出的東西
echo 'hello!'
,但是,都不會執行 commit
原因是:
我用 exit 1
這行程式碼,把 commit 給擋掉了
exit 0
- 如果把
exit 1
改成exit 0
- 這時,除了會印出
hello!
之外,也會執行 commit
因此,我就可以設計成:
在 commit 前,做一些檢查,也就是說
在 exit 1
前面加上一些 if
條件判斷(如果...的話),就把 commit 擋掉,並且印出提示訊息「You can not pass!」
如果通過檢查,就可以 commit (exit 0
)