公共版本的Git rebase / merge

时间:2009-09-25 21:26:47

标签: git

我一直在挖掘git merge和rebase docs,而且还有一些东西没有下沉。我正在Git中积极开展一个项目,需要与其他开发人员分享具体的里程碑。我希望与每个里程碑/版本完全一样地共享代码,但不是所有的小提交都会导致每个版本。

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

最初,我原本以为使用单独的分支并使用git merge --squash会有效,创建一个新的分支,其中包含一系列提交,这些提交反映了每个版本之间的全部更改。我现在明白git merge --squash不能用于重复使用。

Git rebase会将多个提交合并为一个大型提交,但由于它会更改提交历史记录,不会更改我的私人历史记录以及公开发布吗?

我不想丢失我的小更改历史记录,但希望将组合提交推送到共享服务器。

2 个答案:

答案 0 :(得分:7)

当然,如果您的提交都值得保留并构成您的公开发布工作,那么它们应该成为您发布的历史记录的一部分吗?如果您不想发布完整的存储库历史记录,那么最好只使用git archive创建发布tar包。

话虽如此,如果你真的想要创建一个具有单独历史记录的发布分支,那么它是可能的。但是,您正在为自己设置更多维护开销,因为您永远无法从私有历史记录合并到公共发布分支,因为这会将所有私有历史记录带到您的发布分支。这就是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

您可以为每个版本(或子版本)执行此操作,并且新的提交将直接在之前的版本之上构建,而不会合并您的任何私人历史记录。

答案 1 :(得分: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。对于所有版本我想要压缩我替换picksquash。然后只需保存并退出。完成。