返回 > 本部落格所有文章列表
最近,在乙個實際專案中,由於乙個開發組成員誤操作,將包含了大量配置錯誤的**提交至遠端倉庫,導致其他成員在更新時都會獲得這個錯誤的更新,從而使專案無法編譯執行。既然使用了git,那麼現在就來看看如何用它來解決這個問題。
由於git是增量式版本控制工具,所以它具有非常強大的恢復功能,可以通過增量計算,恢復至任何一次提交時的狀態。所以,在當前版本同步至最新的錯誤版本後,解決這個問題只需以下兩步:
恢復至最後一次正常的版本
若要恢復至指定版本,我們需要知道如何表示指定版本。在git系統中,每個版本都有乙個特定的特徵碼,可以使用 git log 命令進行檢視。如git log --since=3.days
檢視最近3天的歷史。歷史會列出每次更新的特徵碼,內容格式為:
commit 851a076e3ea03a04ce3b559dced7eae5925aabdc
。
然後,通過使用git reset --hard [特徵碼]
命令恢復至之前的某個版本,比如:git reset --hard 851a076e3ea03a04ce3b559dced7eae5925aabdc
( 為了簡化操作,特徵碼可以只輸入前幾位如git reset --hard 851a076e
)。 執行後,當前**即回到指定的版本。
強制將當前版本提交至遠端倉庫
在通過使用reset --hard
強制將本地倉庫恢復至指定的版本後,遠端倉庫的資料並沒有改變。所以,如果再次同步時,仍然會出錯。因此,我們需要將本地的修改提交至遠端。由於這次提交的版本沒有遠端的新的,所以如果直接提交會報錯。解決的辦法是使用強制提交引數,命令為git push -force
即可(-force
也可簡寫為-f
)。
通過以上兩步,遠端倉庫的**就恢復到了以前的狀態。但是請注意,即便修改完成了,如果別人已經同步過錯誤的**了,那麼仍然會有問題。因為從邏輯上來說,刪除了錯誤提交的版本v1實際上是包括錯誤提交版本v0的子集,因為v0比v1多了一次提交,其他都是一樣的。所以,為了防止別人錯誤的再次用本地的v0覆蓋v1,可以在v1後再追加一次內容任意的提交(比如寫點說明什麼的)。
通過強制刪除新提交的方式雖然可以解決問題,但是也有兩點不方便。一是刪除的內容無法儲存,即看不到操作記錄,這點不符合版本控制中對所有資料都進行記錄的思想。二是還需要有額外的操作,否則別人可以仍然會把錯誤的版本提交上去。所以,更好的辦法是使用revert
命令,格式為git revert -n 9c1dee
。這個命令的特點是把所有資料恢復至指定版本,但是保留之前的所有版本。所以在執行了此操作以後,還要進行提交(即先commit再push)。這樣的好處是,不僅保留了之前的操作,而且問題也得到解決。
最後,推薦看看這篇文章《git的4個階段的撤銷更改》,它對撤消的不同情況寫得非常詳細。
相同點:都是用於恢復資料
不同點:
vi實戰記錄
vi編輯器在unix和linux中比較早期的,vim是vi的擴充套件集,是對vi的加強。伺服器最小化,預設整合vi編輯器!了解vi常用命令,工作起來頗有 洪荒之力!01.關於退出 wq 強制儲存退出 wq 儲存退出 x 作用和 wq 一樣 zz 作用和 wq一樣,注意z是大寫的,並且不是在命令模式 ...
Angular實戰記錄
子元件中ngmodel繫結的值改變時,通過onchangecallback 傳回父元件時,有兩種情況 基本資料型別 string number 等變數,父元件中會跟著變化 非基本資料型別 date 父元件中不會檢測到變化 解決方法 建立乙個新物件傳回 this.onchangecallback ne...
frida 實戰 Frida脫殼實戰記錄
只能祭出傳聞已久的frida,果然瞬間脫殼獲取了幾個dex檔案,一番搜尋收集了很多個介面和後端服務的真實ip。腦瓜不好用,抓緊記錄一下。用到的工具 adb connect 127.0.0.1 6555 adb shell adb forward tcp 27042 tcp 27042 adb for...