2016-03-02 73 views
1

我该如何告诉git“让这个分支HEAD看起来像这个其他分支HEAD”?使git只是*复制*(不合并)?

我们有一些开发develop的历史,为发布版本进行分支,并尽一切努力使版本分支工作。但我们一直在更新master。幸运的是,我们为实际发布的内容添加了标签。我们现在希望事后让master成为一系列发布版本。

这不仅仅是解决所有合并冲突“他们的”;我希望所有的差异解决“他们的”,如果你愿意。例如,如果在release/1过程中我们添加了x = x + 1;Foo.java,但从来没有补充说,为developrelease/2,那么当我们提供release/1master,这条线应该有,但当时我们已经完成release/2master,它应该消失。了解,历史上任何地方都没有改变线路的改变;它只是被添加到一个死胡同的分支。

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

回答

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 [email protected]{1} 

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

+0

我喜欢jthill比torek更好,因为它保留了历史记录(git log)。诚然,对我来说这只是一个“高兴”,实际上我的原始声明使得它看起来确实是不受欢迎的(所以错误不在于托瑞克的建议)。猜猜我已经进化了! – jackr

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更快地完成此操作,该操作通过获取给定的树ID和父ID来向存储库添加新的提交。由于所需的新树与某个现有树(release/X)完全相同,因此您只需标识所需的父提交(大致指master指向最初),创建新提交,并使master指向那个,而不打扰与索引和工作树。如果你有很多这样的release/N项目,这样做会更快,只是有点棘手。

+0

对于'commit-tree'并没有那么棘手:'git commit-tree -p master release/X^{tree}'。 – PetSerAl

+0

@PetSerAl:当然,但是在stdout上产生新的提交ID。然后,您必须使用'git update-ref'来更新'master'来指向新的提交 - 或者在做出一系列提交的情况下,保持循环使用前一个提交作为它的父对象,并且最后做一次更新。 (这是我正在做的,但没有时间详细写出来。) – torek