有两个待开发功能 a 和 b,两个人 A 和 B, A 负责 a,B 负责 b 。
a 开始和 b 都在 dev 分支开发,然后被指出 a 要单独用分支开发,然后第三人剥离了两个功能的代码,A 在本地开了新 test 分支继续开发 a,后续也从 test 分支提交测试上线,B 继续在 dev 分支开发 b,A 在开发了一段时间后应该是又合了一版 dev 分支的代码,部分公共文件解冲突的时候应用的是 A 本地的代码( A 的本地代码是老版),A 现在已经把 a 提交到线上的 master 分支。现在 B 拉取线上 master 的代码,由于本来应该冲突的地方之前被 A 解了冲突并应用了 a 的代码,但实际上是要用 B 的新代码。现在 B 要怎么尽量保留 A 的代码,并且把 B 的代码 merge 进 master 呢。
简述就是:部分文件应该用 B 的新的,但是 A 已经解冲突用了老的并推到了线上,现在 B merge master 分支,明明不一样的地方,但是因为 A 已经解过,所以直接就用了 A 的解决方案。现在 B 希望 merge master 分支到本地 dev 分支,有代码不同的地方 git 都能提示出来,解好后该谁要改就谁改。
这种情况虽然都不想看到,但是发生了,只希望好好解决就好。希望看到的老哥能给个好的解。唉。
1
christin 2021-04-13 22:18:35 +08:00 via iPhone 1
提供一个思路 没有任何实际操作经验
B 拉 master 回退版本到 A 提交之前 把 dev merge 进 master 再提交上去 A 再拉取 merge |
2
miloooz OP @christin 感觉有点问题。本来是 A 和 B 完成功能后的分支合并,master 只是一个结果分支,忽略掉 master 分支。A 在中途 merge B,假设当时 B 的 历史节点为 H1,也就意味 H1 之前的代码合并都按照 A 的来,等 ab 的功能都完成后 A 和 B 来 merge,发现 A 在 H1 节点有过合并,那 H1 之后的可能是要解冲突,但 H1 及之前的冲突点还是会按照 A 之前的解决吧。明天会试一下,谢谢解答。
|
3
msg7086 2021-04-14 05:07:12 +08:00 via Android 1
首先要确定的是,dev 或 master 上是不是只包含 A 的代码,并且不包含 B 的代码?
如果是,那说明现在的状态是正确的,B 需要 rebase 到 A 的成品上,然后自行处理冲突,然后再合并回主干。 |
4
towry 2021-04-14 09:30:47 +08:00
👇 不是此问题的解决方案。
1. 我们是任何功能都要从 master 分支切出自己的分支。然后开发完后合到沙盒分支上测试。 2. master 是禁止 push 的,即使你是最高权限的人。 3. 任何分支切出后都需要在 gitlab 自建托管上建一个 merge request 。 [1] 多个功能在一个分支上,这种还是尽量避免,即使需要两个功能在一起,也可以建个临时的分支用。 [2] 的做法是为了防止任何人误 push 代码。 [3] 的做法,1 是为了方便他人 review 代码,2 是为了追踪远程分支,只要分支合到 master,远程分支会自动删除,避免代码库里有很多分支,但是不清楚哪些分支在用还是已经合过或者弃用。3 是如果有人不小心将分支彻底删除了(本地删除+远程删除),但是因为在 gitlab 上有 merge request 记录,可以根据这个记录拿到 commit hash,进而可以恢复代码的。 |
5
pkoukk 2021-04-14 09:48:36 +08:00 1
master 回退回去,然后从 master 签出一个新分支,从 A 和 B 的分支 cherry pick,最后提交回 master
不过问题在于如果 A 和 B 的 commit 粒度不大合理,搞起来就很难受 |