git自动恢复提交集

时间:2014-06-07 11:37:02

标签: git

我需要帮助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

1 个答案:

答案 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上。