V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
samleong019
V2EX  ›  问与答

一直不理解 git revert merge 时,为什么一定要加-m 参数

  •  
  •   samleong019 · 2019-12-05 15:38:57 +08:00 · 1856 次点击
    这是一个创建于 1807 天前的主题,其中的信息可能已经有所发展或是发生改变。

    官方的说明是,没有 -m 参数,git 就不知道以哪个 parent 为基础进行 diff 并 revert。

    但是执行 merge 操作的时候,肯定是在某个分支下进行的,比如在 A 分支下,执行 git merge B,显然是把 B 分支合并到 A 分支

    那么理所当然的,在 A 分支 revert 这次 merge 时,parent 当然是 A 分支的上次提交,也就是-m 1。所以不知道-m 这个参数,除了 1 之外的使用场景是什么呢(既然必须有这个参数,应该是有用的吧)

    4 条回复    2019-12-09 23:21:05 +08:00
    msg7086
        1
    msg7086  
       2019-12-06 07:00:54 +08:00
    首先,你怎么知道哪个提交是 A 分支的上次提交?

    -m 1 就是告诉 git,第一个提交是 A 分支的上次提交。如果是-m 2,就是告诉他第二个提交才是 A 的上次提交。
    msg7086
        2
    msg7086  
       2019-12-06 07:08:32 +08:00
    比如说有一个公共 Base A,然后一条分支上有 B,一条分支上有 C,这两条分支合并成了 D。

    即 D = git-merge(B, C)。

    这里 B 就是-m 1,C 就是-m 2。

    如果你在合并的时候,让 C 在前,就会变成

    D1 = git-merge(C, B)。

    这里 D 和 D1 的区别就只有元数据中两个 parent 的顺序。

    所以如果 A 是原始代码,B 和 C 各是一个补丁,而 D 是当前分支的时候,如果你要 revert D,自然会有取消 C 和取消 B 两种需求,也自然会需要-m 1 和-m 2。
    samleong019
        3
    samleong019  
    OP
       2019-12-09 19:54:34 +08:00
    @msg7086 抱歉今天才看到.. 对-m 参数的作用我倒是明白,但是总感觉不传的话,默认是 1 不也可以,为什么必须要设置这个参数呢
    msg7086
        4
    msg7086  
       2019-12-09 23:21:05 +08:00 via Android
    这就不知道啦,可能纯粹设计原因吧,要求显式指定。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2782 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 02:12 · PVG 10:12 · LAX 18:12 · JFK 21:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.