1. 程式人生 > >Git——程式碼已經 push 上去了才發現寫錯?

Git——程式碼已經 push 上去了才發現寫錯?

程式碼已經 push 上去了才發現寫錯?

有的時候,程式碼 push 到了中央倉庫,才發現有個 commit 寫錯了。這種問題的處理分兩種情況:

 

1、出錯的內容在你自己的 branch

假如是某個你自己獨立開發的 branch 出錯了,不會影響到其他人,那沒關係用前面幾節講的方法把 寫錯的 commit 修改或者刪除掉,然後再 push 上去就好了。不過……

 

由於你在本地對已有的 commit 做了修改,這時你再 push 就會失敗,因為中央倉庫包含本地沒有 的 commit s。但這個和前面講過的情況不同,這次的衝突不是因為同事 push 了新的提交,而是因 為你刻意修改了一些內容,這個衝突是你預料到的,你本來就希望用本地的內容覆蓋掉中央倉庫的內容。那麼這時就不要乖乖聽話,按照提示去先 pull

一下再 push 了,而是要選擇「強行」 push

git push origin branch1 -f

 

-f--force 的縮寫,意為「忽略衝突,強制 push 」。

 

 

這樣,在本地修改了錯誤的 commit s,然後強制 push 上去,問題就解決了。

 

2、出錯的內容已經合併到 master

這就不能用上面那招了。同事的工作都在 master 上,你永遠不知道你的一次強制 push 會不會洗 掉同事剛發上去的新提交。所以除非你是人員數量和行為都完全可控的超小團隊,可以和同事做到無 死角的完美溝通,不然一定別在 master

上強制 push

 

在這種時候,你只能退一步,選用另一種策略:增加一個新的提交,把之前提交的內容抹掉。例如之 前你增加了一行程式碼,你希望撤銷它,那麼你就做一個刪掉這行程式碼的提交;如果你刪掉了一行代 碼,你希望撤銷它,那麼你就做一個把這行程式碼還原回來的提交。這種事做起來也不算麻煩,因為 Git 有一個對應的指令: revert

 

它的用法很簡單,你希望撤銷哪個 commit ,就把它填在後面:

git revert HEAD^

 

上面這行程式碼就會增加一條新的 commit ,它的內容和倒數第二個 commit 是相反的,從而和倒數第 二個 commit

相互抵消,達到撤銷的效果。

 

revert 完成之後,把新的 commitpush 上去,這個 commit 的內容就被撤銷了。它和前 面所介紹的撤銷方式相比,最主要的區別是,這次改動只是被「反轉」了,並沒有在歷史中消失掉, 你的歷史中會存在兩條 commit :一個原始 commit ,一個對它的反轉 commit

 

小結

這節的內容是講當錯誤的 commit 已經被 push 上去時的解決方案。具體的方案有兩類:

  1. 如果出錯內容在私有 branch :在本地把內容修正後,強制 push ( push -f )一次就可以解 決;
  2. 如果出錯內容在 master :不要強制 push ,而要用 revert 把寫錯的 commit 撤銷。