【问题标题】:Rebasing commits that are identical in content, but different in hash重新设置内容相同但哈希值不同的提交
【发布时间】:2020-01-09 09:00:52
【问题描述】:

在我从事的一个项目中,有一个奇怪的系统,在该系统中,我基本上可以输入新的提交以附加到 master。与其在放入补丁时提交补丁,不如在其元数据中稍作修改(尽管内容是 100% 相同的)。不幸的是,这意味着我的本地提交 ID 在通过系统后与远程提交 ID 不匹配。即,假设我有一个远程存储库的本地副本,其中包含三个提交:

C1 -> C2 -> C3

现在我在本地创建三个新的提交,X4X6

C1 -> C2 -> C3 -> X4 -> X5 -> X6

然后我将X4 提交到系统中,将其更改为C4(内容相同,哈希不同)。这意味着遥控器现在有

C1 -> C2 -> C3 -> C4

还有我的本地人

C1 -> C2 -> C3 -> X4 -> X5 -> X6

我想从远程C4 中提取,删除我的本地X4 并将X5 附加到`C4,以便我在本地获取:

C1 -> C2 -> C3 -> C4 -> X5 -> X6

现在我通过本地运行git format-patch,然后是git reset --hard origin/mastergit pull,然后是git am,只运行X5X6。这是一个烦人且乏味的过程,有没有更好的方法?

【问题讨论】:

  • 我已更新答案以删除可选步骤
  • 请注意,如果从 C3 到 C4 的差异匹配从 C3 到 X4 的差异,git rebase 将自己省略 C4。如果它这样做,X4 中的快照必须与 C4 中的不同,足以使两个git diffs 产生不同的git patch-ids。

标签: git rebase


【解决方案1】:

本地回购

C1---C2---C3---X4---X5---X6 (master)

远程回购

C1---C2---C3---C4 (origin/master)

从远程获取更改 (来源)

git fetch origin

本地回购

C1---C2---C3---X4---X5---X6 (master)
           \
            C4 (origin/master)

将当前分支变基 (master) 到 C4 并省略 X4

git rebase --onto C4 X4

本地回购

C1---C2---C3---C4---X5---X6 (master)
                \
                 (origin/master)

More info on rebase onto

【讨论】:

    【解决方案2】:

    交互式变基可以解决问题。

    你应该可以做一个git pull --rebase=i
    在交互式 UI 中,要放弃 X4 提交,请将“pick”替换为“drop”或“d”。

    rebase 文档:https://git-scm.com/book/en/v2/Git-Branching-Rebasing

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 2016-07-03
      • 2015-09-08
      • 2015-02-25
      • 2021-03-25
      • 1970-01-01
      相关资源
      最近更新 更多