我一直在挖掘git merge和rebase docs,而且还有一些东西没有下沉。我正在Git中积极开展一个项目,需要与其他开发人员分享具体的里程碑。我希望与每个里程碑/版本完全一样地共享代码,但不是所有的小提交都会导致每个版本。
如何创建镜像开发分支的发布分支,其中发布分支上的提交每个都包含来自开发分支的多个提交?换句话说,发布分支应该具有压缩历史,但在其他方面与开发分支相匹配。
最初,我原本以为使用单独的分支并使用git merge --squash会有效,创建一个新的分支,其中包含一系列提交,这些提交反映了每个版本之间的全部更改。我现在明白git merge --squash不能用于重复使用。
Git rebase会将多个提交合并为一个大型提交,但由于它会更改提交历史记录,不会更改我的私人历史记录以及公开发布吗?
我不想丢失我的小更改历史记录,但希望将组合提交推送到共享服务器。
答案 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。对于所有版本我想要压缩我替换pick
与squash
。然后只需保存并退出。完成。