[精讚] [會員登入]
144

Git rebase 驚魂記

為了要刪除一些commit,我進行了rebase,結果嚇死人…

分享此文連結 //n.sfs.tw/16168

分享連結 Git rebase 驚魂記@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2023-04-23 02:36:56 最後編修
2023-04-23 01:52:41 By 張○○
 

<<這篇算是半技術半札記。>>

git 是很多工程師的幫手…也是夢靨

事發原是因是這樣的,我在遠端有git server,沒事的時候會把目前的進度push上去,這一切都很美好。

但是因為我的檔案非常的多,目前已達8個g的大小,隨著push次數的增加,我發現server所耗費的同間竟達到43g,足足是本地端11g的4倍多。

這樣下去我的git SERVER就要爆了…那可不行。

所以我想了一個方法,就是把多餘的commit刪掉:我認為永遠不可能reset回去的commit。

我以為我把這些多餘的commits刪掉後,占碟空間就會大量的減小。

所以我就進行rebase的工作:

# git log --oneline
c56d23b BEFORE REBASE OK
b610d11 BEFORE REBASE
ad77bb5 圖片移動redo
9a792a7 移動content圖片到子目錄
2751427 update1120316+IP6位址
e9546d3 放到gitlab init
d7328ce 新增line登入
0c0863d 加上google authenticate
 ...
ef5bb63 add 寬1440
de999ce add 大字版本
b0f5034 up0327
05eeebd uo0303
24ce86a up0131
5fbca73 new init  <== REBASE 到這裡

於是我下指令

# git rebase -i 5fbca73

出現編輯器,裡面的順序是由舊到新,我把下面畫線的都刪掉後按:wq 存檔。

pick 24ce86a up0131
pick 05eeebd uo0303
pick b0f5034 up0327
pick de999ce add 大字版本
pick ef5bb63 add 寬1440
  ...
pick 0c0863d 加上google authenticate
pick d7328ce 新增line登入
pick e9546d3 放到gitlab init
pick 2751427 update1120316+IP6位址
pick 9a792a7 移動content圖片到子目錄

ad77bb5 圖片移動redo  <== 留這個commit
pick b610d11 BEFORE REBASE
pick c56d23b BEFORE REBASE OK <== 留最後一個commit

# Rebase 5fbca73..c56d23b onto 5fbca73
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#

換句話說,我只留2個commits,其它都不要,我以為這樣就能保留最後的狀態。

因為目錄檔案很多,存檔後等他執行,足足跑了半小時,過程中我發現情況不對,因為網頁可以重新整理,可以看到過程中的變化,原本有更新的內容不見了…

整個跑完後傻眼。

原來我沒有pick的commit,他所進行的異動也就不見了…

啊慘…

於是我想了兩個方案,一是從遠端把資料蓋回來,當然這個難度很高,很容易出意外;一個找有沒有回復的方法?[2]

下了reflog的指令

# git reflog
a9f982e HEAD@{0}: rebase -i (finish): returning to refs/heads/master
a9f982e HEAD@{1}: rebase -i (pick): BEFORE REBASE OK
50ea89f HEAD@{2}: rebase -i (pick): 圖片移動redo
5fbca73 HEAD@{3}: checkout: moving from master to 5fbca73b7c499e1fb7a8e5bf5845aa7214dad004
c56d23b HEAD@{4}: commit: BEFORE REBASE OK <== 找到最後的commit進行恢復
b610d11 HEAD@{5}: commit: BEFORE REBASE
ad77bb5 HEAD@{6}: commit: 圖片移動redo
9a792a7 HEAD@{7}: commit: 移動content圖片到子目錄
2751427 HEAD@{8}: commit: update1120316+IP6位址
e9546d3 HEAD@{9}: commit: 放到gitlab init
0c0863d  <== 的確就是印這樣,後面沒有了。

下reset的指令恢復原本的狀態

# git reset --hard HEAD@{4}
Checking out files: 100% (51341/51341), done.
HEAD is now at c56d23b BEFORE REBASE OK

上面的reset很快,只花了幾秒。

回復原來的狀況,我想我得進行plan B,把原來的git全刪掉。

結論

1. rebase 刪掉commit是指該commit做的事也取消。

2. rebase完畢後後悔時可以用reset回復,但是重點是rebase得成功。

3. 不要完全依賴git,實體備份也很重要。

參考資料

[1] https://gitbook.tw/chapters/rewrite-history/remove-and-reorder-commit

[2] https://timmousk.com/blog/git-undo-rebase/

 

 

 

 

 

 

 

 

 

 

END

你可能感興趣的文章

一個邏輯的錯誤刪了全部檔案的經驗 今天本來想做一件很簡單的事,但卻足足浪費我多一倍的時間,再加上刪掉我全部的檔案,原因只是因為我自己的邏輯錯誤。

罰單申訴和註銷記錄 沒發現新裝了一台測速器讓我連二天接到超速的罰單,去申訴成功的記錄

令人傻眼的台中市立學校教育單位差勤系統 2021年還在用20年前的設計思維,什麼垃圾…

Git rebase 驚魂記 為了要刪除一些commit,我進行了rebase,結果嚇死人…

台中市74號快速路下方垃圾太多反應 台中市74號快速路下方垃圾太多,投書環保局

我當兵的點滴--我在預校的生活 每個人當兵都是一個故事,以下是我的故事,並不是拿來比較誰輕鬆誰好運,退伍十年多了再不記下來就會忘記。 前言 應該是大三的

我有話要說

>>

限制:留言最高字數1000字。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

UTF-8的網頁但IE8一片空白 UTF8編碼的網頁在Firefox 正常顯示、但IE8 就是空白,IE8編碼設定是「自動偵測」可是自動偵測到的是 big5...

好用的3+2碼郵遞區號查詢系統推薦 網路上找到用地址輸入判斷3+2碼郵遞區號的辨識率不高,除了這個網站…

外匯課程經驗 有天遇到某個朋友的正妹朋友,說她有個很棒的外匯投資課程,要我們去聽,只收場地費200大洋。她又說續效最差一個月也有1%,誰還在苦哈哈上班?

[MAC] 安裝APACHE+PHP OS Darwin OpenIDMac1deAir 15.6.0 Darwin Kernel Version 15.6.

[Mysql/MariaDB] 查看資料庫所占空間 查看資料庫在磁碟中所占空間