Contents

git修改最後一個commit(修改檔案)

git commit --amend 是 Git 中非常實用的指令,可以修改最後一次 commit 的內容,包括修改檔案、修改 commit 訊息、甚至修改 author 資訊。

基本用法:修改最後一個 commit 的檔案

當你發現剛剛 commit 後漏掉了某些修改,或 commit 的檔案有誤,可以用以下流程補救:

1
2
3
4
5
# 1. 修改或新增要補進去的檔案
git add .

# 2. 修改最後一個 commit(保留原本的 commit 訊息)
git commit --amend --no-edit

--no-edit 參數表示不修改 commit 訊息,直接把暫存區的變更加入最後一個 commit。

修改 Commit 訊息

如果只想修改 commit 訊息,不改檔案內容:

1
git commit --amend -m "修正後的 commit 訊息"

或省略 -m,Git 會開啟編輯器讓你直接編輯:

1
git commit --amend

修改 Commit 的 Author

若需要修正 commit 的作者資訊:

1
git commit --amend --author="Your Name <your@email.com>"

已 Push 的 Commit 如何處理

若已經 push 到遠端,amend 後會因為 commit hash 改變,導致本地與遠端歷史不同步,需要 force push:

1
2
3
4
5
# 危險方式(不推薦)
git push origin main --force

# 更安全的方式(推薦)
git push origin main --force-with-lease

--force vs --force-with-lease 的差異

指令 說明
--force 強制覆蓋遠端,完全不管別人是否有新的 push
--force-with-lease 在 push 前會確認遠端沒有其他人新增的 commit,較安全

--force-with-lease 能防止你不小心覆蓋掉其他人剛推上去的 commit,是 force push 時的最佳實踐。

協作時的注意事項

不要對已經 push 到公共分支的 commit 使用 --amend

原因:

  • git commit --amend 實際上是建立一個全新的 commit(hash 不同),原本的 commit 被丟棄
  • 若其他團隊成員已經基於舊的 commit 做了新的工作,force push 後他們的歷史會與遠端不符
  • 其他人需要用 git rebase 或重新 clone 來解決,造成團隊困擾

安全的使用原則:

  • --amend 只在本地未 push 的 commit 上使用
  • 若一定要修改已 push 的 commit,確認沒有其他人拉取該分支,且團隊成員都知情

參考資料