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

问一个 Git 问题

  •  
  •   ryougifujino · 2019-11-26 14:53:46 +08:00 · 2787 次点击
    这是一个创建于 1809 天前的主题,其中的信息可能已经有所发展或是发生改变。

    1.png 用户 A 开发完一个 feature1 后打算合并到主分支然后 push 到远程。

    git checkout master
    git pull --rebase
    

    这时候发现没有需要更新的内容。打算对 feature1 进行合并。

    可就在用户 A 合并的这个过程中,用户 B 提交了一个 commit 并 push 到远程。 2.PNG

    在这之后,用户 A 完成了 feature1 的合并。 3.PNG

    然后发现 push 不上去。(因为就在合并的这个过程中,用户 B 提交了新东西到 origin/master )

    于是用户 A 使用git pull --rebase打算更新后再 push。 4.PNG

    但是发现这个时候合并的那次 commit 不见了。

    好了,下面是问题:

    1.为什么最后一次git pull --rebase的结果不会保留 Merge branch 'feature1'的那次提交呢?

    (也就是这样)

    5.PNG

    2.难道这种情况下我只有 git pull 生成一个新节点(我不愿意看到的),还有什么其他好的方法解决这种情况吗?

    注:请仅仅考虑这种工作方式的解决方案

    12 条回复    2019-11-29 02:46:43 +08:00
    woodensail
        1
    woodensail  
       2019-11-26 15:05:46 +08:00
    看你的结果,理论上应该是第一次的 merge 结果直接被废弃了。我怀疑是发现 push 不上去时,直接把本地 master reset 到了远端的 master。也就是第二张图的样子,然后再执行了一次 rebase 把 feature1 rebase 过来了
    woodensail
        2
    woodensail  
       2019-11-26 15:08:50 +08:00
    其实本身 merge 一个分支后再去做 rebase 很容易冲突的,然后就是一锅粥。所以我发现 merge 后 push 失败,也是倾向于 reset 后重新 merge。而不是直接 rebase
    ryougifujino
        3
    ryougifujino  
    OP
       2019-11-26 15:27:38 +08:00
    @woodensail #2 重新 reset 确实是一个方法,理论上来说 push 不上去就 reset,然后 pull 主分支再 merge feature,如果还是 push 不上去就再重复这一过程总会提上去。
    woodensail
        4
    woodensail  
       2019-11-26 15:34:45 +08:00
    @ryougifujino 嗯,刚刚有个小项目偷懒,merge 之后发现有更新,然后做了 rebase,结果出现了和你一样的结果,merge 丢失……
    很是神奇,不知道发生了什么……
    LuckyBoyGirl
        5
    LuckyBoyGirl  
       2019-11-26 15:39:07 +08:00   ❤️ 1
    直接对比那次 commit 的代码,compare branch 然后再 push
    maichael
        6
    maichael  
       2019-11-26 15:41:58 +08:00
    这不就是因为 rebase 么。如果你要保留 merge 的 commit,用 rebase 干嘛。
    jeffh
        7
    jeffh  
       2019-11-26 16:10:42 +08:00
    其实并没有丢失,只是变成游离态,没 branch 指针后界面就不显示了。原来 merge 提交的节点你可以 reflog 看下 commitId,然后在 checkout 到该 id 上,打上一个分支指针,这个时候就能看到了。
    bertonzh
        8
    bertonzh  
       2019-11-26 16:16:25 +08:00
    reset 到合并前,pull --rebase,merge,push
    momocraft
        9
    momocraft  
       2019-11-26 16:19:20 +08:00
    pull 包括 rebase / merge 的时候过于“自动”。

    我现在几乎不用 pull,每次 git merge && git rebase origin/SOME_BRANCH
    momocraft
        10
    momocraft  
       2019-11-26 16:19:35 +08:00
    #9: 应为 git fetch && git rebase
    jeffh
        11
    jeffh  
       2019-11-26 16:31:47 +08:00
    接#7,复现了楼主的场景,git reflog => git checkout => git branch the-merged-branch 之后如图,merge 节点还是在的。
    发布了图,图片地址 base64: aHR0cHM6Ly9pLmxvbGkubmV0LzIwMTkvMTEvMjYvVldHaTZrM1h2c0FJQlJ4LnBuZw==
    SoloCompany
        12
    SoloCompany  
       2019-11-29 02:46:43 +08:00 via iPad
    希望保留 merge commit 应该使用 git rebase -m

    并且不能使用 -i

    RTFM
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2836 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 02:21 · PVG 10:21 · LAX 18:21 · JFK 21:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.