使 git 只是*复制*(而不是合并)?

Make git just *copy* (not merge)?

我怎么知道git"make this branch HEAD look just like this other branch HEAD"?

我们有一些在 develop 上开发的历史,分支发布,并尽一切努力使发布分支工作。但是我们在更新 master 方面一直松懈。幸运的是,我们有实际发布内容的标签。我们现在想要 post hoc,使 master 成为发布版本的系列。

这不仅仅是解决所有合并冲突"theirs";如果您愿意,我希望所有 差异 都得到解决 "theirs"。例如,如果在 release/1 过程中我们将 x = x + 1; 添加到 Foo.java,但从不将其添加到 developrelease/2,然后当我们将 release/1 传递到 master 时,该行应该存在,但当我们传递 release/2 时到 master,它应该会消失。明白,历史上任何地方都没有删除这条线的变化;它只是被添加到死胡同分支。

此外,我认为git rebase ....不是我想要的:我不想失去深厚的历史。一旦我为版本 1 到 37 成功完成此操作,git log master 应该显示实际对每个版本做出贡献的所有更改(并且可能还有一些合并修复提交)。

如果我理解正确的话,你基本上想在 master 上做一个新的提交,实际上,删除 master 下的所有内容并将其全部替换为(并且仍然是)是)在 release/X.

有更短更快的方法可以做到这一点,但我会先向您展示较慢的方法,因为我认为它更清晰。请注意,这假设您位于 git 目录的顶层(git rev-parse --show-cdup 会告诉您可能需要多少 ../ 才能达到该级别):

$ git checkout master           # onto the branch we want to whack
$ git rm -rf .                  # remove everything
$ git checkout release/X -- .   # repopulate index and work tree
$ git commit                    # and commit the result

如果这确实是您想要执行的操作,请注意您可以使用 git commit-tree 更快地执行此操作,它通过获取给定的树 ID 和父 ID 将新提交添加到存储库。由于所需的新树与某些现有树(release/X 的树)100% 相同,因此您只需要确定所需的父提交(大概是 master 最初指向的任何内容),创建新提交,然后让 master 指向那个,而不用担心索引和工作树。如果你有很多这些 release/N 项目要做,这样会更快,只是有点棘手。

git checkout -B master release/X       # release/X is the new master version

就是你想要的。当前 master 历史记录中没有任何内容是相关的,因为您只是 release/X 整体。

如果你真的真的必须让被遗弃的历史可以从你的活动工作中访问,

git checkout -B master release/X       # release/X is the new master version
git merge -s ours --no-ff master@{1}

但这没有太多理由。如果它值得的话,你可以标记它。