2009-09-25 63 views
5

我一直在挖掘git合并和rebase文档,并且没有陷入困境。我正在积极研究Git中的项目,并且需要与其他人分享特定的里程碑开发人员。我想要按照每个里程碑/版本中的内容精确分享代码,但不是所有提交到每个版本的小型提交都是如此。Git重定位/合并公开发布

如何创建一个反映开发分支的发布分支,其中发布分支上的提交每个都包含来自开发分支的多个提交?换句话说,发布分支应该有一个压缩的历史记录,但在其他方面与开发分支匹配。

最初,我曾想过使用单独的分支并使用git merge --squash会很有效,创建一个新的分支,并提交一系列反映每个发行版之间所有更改的提交。我现在明白,git merge --squash不适用于重复使用。

Git rebase可以将多个提交合并成一个大的提交,但是因为它改变了提交历史,不会改变我的私人历史以及公共发布?

我不想失去我的小变化的历史,但想要将联合提交推送到共享服务器。

回答

7

当然,如果你的提交都值得保留并构成你的公开发布工作,那么它们应该构成你发布的历史记录的一部分?如果你不想发布完整的版本库历史记录,那么使用git archive创建发行版tarball可能会更好。

话虽如此,如果你真的想创建一个具有独立历史的版本分支,那么这是可能的。你是在和自己的更多的维护开销,不过,因为你永远无法从您的私人记录合并到你的公开发布分支,因为这将带来所有的私人历史,你的发行版分支。这就是git所做的事情;它跟踪来自哪里的变化。

您可以从发布分支合并到专用小,但由于你的工作(大概)从私有分支即将在今年不会得到你很多。您最简单的选择是有一个单独的发布分支,其中只包含发布点处的专用分支状态的快照提交。

假如你已经达到你想要创建一个提交基于当前发布分支(release)提交的私有分支(private)点,并假设你有树被释放签出与没有改变索引,这是你可以做的。

# Low-level plumbing command to switch branches without checking anything out 
# (Note: it doesn't matter if this branch hasn't yet been created.) 
git symbolic-ref HEAD refs/heads/release 

# Create a new commit based on the current index in the release branch 
git commit -m "Public release commit" 

# Switch back to the private branch 
git checkout private 

您可以为每个版本(或子释放)和新的承诺将在以前版本的基础上直接内置在不结合任何您的私人历史的做到这一点。

+0

这当然可以。为我工作:) – 2009-09-26 00:49:15

+0

谢谢,查尔斯。这就是我要找的。 – Neil 2009-09-26 01:09:54

2

只要创建一个新的分支,并在那里做所有的挤压。然后发布。其他分支中的小型提交仍将存在。

我对这个工作流会是这个样子:

git co -b release_branch_squash release_branch_with_all_commits 

git rebase last_release_tag 

现在是时候来应对可能出现的所有冲突。我真的不知道 知道如何避免这种情况。通常情况下,这并不是什么大问题。无论如何,我的git 存储库已经记录了大多数冲突解决方案。

git rebase --interactive last_release_tag 

这会带来vim。对于我想要压扁的所有版本,我将pick 替换为squash。然后保存并退出。完成。

+0

你能详细说一下吗?从像http://stackoverflow.com/questions/1464642/git-merge-squash-repeatedly/1465119#1465119评论它看起来像重复合并--squash不会工作。当我尝试过这些时,即使文件具有共同的历史记录,我也会得到非常长的冲突列表。如果我理解正确,git merge --squash将创建一个不共享旧提交历史记录的新提交,因此未来的合并不会有共同的祖先。 你已经描述了我想要的行为,但是我绊倒了让Git去做。 – Neil 2009-09-25 23:38:33

+0

我用我的建议工作流更新了答案。尽管我必须承认Charles Bayleys解决方案可能更适合您的需求。 – davrieb 2009-09-26 01:31:43