Git rebase/merge 用于公开发布

标签 git

我一直在深入研究 git merge 和 rebase 文档,但没有深入了解。我正在积极地使用 Git 开发一个项目,需要与其他开发人员分享特定的里程碑。我想在每个里程碑/发布时完全按照原样共享代码,但不是我在每个发布之前的所有小提交。

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

最初,我认为使用单独的分支并使用 git merge --squash 会很有效,创建一个新分支,其中包含一系列反射(reflect)每个版本之间的完整更改集的提交。我现在明白 git merge --squash 不能重复使用。

Git rebase 可以将多个提交 merge 为一个大提交,但因为它更改了提交历史,所以不会更改我的私有(private)历史以及公开发布吗?

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

最佳答案

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

话虽如此,如果您真的想创建一个具有单独历史记录的发布分支,那么这是可能的。但是,您正在为自己设置更多的维护开销,因为您永远无法从您的私有(private)历史记录 merge 到您的公共(public)发布分支,因为这会将所有私有(private)历史记录引入您的发布分支。这就是 git 所做的;它跟踪变化的来源。

您可以从发布分支 merge 到私有(private)分支,但由于您的工作(大概)来自私有(private)分支,这不会给您带来太多好处。最简单的选择是拥有一个单独的发布分支,其中仅包含发布点私有(private)分支状态的快照提交。

假设您已经达到了要基于私有(private)分支 (private) 中的当前提交在发布分支 (release) 上创建提交的地步并假设您已 check out 要发布的树且未更改索引,这就是您可以执行的操作。

# 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

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

关于Git rebase/merge 用于公开发布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1479668/

相关文章:

git - Visual Studio 2013 RC 和源代码控制

eclipse - 如何将 Eclipse 项目工作区与 Git-BitBucket 同步?

git - 我可以同时使用 SourceTree 和 GitHub 应用程序吗?

Git 拒绝跟踪某些文件(git add -f 不工作)

git - [用户名].github.io 遇到问题

Git 外壳 : git-shell-commands should exist rather than "What do you think I am? A shell?"

git - 你如何在 magit 中列出跟踪文件(git ls-files)?

php - 您如何管理项目中的单元测试文件?你在git中添加它们吗?

ruby - Capistrano错误: could not connect to ssh-agent

php - 对于像 Laravel 这样的大型项目来说,GIT 是一个很好的解决方案吗?