在本地添加了多个远程仓库后,有时会出现本地分支Track(追踪) 不了对应的远程分支的情况(可能是 source 的 bug)。
> 举个例子🌰
> 本地有 A,B两个分支,在 source 切到 B 分支后,pull 远程最新 commit 下来,由于 source 上没及时的把远程的 B 分支显示出来,误操作 pull 了远程的 A 分支下来,也没提示警告或错误🤣,然后在B 分支提交了几个 commit,并且切到 A 分支,把 B 分支merge 后,才意识到有问题。当时心里想,小事一桩,用 git reflog 和 git reset 就足够了。
看下事故现场 git reflog 记录
```
1. 8f17e95 HEAD@{28}: commit (merge): Merge branch 'dev' into wxl/dev_3.6.0
2. f5c2290 HEAD@{29}: checkout: moving from dev to wxl/dev_3.6.0
3. b5d537e HEAD@{30}: reset: moving to b5d537e
4. 189e4d3 HEAD@{31}: commit (merge): Merge branch 'wxl/dev_3.6.0' into dev
5. b5d537e HEAD@{32}: pull origin_newchic dev: Fast-forward
6. e12032b (wxl/dev_3.6.0) HEAD@{33}: checkout: moving from wxl/dev_3.6.0 to dev
7. f5c2290 HEAD@{34}: commit: freegift rtl 翻转
8. 5fb503d HEAD@{35}: checkout: moving from wxl/feature_3.7.0_cate to wxl/dev_3.6.0
9. 60f37b2 (origin_newchic/wxl/feature_3.7.0_cate, origin/wxl/feature_3.7.0_cate, wxl/feature_3.7.0_cate) HEAD@{36}: checkout: moving from wxl/feature_cate to wxl/feature_3.7.0_cate
10. 585e703 (origin_newchic/wxl/feature_cate, origin/wxl/feature_cate, wxl/feature_cate) HEAD@{37}: checkout: moving from wxl/dev_3.6.0 to wxl/feature_cate
11. 5fb503d HEAD@{38}: commit (amend): adword 小改,秒杀添加统计
12. 69078ac HEAD@{39}: commit: adword 小改
13. 514a570 HEAD@{40}: commit: 支付成功,统计修正入口位置
14. f608d5b (origin_newchic/wxl/dev_3.6.0, wxl/dev_3.5.3) HEAD@{41}: checkout: moving from dev to wxl/dev_3.6.0
15. e12032b (wxl/dev_3.6.0) HEAD@{42}: pull origin_newchic dev: Fast-forward
16. 5c36b13 (origin/dev) HEAD@{43}: checkout: moving from wxl/dev_3.6.0 to dev
```
在第15行记录可以看到,错误地 pull 了其它分支,期间 commit 了几次,在第1行记录还可以看出,把其它分支 merge 了过来。
后面用 git reset --hard f5c2290 来回退几个操作的时候,虽然命令显示已经退回到那个点,但 wxl/dev_3.6.0 整个分支的内容都不见了,这就触及我的知识盲区了。先 Mark,以后碰到类似的情况再研究。
```
1. f5c2290 HEAD@{27}: reset: moving to f5c2290
```
还好,wxl/dev_3.6.0 分支的内容不多,赶紧新建个 recover 分支,用 git reflog 显示记录后,再用 git cherry-pick 一个一个地 pick 过来。
```
1. f1d674e HEAD@{15}: cherry-pick: freegift rtl 翻转
2. fded62a HEAD@{16}: cherry-pick: adword 小改,秒杀添加统计
3. f1254ff HEAD@{17}: cherry-pick: adword 小改
4. 485d054 HEAD@{18}: cherry-pick: 支付成功,统计修正入口位置
5. f608d5b (origin_newchic/wxl/dev_3.6.0, wxl/dev_3.5.3) HEAD@{19}: checkout: moving from wxl/dev_3.5.3 to wxl/dev_recover
```
> 总结:
> 遇到分支或 commit 丢失的情况,先用 git reflog 显示 commit 的记录,再用 git cherry-pick xxxxxxx 来合并丢失的内容。这对组合命令几乎可以应对任何情况,但修改了内容而没有 commit 起来的我也没办法了。