DawnMoon
V2EX  ›  问与答

对于不允许 merge 只允许 rebase 的开源项目,各位怎么看?这是一个好习惯吗?

  •  
  •   DawnMoon · Nov 28, 2024 · 4061 views
    This topic created in 706 days ago, the information mentioned may be changed or developed.

    比如 https://github.com/ArduPilot/ardupilot 这个项目,明确规定只允许 rebase 不许 merge 。

    这是一个好习惯吗?

    29 replies  •  2024-11-29 09:27:44 +08:00
    murmur
    murmur
    Nov 28, 2024
    1
    rebase 做出来的树一条直线,贼 tm 漂亮,我以前做过有的项目就是用 rebase
    RightHand
    RightHand
    Nov 28, 2024 via Android
    2
    当成 svn 来用呗
    kera0a
    kera0a
    Nov 28, 2024 via iPhone
    3
    无所谓吧,merge 和 rebase 合并其实没本质上的区别
    000sitereg
    000sitereg
    Nov 28, 2024
    4
    我是能 rebase 就不 merge 。rebase 的时候有冲突就处理。从常理理解,别人先提交,log 中就在我之前,一条直线很好理解。
    Wxh16144
    Wxh16144
    Nov 28, 2024
    5
    无所谓 +1, 两个都做到会用,严于律己即可,别人如何规定就遵循他的规则罢了
    malusama
    malusama
    Nov 28, 2024
    6
    没什么差别啊, 而且 rebase 漂亮多了
    zsc8917zsc
    zsc8917zsc
    Nov 28, 2024
    7
    rebase 有代码覆盖的风险啊~
    GeruzoniAnsasu
    GeruzoniAnsasu
    Nov 28, 2024
    8
    这么说,rebase 之于 merge 约等于 golang 之于 c++
    donaldturinglee
    donaldturinglee
    Nov 28, 2024
    9
    merge 的话用 git log graph 有时候脑一抽不容易看得清楚...
    zealot0630
    zealot0630
    Nov 28, 2024 via Android
    10
    当你需要 bisect 时候,就知道好处了
    jim9606
    jim9606
    Nov 28, 2024 via Android❤️1
    11
    一般用 rebase,用不了的时候采用 merge 。不能用 rebase 的原因有:
    1. 分支不是私有的,已经被多人 checkout 或者 branch,rebase 会对合作者的工作流造成破坏
    2. 需要保留原始提交的时间轨迹,例如分支发布过版本
    3. commit 带 gpg 签名,rebase 毫无疑问会破坏签名
    4. 分支差异过大,rebase 过程会大量 conflict

    svn 和 git 的根本性区别是集中式 vs 分布式,只是因为 git 的 branch 成本低所以能玩得转频繁分支的工作流
    wysnxzm
    wysnxzm
    Nov 28, 2024
    12
    回滚找不到节点的时候就老实了
    virusdefender
    virusdefender
    Nov 28, 2024
    13
    我一般 rebase master 之后再 merge
    serco
    serco
    Nov 28, 2024
    14
    从前也是 rebase ,后面遇到几次莫名代码丢了就不这么干了
    julyclyde
    julyclyde
    Nov 28, 2024
    15
    @kera0a 最终内容没区别,但是实施代价的区别极大
    julyclyde
    julyclyde
    Nov 28, 2024
    16
    @zsc8917zsc 为什么会覆盖?
    jybox
    jybox
    Nov 28, 2024❤️2
    17
    准确地说是只允许 fast forward 的 merge ,即需要合并的分支基于目标分支的最新版本,如果不是的话就需要 rebase 到最新版本再 merge 。

    除了历史看着「干净」之外,我觉得最大的好处是在 rebase 之后、merge 之前,你还有机会检查你的代码、运行测试(其他人也可以在 PR 上继续 review 、CI 也会重新运行)。而在 GitHub 上直接点 merge 的话改动就直接被合并到目标分支,没有就会再检查了(当然你可以在本地 merge 并检查)。

    很多时候即使 merge 没有冲突,代码也可能会跑不起来。
    wen20
    wen20
    Nov 28, 2024
    18
    https://jhall.io/archive/2024/01/11/when-i-dont-rebase/
    这篇说的最好,
    总结一句话:rebase 只用在自己本地分支。
    wen20
    wen20
    Nov 28, 2024
    19
    公共分支 rebase 如同沙滩拉屎,个人很方便, 然而别的伙伴需要避免踩屎。
    yooomu
    yooomu
    Nov 28, 2024
    20
    通常 feat branch 会使用 rebase ,但是往 master 合并代码时使用 merge ,这样链路非常清晰
    Rache1
    Rache1
    Nov 28, 2024
    21
    如果只想保持 master 分支整洁的话,其实 merge 的时候加个 --squash 就好了。
    newtype0092
    newtype0092
    Nov 28, 2024
    22
    @wen20 和 rebase 比起来,merge 才更像拉屎,大家都可以方便的在空地来一坨,最后这个“雷区”会越来越大。
    只能 rebase 是要求主分支迭代时严格的链式结构管理,说白了就是让并发开发的人通过额外的工作来保证 feature 被串行的 merge ,但对于其他读者,但串行的版本链肯定比并行的版本树清晰易懂的多。
    chatgptnext
    chatgptnext
    Nov 28, 2024
    23
    来一次线上事故就老实了😋
    ensonmj
    ensonmj
    Nov 28, 2024 via iPhone
    24
    squash 再 rebase ,清晰
    crysislinux
    crysislinux
    Nov 28, 2024 via Android
    25
    你自己的开发分支在有其他人参与之前随便 rebase 还是 merge 。有人参与之后就只 merge ,最后合并到 main 的时候 squash merge 清理一下。
    mayli
    mayli
    Nov 29, 2024
    26
    没太大区别…repo 制定了就遵守就好了
    tags
    tags
    Nov 29, 2024
    27
    如果是明显的特性分支合并就用 merge ,保留时间线。如果是独立的提交就用 rebase ,基于最新做改动。
    whyrookie
    whyrookie
    Nov 29, 2024
    28
    我一个人的项目,有时候可能有多个分支一同开发,通常先 rebase 再回到主分支进行 merge
    twelvechen
    twelvechen
    Nov 29, 2024 via iPhone
    29
    我们组的项目不允许使用普通 pull ,merge 必须使用 fast-forward ,也就是有冲突必须 rebase 。目前没遇到什么问题,体验良好。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2926 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 65ms · UTC 12:29 · PVG 20:29 · LAX 04:29 · JFK 07:29
    ♥ Do have faith in what you're doing.