请教一下,是谁把代码合丢了

2022-07-20 16:25:36 +08:00
 magic3584

请教各位大佬,是谁把代码给合丢了,如下图,黄色为 master:

我的猜测是 B 在合并的时候给合没了,但是有个疑问就是 B 合并的时候应该会有冲突的而不是 fast forward 的吧?最开始我只看 master 的提交以为是 A 合没了。

请大佬指点

  1. 到底是谁给合没了
  2. 这个图看着确实不知道怎么去找是谁?请问是否有更清晰的图?
  3. 为什么 A 会从 B 的分支上合并到 master
10823 次点击
所在节点    git
68 条回复
dablwow
2022-07-21 17:46:32 +08:00
搞丢代码的 commit 在 diff 上未必显示为删除,因为 merge diff 显示的是"外部 commit 相对于当前分支的改动",而不是反过来。

举个例子,master 一开始有 A 这一行代码,然后切出个人分支;

后面 master 新增了 B (此时代码为 A+B ),个人分支新增了 C (此时代码为 A+C )

当个人分支 merge master 时,假设冲突正确处理,显示的 diff 是+B ,而不是+C ;
如果冲突处理有误,把 B 搞丢了,那 diff 什么都不显示,而不是-B
dablwow
2022-07-21 17:48:19 +08:00
@dablwow #61 所以,楼主查看最早丢代码的 commit 的思路是对的,只是不能通过 diff 的"-B"去判断,而是要找"没有+B"的 diff
preper
2022-07-22 15:32:52 +08:00
这种 merge 丢代码问题一般是解决冲突解决的不对,解决冲突时把某些应该 merge 进去的改动抛弃掉了,再合进去就会导致代码丢失。具体错误操作流程可以参考 juejin.cn/post/6844903511453335559
没想到这个问题意外的经常会看到。导致这个问题的原因,除了解决冲突的人对 git 理解不深之外,团队的 git 工作流可能也有问题。建议 merge 产生冲突的时候,不要直接解决 merge 的冲突,而是 merge --abort 然后 rebase 主分支来解决冲突,这样解决冲突后的代码在 commit 里而不是在 merge 里,更容易排查问题
magic3584
2022-07-22 16:54:40 +08:00
@preper #63
看了下链接,对第 3 步有点不解。3 没有修改 file2 ,会啥 file2 会丢失呢
preper
2022-07-22 17:13:47 +08:00
@magic3584 因为 merge 的时候产生冲突了,这时未冲突的文件( file2 )在暂存区,冲突文件( file1 )解决冲突后也会放到暂存区,然后 merge --continue ,merge 结束。但如果解决冲突的人把未冲突的文件( file2 )从暂存区移除了(码农 os:我靠这代码不是我写的,为啥会有这个提交?删掉删掉!),导致
preper
2022-07-22 17:16:29 +08:00
@preper 导致 merge --continue 之后没有提交 file2 ,结果别人 file2 的修改就被顶掉了。最恶心的是这种修改不会体现在文件的 history 里,查看文件修改的 history 找不到文件回滚的原因,只能在指定的 merge commit 信息里看到文件的改动。所以我跟很多同事都推荐过,解决冲突尽量依靠 rebase 解决,这样冲突解决错误了还能在普通 commit 里追溯
preper
2022-07-22 17:21:13 +08:00
>>> 把未冲突的文件( file2 )从暂存区移除了
这个步骤也有可能是在 git 的某些 GUI 中没有提交对应的修改导致的
magic3584
2022-07-22 17:28:43 +08:00
@preper #65
我一直用的 GUI ,冲突的显示 unstaged ,未冲突都是 staged ,我也没有手动去暂存区删过东西。

我之前只看 master 所以以为是 4A 搞丢的,但实际上,3B 从 1A 合并解决的时候已经搞丢了,只不过 4A 后来又合并了一下。
结论应该是 3B 给搞丢的,不知道我理解的是否正确呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/867567

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX