我有一个网站的git存储库,其中master分支代表生产代码。我被要求设置一个“沙盒”版本的网站,供系统的潜在用户进行试验,这样他们就不必在生产系统中这样做了。
由于网站的沙箱版本需要明确标记,并且禁用了某些功能,因此我创建了一个沙箱分支(基于主服务器)并在那里进行了一些提交以添加警告消息等等。
然后我将两个分支向上游推送,并且在Web服务器上,我已经在一个单独的目录中检出了每个分支 - 一个用于生产,一个用于沙箱。
这样可以正常工作,但是当我想编写更多代码时会出现问题。一旦我将代码提交到主分支,它将在生产系统中更新,但沙箱将不会看到新代码。所以我将沙盒分支重新绑定到master上,因此沙箱的提交始终位于生产之上。但当然,一旦我完成了这一点,我就不能再将沙箱分支推向上游,因为它不再是快进的。我必须登录到git服务器,切换分支,执行软复位然后重做推送。
肯定有一种更好的方法可以用git做到这一点?我真正需要的是在目前检出的任何分支上一致地应用一些提交的某种方式。
答案 0 :(得分:1)
我会通过两个代码路径来实现这一点,其中两个代码路径都需要存在于主分支中。
EG。使用一些配置文件(不受版本控制),您可以切换到另一个代码路径。或者一些环境变量 - 最适合你的。
答案 1 :(得分:1)
您可以使用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