我需要帮助shell脚本来恢复新分支中的多个提交,然后将结果与现有分支合并。 我的项目中有3个分支:dev,live和stage。 舞台分支是针对在舞台网站上进行测试的变更,经过客户的批准后,他们应该进入现场分支。
问题是客户端可能不批准部署的所有阶段更改(例如,我已完成1,2,3,4,5个门票,每个门票都在阶段分支中提交,但客户端批准了1个,3,4并要求立即部署)。因此,任务是将阶段分支中的特定提交与实时合并。我的解决方案是:
到目前为止,我手动恢复部署分支中的更改。现在我想自动执行此过程,并且我尝试为步骤2创建脚本(还原部署分支中的特定提交)。 我的剧本是:
git filter-branch -f --commit-filter '
if [ "$GIT_COMMIT" = "8f3859d5f1a5bb75d50f933a0277ba4bca4f2abc" ];
then
git revert $GIT_COMMIT --no-edit
git commit -m "Cleaning up revision: $GIT_COMMIT"
fi' HEAD
在if子句中,我列出了应该还原的所有提交。但在应用此脚本后,我总是收到一条消息
Rewrite 8f3859d5f1a5bb75d50f933a0277ba4bca4f2abc (6/13)error: Your local changes would be overwritten by revert.
提示:提交您的更改或存储它们以继续。
但是git status命令显示,没有提交更改。 所以,主要的问题是,为什么我手动执行命令时却有效,但是当我在脚本中隔离它们时却没有? 附:我正在使用Git for Windows
答案 0 :(得分:2)
我会使用cherry-pick来提取客户想要的实时提交,而不是使用reversion。然后我会重置舞台以保持舞台同步。如果我想在舞台上保留未经批准的提交,我会在重置之前进行标记。
假设客户端仅在分支阶段批准提交a
。这是图片。
/ \
x a
| |
live-> x b
|
c <-stage
git checkout live
git cherry-pick a
/ \
x a
| |
x b
| |
live-> a c <-stage
git checkout stage
git tag stage "client_submission_yyyy_mm_dd"
git reset live
/ \
x a
| |
x b
| |
live,stage-> a c <-client_submission_yyyy_mm_dd
现在直播和舞台只有客户已经批准的提交。 客户未批准的提交将被保留,因为它们可以从标签访问。 如果客户稍后改变主意并想要“你在日期xxxx上显示我的那个功能”,你可以从标签中找到它并为他选择直播。
唯一的问题是你的dev分支仍然包含被拒绝的提交。他们有几个选择。一个选项,如果他们想要从他们的分支中删除被拒绝的提交,就是将dev重置为live。如果他们想继续处理一些被拒绝的提交以使它们进入完成状态,那么他们可以在重置后将那些被拒绝的提交选择到dev上。