本來想拉一個功能分支進行新的功能開發,合并代碼發現沒有沖突居然有文件被修改了,貿然選擇最近的一次回滾提交,沒想到不假思索的push -f 導致一部分dev主干的代碼不見了。
事故記錄
開發分支origin/dev,功能分支file
合并之后發現我并沒有修改任何代碼,沖突都是選擇dev分支的。但是卻有一兩個文件自動修改了,本能的覺得先會退再說然后再找原因,然后就選中最近的一個點,進行行了push -f,然后錯誤就產生了。
當我選中第二個點之后就變成了這樣
git log也變成這樣
這是reflog日志
4b9a2ba6c (HEAD -> dev, origin/prod, prod, file) HEAD@{0}: reset: moving to 4b9a2ba6ca2bcd745464a52f9cc63777035b96c1
2b5dc76c2 (origin/dev) HEAD@{1}: merge origin/dev: Fast-forward
4b9a2ba6c (HEAD -> dev, origin/prod, prod, file) HEAD@{2}: reset: moving to 4b9a2ba6ca2bcd745464a52f9cc63777035b96c1
2b5dc76c2 (origin/dev) HEAD@{3}: commit (merge): Merge branch 'file' into dev
46cb1af51 (origin/dev, dev) HEAD@{4}: checkout: moving from dev to dev
46cb1af51 (origin/dev, dev) HEAD@{5}: checkout: moving from 0cc0f3332769c4c920c1ef5eac68ea5d5598879c to dev
0cc0f3332 HEAD@{6}: checkout: moving from dev to 0cc0f3332
16d26a5a8 (origin/home, home) HEAD@{7}: reset: moving to HEAD@{1}
4b9a2ba6c (HEAD -> dev, origin/prod, prod, file) HEAD@{8}: checkout: moving from home to dev
16d26a5a8 (origin/home, home) HEAD@{9}: checkout: moving from dev to home
4b9a2ba6c (HEAD -> dev, origin/prod, prod, file) HEAD@{10}: reset: moving to 4b9a2ba6ca2bcd745464a52f9cc63777035b96c1
836279e82 HEAD@{11}: commit (merge): Merge branch 'file' into dev
46cb1af51 (origin/dev, dev) HEAD@{12}: checkout: moving from file to dev
4b9a2ba6c (HEAD -> dev, origin/prod, prod, file) HEAD@{13}: checkout: moving from prod to file
4b9a2ba6c (HEAD -> dev, origin/prod, prod, file) HEAD@{14}: commit: ops:修復沖突
bd0e9531b HEAD@{15}: commit (merge): Merge remote-tracking branch 'origin/home' into prod
878c72a08 HEAD@{16}: checkout: moving from dev to prod
46cb1af51 (origin/dev, dev) HEAD@{17}: checkout: moving from prod to dev
878c72a08 HEAD@{18}: reset: moving to HEAD
878c72a08 HEAD@{19}: reset: moving to HEAD
878c72a08 HEAD@{20}: checkout: moving from dev to prod
7c4f807e4 HEAD@{21}: merge origin/home: Merge made by the 'ort' strategy.
0cc0f3332 HEAD@{22}: merge origin/home: updating HEAD
0cc0f3332 HEAD@{23}: checkout: moving from home to dev
16d26a5a8 (origin/home, home) HEAD@{24}: commit: ops: 更新測試用例
處理
還好同事有本地最新的代碼,直接覆蓋解決了分支危機,之后還是另可合并也不要輕易強制推送。
事后總結
后面根據最新的de分支提交記錄,查看記錄找到46cb1af51點是最新的
執行命令: git reset --hard 46cb1af51
\HEAD 現在位于 46cb1af51 Merge branch 'prod' into dev
呼終于回來了,面對困難的時候還是要冷靜思考,git的操作和后悔機制還是很好的,360度無死角解決你各種問題,簡直良心工具。
分析結果
這還是對git的異常情況處理少,簡單的提交合并誰都會,但是碰到問題還是的深入研究,這次的問題主要還是選錯了分支回退的點,選中了file分支的某個點,然后回到了file分支,而不是根據dev主干上某個合并的點進行回退,git自然的把file分支記錄當成了主干,把dev分支當成了合并過來的代碼。所以才產生了最近幾天的記錄都沒有了的情況。只是大意手殘選了一個最近的點進行了push,push容易恢復難啊,以此記錄錯誤經歷。
最后
點贊關注評論一鍵三連,每周分享技術干貨、開源項目、實戰經驗、國外優質文章翻譯等,您的關注將是我的更新動力!
引用
Git進階系列 | 8. 用Reflog恢復丟失的提交_git reflog 恢復-CSDN博客
Git 命令 checkout、reset、revert、reflog 使用介紹_git reflog-CSDN博客