# 前言
初學 Git 的人,在學會 git push
指令之後,大概都聽過一句話:
不要隨便進行 force push
這件事大概讓很多新手一聽到 git push --force
(或 git push -f
) 指令,就不寒而慄
確實,這個指令就像是拿到系統的最高管理權限一般,可以讓你完全依照自己的意思去更動 git 的分支
雖然我們被要求 不要隨便執行 git push -f
指令,但什麼叫隨便執行呢?又什麼時機應該執行呢?
其實只要能理解 git 推送的正確觀念,force push 將會是一個很好用的指令!
讓我們進入今天的正題
# 為什麼沒辦法執行 git push
在了解 force push 之前,我們先來聊聊在什麼情況下會沒辦法 執行 git push
# 地端分支尚未建立遠端追蹤分支
第一種狀況,你還沒執行過建立遠端追蹤分支的指令:
git push -u origin 地端分支名稱:遠端分支名稱 |
還沒執行這個指令之前,單獨執行 git push
時,Git 並不知道這個分支應該被推送到哪
這種情況下,還不需要動用 force push ,只要執行上面的指令,即可成功推送
# 分支被限制推送規則,或是分支保護
在專案的分支管理中,我們為了保護重要的分支不會隨便被弄亂,通常會針對重要的分支進行分支的保護
這個保護機制通常是遠端儲存庫提供的功能,舉凡 GitHub、GitLab 等常見的 Git 儲存庫,都會有這樣的設定
而我們透過軟體功能,限制 main
、 develop
分支不能直接在地端執行 git push
指令
因為這些分支在專案中往往有重要的意義:上線
當這些分支有新的 commit ,同時也代表著,這個新 commit 將成為一個可以在線上運作的 版本
如果隨便一個團隊成員都可以在地端推送新的 commit ,線上的版本一定會大亂!
所以我們往往會去針對這些分支設定 分支規則,限制只能透過 PR (pull request) 的方式增加新功能 (feature)
如果您不知道什麼是 PR ,可以參考 使用 GitHub - Pull Requests (PR) 文章
這種狀況下,你完全不可能、也不該執行 git push
,即便執行了 git push -f
,理論上也會被遠端儲存庫 (GitHub、GitLab 等) 限制執行。
而我們最常聽到的那句:不要隨便執行 git push -f
,就是在講這個情境。
# 地端分支跟遠端分支不一致
這個狀況有兩個實際的情境
# 使用 git commit --amend
修改最近一次的 commit
如果您沒使用過這個指令,可以參考 修改最近一次的 Commit 紀錄 文章
由於 git commit --amend
指令會讓 commit id 重新生成,就會讓地端分支的 commit 跟 遠端分支的 commit 不一致,導致你沒辦法直接執行 git push
# 使用 git rebase
重新定義基底
如果您還不知道什麼情境下可以用 rebase ,可以參考 用 rebase 重新定義基底 文章
最重要的情境大概是這樣
- 你在 main 或 master 建立新的功能分支開發功能,並且已經先把 自己的分支 推送到遠端 (注意,推的是自己的分支)
- 你的同事在同一時間也做了一樣的事情
- 你的同事完成開發,並且已經發了 pr 到 main 分支,也已經合進去 main 分支
- 因為你的分支內容已經跟 main 分支有落差,需要先更新自己分支的內容
你可以用 git merge
也可以用 git rebase
,最大的差異是,後者能讓線圖變得更乾淨。
不過代價是,如果你已經執行過 git push
,在 rebase 到 main 分支後,想再次執行 git push
,就會發生錯誤,因為 你的地端分支走向,已經跟遠端分支走向不同了
上述的兩種情況,就是你可以大方執行 git push -f
的好時機
# 使用 Force Push
# 使用指令
指令很簡單:
git push --force |
或是使用簡寫
git push -f |
# 使用 Fork
使用 GUI 執行 Fork Push 的方式,通常都會在 Push 介面上給你一個 Force Push
的選項
打勾之後再點選 Push ,就是在執行 Force Push 的行為了
注意到圖中特別標記一個警示符號,提醒你現在做的行為是需要特別注意的!