git:定期推出重定基础分支的更好选择

git:定期推出重定基础分支的更好选择,git,branch,push,Git,Branch,Push,我有一个web站点的git存储库,其中主分支表示生产代码。我被要求建立一个“沙箱”版本的网站,供系统的潜在用户进行试验,这样他们就不必在生产系统中这样做 因为该站点的沙盒版本需要清楚地标记为这样,并且禁用了一些功能,所以我创建了一个沙盒分支(基于master),并在那里进行了一些提交以添加警告消息等等 然后我将这两个分支推到上游,在web服务器上,我在一个单独的目录中签出了每个分支——一个用于生产,一个用于沙箱 这很好,但是当我想写更多的代码时,问题就来了。一旦我将代码提交给主分支,它将在生产系

我有一个web站点的git存储库,其中主分支表示生产代码。我被要求建立一个“沙箱”版本的网站,供系统的潜在用户进行试验,这样他们就不必在生产系统中这样做

因为该站点的沙盒版本需要清楚地标记为这样,并且禁用了一些功能,所以我创建了一个沙盒分支(基于master),并在那里进行了一些提交以添加警告消息等等

然后我将这两个分支推到上游,在web服务器上,我在一个单独的目录中签出了每个分支——一个用于生产,一个用于沙箱

这很好,但是当我想写更多的代码时,问题就来了。一旦我将代码提交给主分支,它将在生产系统中更新,但沙箱将看不到新代码。因此,我将沙盒分支重新设置到master上,因此沙盒的提交始终位于生产之上。当然,一旦我这样做了,我就不能再把沙箱分支往上游推了,因为它不再是一个快进的分支。我必须登录到git服务器,切换分支,进行软重置,然后重新推送


当然有更好的方法用git实现这一点吗?我真正需要的是在当前签出的任何分支上一致地应用一些提交的方法。

我将通过在主分支中同时存在两个需要的代码路径来实现这一点


使用一些配置文件(不受版本控制)可以切换到其他代码路径。或者一些环境变量-任何最适合您的。

您可以使用
git push remote+branch
进行非快进推送。但是,可以将接收git存储库配置为拒绝这些

但是,如果您对分支的旧版本进行了编辑,但将重定基础的版本推到了上游,则可能会遇到一些小问题。解决此问题的一种方法是:

# you are on branch X and origin/X has been force-updated
git branch X-tmp   # keep a reference to your new commits
git fetch origin
git reset --hard origin/X   # now X is the same as origin/X

# now you have two options
# option 1: move the new commits from X-tmp to X by cherry-picking
# them one-by-one
git cherry-pick abc123
git cherry-pick def456

# option 2: this rebase should do the right thing and detect the equivalent
# commits in X and X-tmp
git checkout X-tmp
git rebase X

你有没有试过提交钩子?@J-16SDiZ:没有,我希望我可以用git的内置功能来实现这一点,所以如果存储库移动,我不必记得复制钩子。我是说,沙盒服务器上的钩子。你不是已经有一些基础设施了吗?沙盒是如何更新的?@J-16SDiZ:我明白,但我的意思是,如果我必须将web文件移动到其他地方,我希望我可以在新的位置进行“git克隆”,而不必记得再次设置挂钩。钩子可以自动执行手动任务(如果钩子失败,您可以手动执行),但我不喜欢因为钩子失败而丢失代码的想法!您知道吗,您可以使用
git push remote+branch
进行非快进推送?但是,可以将接收git存储库配置为拒绝这些。没错,这是我为dev/prod版本所做的(例如,这样dev版本就不会给真实的人发送电子邮件。)因为沙箱只是临时的,我希望我可以通过在完成时删除该分支来避免将沙盒代码永久保留。这不是一个坏主意-因为你不能(或不应该)推入工作树,我有一个脚本可以在目标工作树中执行
git pull
。因此,我可以将其更改为git reset&&git pull的一种形式,因为该树永远不会有需要保存的额外提交。