我怎么能告诉git"让这个分支HEAD看起来就像这个其他分支HEAD"?
我们有一些关于develop
开发,分支发布以及尽一切可能使发布分支工作的历史。但我们对更新master
一直不严格。幸运的是,我们有实际发布的标签。我们现在想要事后,使master
成为已发布的一系列版本。
这不仅仅是解决所有合并冲突,而且还有#34 ;;如果愿意的话,我希望所有差异已经解决了"他们的#34;例如,如果在release/1
过程中我们将 x = x + 1; 添加到 Foo.java ,但从未将其添加到develop
或release/2
,然后当我们将release/1
传递给master
时,此行应该在那里,但是当我们将release/2
传递给master
时,它应该消失。明白,在历史上任何地方都没有任何改变,删除线;它只是被添加到一个死胡同。
另外,我认为git rebase ....
并不是我想要的:我不想失去深刻的历史。在我为第1版到第37版成功完成此操作后,git log master
应显示实际为每个版本做出贡献的所有更改(可能还有一些合并修复提交)。
答案 0 :(得分:3)
如果我理解正确,你基本上想要在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
更快地执行此操作,release/X
通过获取给定的树ID和父ID来向存储库添加新提交。由于所需的新树与某些现有树(master
的树)100%相同,因此您只需要识别所需的父提交(可能是最初指向的master
),创建新提交,以及make from tempfile import TemporaryFile
f = TemporaryFile()
ns = "http://www.w3.org/2000/svg"
xmlgen = XMLGenerator(f)
xmlgen.startDocument()
xmlgen.startPrefixMapping("ns1", ns)
xmlgen.startElementNS((ns, "svg"), "ns1:svg", {})
f.seek(0)
print(f.read())
<?xml version="1.0" encoding="iso-8859-1"?>
<ns1:svg xmlns:ns1="http://www.w3.org/2000/svg">
指向那个,而不用打扰索引和工作树。如果你有很多这样的发布/ N项要做,这样会更快,它只是有点棘手。
答案 1 :(得分:1)
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}
但没有太多理由。你可以改为标记它,如果它甚至值得那么。