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

请教,合并 remote 的分支,出现遗漏情况,是什么问题?

  •  
  •   klgd · 2022-09-29 10:18:11 +08:00 · 1655 次点击
    这是一个创建于 788 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如上图,第一次 merge 是从 style 那条,后来发现 3908 那条没有被 merge ,又进行了第二次 merge

    我的问题是: 每次 merge 都是从 remote 的 develop 分支 merge 的,而且从时间上来看 3908 那条提交在前,为什么会出现漏下的情况?

    11 条回复    2022-09-29 17:05:54 +08:00
    geelaw
        1
    geelaw  
       2022-09-29 10:23:34 +08:00
    有很多可能的原因,比如没有 fetch 就 merge ,或者 merge 之后 3908 才被 push 上去(那个时间并不是 push 的时间,而且 commit 的两个时间也是可以随便写的)。
    klgd
        2
    klgd  
    OP
       2022-09-29 10:41:55 +08:00
    @geelaw #1 “没有 fetch 就 merge ” 这个说的是本地分支吗?直接从 remote 分支合并不需要这个吧
    3908 可以确认是合并前已经 push 到 remote 分支了
    fulvaz
        3
    fulvaz  
       2022-09-29 10:49:51 +08:00
    用这个吧
    git fetch origin develop
    git merge FETCH_HEAD
    amosasas
        5
    amosasas  
       2022-09-29 11:02:27 +08:00
    @klgd 应该是要 fetch remote 到本地进行 rebase/merge 的
    ericls
        6
    ericls  
       2022-09-29 11:16:17 +08:00 via iPhone
    @klgd 需要。git 是分布式的 远程分支也是需要同步到本地的
    nothingistrue
        7
    nothingistrue  
       2022-09-29 11:17:06 +08:00
    @klgd #2 remotes/origin/develop 也是本地的,它是本地对远程分支的引用。fetch 过程,本质上就是从远程仓库刷新本地仓库的 remotes 引用,merge (不指定分支的默认情况)才是同步 remotes/origin/develop 到 develop 。
    klgd
        8
    klgd  
    OP
       2022-09-29 11:57:46 +08:00
    @amosasas #4
    @ericls #6
    @nothingistrue #7
    @fulvaz #3

    感谢大家的回复
    ![]( )

    之前一直是用 jetbrains 的 Git 功能操作的
    ` git -c credential.helper= -c core.quotepath=false -c log.showSignature=false merge --log --no-ff remotes/origin/develop`

    确实没有 fetch ,很奇怪,之前怎么没出现这个情况,难道之前都是事先 fetch 了,自己没注意,懵了
    Hug125
        9
    Hug125  
       2022-09-29 15:54:11 +08:00 via iPhone
    idea 有个插件 可以定时 fetch
    好像是 git box
    geelaw
        10
    geelaw  
       2022-09-29 16:09:03 +08:00   ❤️ 1
    @klgd #2 推荐的思考方法:假设你先上线,完成同步,此时 remote/branch 是 A ,然后离线,然后有人 push B 到 remote 的 branch ,然后你在离线的状态下 git merge remote/branch ,请问这是在 git merge A ,还是 git merge B ,还是 merge 不会成功呢?

    当然,我们相信 git 的设计是良好的,一个重要的特征就是各种操作的效果都尽量可预期,为此目的应该让本质上有不确定效果的操作(如 fetch ,它的效果取决于网络环境和远程计算机上的状态)尽量单独成立。我们 merge 的时候会先想好要 merge 的 commit 是谁,然后才操作,如果 merge 会自动 fetch ,那么它的效果就无法预期(因为我们看好的 branch 可能在 fetch 的时候变更),因此可以推断 merge 的时候不会自动 fetch ,此外 pull 的效果通常是 fetch+merge ,如果 merge 会自动 fetch ,那就没有单独成立 pull 的需要了。

    另外你可以看到 git 自动生成的消息表述十分准确,remotes/origin/develop 是 remote-tracking branch ,不是 remote branch 。
    klgd
        11
    klgd  
    OP
       2022-09-29 17:05:54 +08:00
    @geelaw #10 感谢,之前理解有偏差,我知道 git fetch 后再 merge ,不过没往这方面想,以为 jetbrains 在合并时做了这些事情


    @Hug125 #9 谢谢 我一会儿去看看
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1075 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 22:45 · PVG 06:45 · LAX 14:45 · JFK 17:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.