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


最近...似乎一直在踩坑...
也不是什么故障,只是把一個分支的功能弄沒了,之后在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@{0}: reset: moving to 7b83c
dacbc52 HEAD@{1}: merge a: Merge made by the 'recursive' strategy.

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

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


參考資料:
https://git-scm.com/book/zh/v1/Git-內部原理-維護及數據恢復
https://git-scm.com/book/zh/v1/Git-分支-分支的新建與合並


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM