記一次git push -f 后的回滾操作

c695382b4b441bd7fc1ebd082506a8d4.png

我們的內(nèi)網(wǎng)有使用gitlab作為我們的版本控制工具锅移,最近組里出現(xiàn)了一次誤操作,沒有更新服務(wù)器的代碼到本地倉庫在抛,直接使用git push -f 強制將本地的修改覆蓋了遠(yuǎn)程倉庫的版本满着,將其他人的commit都給沖掉了蟹地,而且無法使用通常的git reset方式回滾授翻,因為使用 git log查看遠(yuǎn)程倉庫的提交歷史已經(jīng)沒有其他同事在這之前提交的commit記錄了或悲。

一般遇到這種情況孙咪,如果同事A將本地覆蓋了遠(yuǎn)程,覆蓋了同事B和同事C的commit巡语,而同事B和C本地倉庫依舊有他們的提交翎蹈,這個時候同事B和C只需要同步一下遠(yuǎn)程,然后再git push -f一下他們的提交捌臊,這樣就能將被覆蓋的commit重新合并到遠(yuǎn)程倉庫里面。

但是我遇到的情況比較特殊兜材,因為當(dāng)時同事B和同事C是在gitlab的網(wǎng)頁版直接編輯的文件理澎,并通過Gitlab提交,也就是說所有人本地都沒有同事B和同事C提交的內(nèi)容曙寡,這個時候同事A使用git push -f直接就沖掉了記錄糠爬,所以就沒辦法通過上面的辦法來回滾了。

廢話那么多举庶,下面記錄下找回的過程:

1 場景

Original:
(remote origin:)
    branch master -> commit 111111

(local)
    branch master -> commit 22222
After git push -f:

(remote origin:)
    branch master -> commit 22222

2 找回步驟

(1)這個方法的前提是你有權(quán)限登陸部署了Gitlab的服務(wù)器执隧,我們需要找到Gitlab保存?zhèn)}庫的目錄,首先通過ssh登陸上Gitlab的服務(wù)器户侥,然后找到gitlab的存放倉庫的地方镀琉,默認(rèn)是在/var/opt/gitlab/git-data/repositories

在這個目錄下找到自己要回滾的倉庫蕊唐,并cd到該倉庫屋摔。

(2)在執(zhí)行回滾操作前一定要先進(jìn)行倉庫備份:

tar cvzf project-backup.tgz  /path/to/project.git

備份好之后才可以進(jìn)行下面的操作。

首先gitlab的倉庫的目錄是這樣的:

config description HEAD hooks hooks.old.xxx info objects refs

在當(dāng)前目錄使用git fsck工具找回上次執(zhí)行的危險操作替梨,直接執(zhí)行git fsck命令钓试,該命令顯示所有未被其他對象引用 (指向) 的所有對象,會有如下輸出:

dangling commit ab1afef80fac8e34258ff41fc1b867c702daa24b

ab1afef80fac8e34258ff41fc1b867c702daa24就是可能被丟棄的commit副瀑,也就是被沖掉的commit弓熏,具體是自己想要的哪個,可以:

git log ab1afef80fac8e34258ff41fc1b867c702daa24

查看在這之前的commit歷史糠睡,找到自己想要回滾的commit挽鞠。

(3)找到了想要回滾的commit 哈希值,是不是可以在本地倉庫執(zhí)行

git reset --HEAD  ab1afef80fac8e34258ff41fc1b867c702daa24

實現(xiàn)回滾了呢狈孔?答案是不可以的滞谢,因為倉庫關(guān)于被覆蓋的對象已經(jīng)被清除了,所以clone下來的倉庫是沒有被覆蓋的對象可以回滾的除抛,所以回滾操作還是需要在gitlab的實際倉庫里操作狮杨。

echo ab1afef80fac8e34258ff41fc1b867c702daa24 > refs/heads/master

將commit 哈希值直接添加到refs/heads/master文件里,然后克隆遠(yuǎn)程倉庫到本地到忽,你會發(fā)現(xiàn)以前的commit又神奇的回來了橄教。

具體的原理需要大家自己去了解git的原理清寇,參考這幾篇文章:

https://git-scm.com/book/zh/v1/Git-內(nèi)部原理-維護(hù)及數(shù)據(jù)恢復(fù)
https://superuser.com/questions/297973/how-can-i-recover-from-an-accidental-git-push-f/298015#298015

希望對大家有所幫助。

Regards护蝶,
codjust

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末华烟,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子持灰,更是在濱河造成了極大的恐慌盔夜,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堤魁,死亡現(xiàn)場離奇詭異喂链,居然都是意外死亡,警方通過查閱死者的電腦和手機妥泉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門椭微,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盲链,你說我怎么就攤上這事蝇率。” “怎么了刽沾?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵本慕,是天一觀的道長。 經(jīng)常有香客問我侧漓,道長间狂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任火架,我火速辦了婚禮鉴象,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘何鸡。我一直安慰自己纺弊,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布骡男。 她就那樣靜靜地躺著淆游,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隔盛。 梳的紋絲不亂的頭發(fā)上犹菱,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天,我揣著相機與錄音吮炕,去河邊找鬼腊脱。 笑死,一個胖子當(dāng)著我的面吹牛龙亲,可吹牛的內(nèi)容都是我干的陕凹。 我是一名探鬼主播悍抑,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼杜耙!你這毒婦竟也來了搜骡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤佑女,失蹤者是張志新(化名)和其女友劉穎记靡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體团驱,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡摸吠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了店茶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜕便。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡劫恒,死狀恐怖贩幻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情两嘴,我是刑警寧澤丛楚,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站憔辫,受9級特大地震影響趣些,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贰您,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一坏平、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锦亦,春花似錦舶替、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至抛蚁,卻和暖如春陈醒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞧甩。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工钉跷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肚逸。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓尘应,卻偏偏與公主長得像惶凝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子犬钢,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容