V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
miloooz
V2EX  ›  git

git 问题求各位老哥解

  •  
  •   miloooz · 2021-04-13 22:06:52 +08:00 · 1408 次点击
    这是一个创建于 1080 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有两个待开发功能 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 都能提示出来,解好后该谁要改就谁改。

    这种情况虽然都不想看到,但是发生了,只希望好好解决就好。希望看到的老哥能给个好的解。唉。

    5 条回复    2021-04-14 09:48:36 +08:00
    christin
        1
    christin  
       2021-04-13 22:18:35 +08:00 via iPhone   ❤️ 1
    提供一个思路 没有任何实际操作经验
    B 拉 master 回退版本到 A 提交之前 把 dev merge 进 master 再提交上去 A 再拉取 merge
    miloooz
        2
    miloooz  
    OP
       2021-04-13 23:15:43 +08:00
    @christin 感觉有点问题。本来是 A 和 B 完成功能后的分支合并,master 只是一个结果分支,忽略掉 master 分支。A 在中途 merge B,假设当时 B 的 历史节点为 H1,也就意味 H1 之前的代码合并都按照 A 的来,等 ab 的功能都完成后 A 和 B 来 merge,发现 A 在 H1 节点有过合并,那 H1 之后的可能是要解冲突,但 H1 及之前的冲突点还是会按照 A 之前的解决吧。明天会试一下,谢谢解答。
    msg7086
        3
    msg7086  
       2021-04-14 05:07:12 +08:00 via Android   ❤️ 1
    首先要确定的是,dev 或 master 上是不是只包含 A 的代码,并且不包含 B 的代码?

    如果是,那说明现在的状态是正确的,B 需要 rebase 到 A 的成品上,然后自行处理冲突,然后再合并回主干。
    towry
        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,进而可以恢复代码的。
    pkoukk
        5
    pkoukk  
       2021-04-14 09:48:36 +08:00   ❤️ 1
    master 回退回去,然后从 master 签出一个新分支,从 A 和 B 的分支 cherry pick,最后提交回 master
    不过问题在于如果 A 和 B 的 commit 粒度不大合理,搞起来就很难受
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1515 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 23:56 · PVG 07:56 · LAX 16:56 · JFK 19:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.