[精讚] [會員登入]
139

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年前的設計思維,什麼垃圾…

博客來洩漏個人資料 「博客來網路書店」洩漏我的個人資料的一個記錄

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

中國信託信貸行銷的神操作---還錢篇 以前銀行是打電話要你還錢,現在銀行是打電話要你借錢。 這當然是有一定的成功機率,不然銀行不會找那麼多免洗員工做這件事 人

詭異的創業思維 創業的思維中,有多少銀彈,有多少技術,有多少人脈,有多少時間等等,每個都要考慮進去,以熱忱建立的關係脆弱的像蘇打餅乾一樣..

我有話要說

>>

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

訪客留言

[無留言]

隨機好文

[MAC] 截取螢幕畫面的方法 截取螢幕畫面的方法,在MAC中叫作螢幕快照,英文是screenshot

[jQuery] 利用load()來達成ajax的寫法 jQuery中利用load()來達成ajax的寫法,也有人稱他是假的ajax,作法就是..

為什麼要買長達二十年的保單? 為什麼要買長達二十年的保單?找一個可以說服我買二十年保單的理由。

沒有非誰做不可的事,也沒有不可被取代的人 沒有非誰做不可的事,也沒有不可被取代的人

[AS3] 我做的唯一一個Flash As3遊戲UFO INVADSION [AS3] 我做的唯一一個Flash As3遊戲,是第一個也是最後一個,後來就沒再寫as3,不過as3還滿好玩的。