記一次尷尬的git reset丟失分支故障

2022-01-10 05:33:17 字數 1785 閱讀 5334

最近...似乎一直在踩坑...

也不是什麼故障,只是把乙個分支的功能弄沒了,之後在reflog裡找到又恢復了.

產生原因是有同事錯誤地把分支b merge到了分支a並push.

我直接在分支a上reset到了merge前的乙個節點(但這個節點其實是b分支的).

這導致分支a的頭跑到了b分支上,a本來那個分支沒有引用就丟了.

先說下解決方法,git reflog找到那個reset,或者直接用git fsck --no-reflogs --unreachable找到那個commit之後直接再reset回去即可.

主要原因是git merge之後的log會顯示另乙個分支的commit記錄(畢竟沒有真正的分支...).

這裡簡單重現下:

*   dacbc52 (head -> master) merge branch 'a'

|\| * 7b83cf6 (a) a commit

* | 9f4488b master commit

|/* 47a0ab3 init

這樣的乙個分支情況,master merge了a節點產生2126這個commit.

這個時候看一下master的log,資訊如下:

commit dacbc528153d48f3a210a9673ebc8148cfdb50d3

merge: 9f4488b 7b83cf6

date: fri jun 29 21:21:10 2018 +0800

merge branch 'a'

commit 7b83cf6664cd5b84c5f66ef99f0fb39fb5ab57bd

date: fri jun 29 21:19:59 2018 +0800

a commit

commit 9f4488ba008889b583205fc9405f4760150a2337

date: fri jun 29 21:18:26 2018 +0800

master commit

commit 47a0ab3a70e7b4a663f99bc23542a51a90af152c

date: fri jun 29 21:18:03 2018 +0800

init

可以看到a節點上的commit也被包含在了裡面....(ps:之前我們使用的是hg,分支的概念有所不同,merge之後檢視當前分支只是會顯示本分支和merge節點,並且也沒有git裡的fast-forward概念)

誤操作就是因為要撤銷master的merge,執行了git reset --hard 7b83c(因為剛好是merge下面的第乙個節點)

執行後的結果:

* 7b83cf6 (head -> master, a) a commit

* 47a0ab3 init

可以看到default的結果已經不復存在了

找回的話

> git reflog

7b83cf6 head@: reset: moving to 7b83c

dacbc52 head@: merge a: merge made by the 'recursive' strategy.

可以直接reset回dacbc52再進行正常操作

主要原因還是對於git的理解不深再加上之前使用hg的慣性產生了誤判.

參考資料:

內部原理-維護及資料恢復

分支-分支的新建與合併

一次尷尬的面試經歷

這段時間投了不少國外的博后崗位,好不容易收到了乙個面試機會,我準備了一周多,竟然因為網路問題而被 pass 了,心裡感到有點生氣跟遺憾。總結,估計有這幾點原因 1.我們宿舍網路不好。開啟國內 沒問題,上次測試時也是在宿舍,因此這一點應該不是主要原因。2.他們那邊網路不好。我覺得很可能是這個原因,他們...

記一次的使用

將jsp拆分frame框架,因為採用了第一種方式,一直在考慮用jquery非同步請求獲取資料,總是但不到效果,終於在js寫吐的時候選擇了第二種方式。參考網上的使用,大多是下面這個樣子,如果涉及靜態頁面之間定位,是沒有問題的 href 為目標頁面 通過target定位到frame views main...

記一次除錯

這是我最近幾個月來遇到的最棘手的乙個問題 昨天花了4個小時找出第一層次的原因 這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是乙個gradle的plugin,用來resolve公司內部的dependency的,弄完了跑測試專案的,拋乙個npe,而且npe還不在自己的 裡面。...