如何在快乐路径场景中自动执行git rebase并合并?

时间:2016-06-09 19:05:02

标签: git scripting git-merge git-rebase

问题

如何使用智能脚本自动执行以下步骤?

  1. 如何以编程方式检测我的develop是否可以快速转发到origin develop
  2. 如何在git rebase develop之后以编程方式检测是否存在冲突?
  3. 部分进度

    1. 我已经找到了如何通过以下此脚本获取当前分支名称grepsed
      my_curr_branch_name=$(git branch | grep '\*' | sed 's/^* //');echo "My branch name is $my_curr_branch_name"
    2. 这是我正在进行的工作,以确定我是否落后于原点  我还没有充分发挥它的作用。  git status | grep 'Your branch is behind'
       和  git status | grep 'Your branch is up-to-date'
       弄清楚我是否落后。
    3. 我的Git合并流程

      让我说我在我的git存储库中feature/long-feature-name分支。

      1. git checkout develop
      2. git fetch
      3. git status IF develop落后于origin 且可快速转发,继续。否则请停止。)
        说明:此步骤为我自己执行以查看它是否可以快进。
        问题:如何以编程方式检测develop是否可以快进origin develop

      4. git pull
        说明:我知道git pull,因为我知道我可以安全地快进。

      5. git checkout feature/long-feature-name

      6. git rebase develop IF 没有任何反对冲突继续。否则,请停止。)
        问题:如何在git rebase develop之后以编程方式检测是否存在冲突?
      7. git checkout develop
      8. git merge feature/long-feature-name
      9. git push origin
      10. 功能

        1. 脚本需要知道要返回的功能分支。

          • 当脚本开始在步骤#1 运行时,它需要记住我当时在哪个功能分支上,因此它可以在步骤#5上git checkout feature/{branch-name} < / strong>和第8步
        2. 在以下条件下,脚本需要智能停止。

          • 第3步之后,如果我的develop不能快速转发。
          • 步骤#6 之后,如果存在rebase冲突。
        3. git flow feature finish

          我知道git flow feature finish可以做到这一点,但不是我想要的 我不希望git flow脚本到git merge --no-ff创建一个合并点。

1 个答案:

答案 0 :(得分:1)

这听起来很像你希望有人为你编写脚本(如果你发布了自己的尝试,我认为会有所帮助)。我不会这样做,但我会描述实现你所询问的项目的方法,以及一个缺陷。

要查找某个工作树所在的分支,如果它位于命名分支上,请使用git symbolic-ref读取HEAD的值。如果HEAD不是符号(间接)引用,即当前HEAD当前已分离并因此直接指向提交,则此操作将失败。如果它没有失败,它将打印(到标准输出)当前分支的全名,例如refs/heads/masterrefs/heads/feature/foo

缺陷在第4步:git pullgit fetch后跟git merge(或者,如果指示,则由git rebase代替)。此提取发生在您的步骤2之后,可能会更改并因此使步骤3中找到的答案无效。出于编写脚本的目的,git pull总是 1 错误:改为使用两个单独的命令。

我不清楚你在步骤3中想要什么。你当然可以运行git status,但如果重点是发现快进能力,那就是错误的做法。您可以使用git rev-list --count(这是git status所做的一部分)来执行此操作,但运行git merge --ff-only并检测失败更简单,当且仅当无法执行此操作时才会发生快进。默认情况下,git merge将使用当前分支的上游设置;如果没有,则不可能合并(没有任何合并),因此快进合并也是不可能的,因此这将失败。

(失败就像在任何表现良好的Unix实用程序中一样,报告为非零退出状态。)

如果在步骤6中发生了rebase冲突,git rebase命令将以非零状态退出,即将失败,因此可以将冲突检测视为一般故障情况的特定情况。 (由于其他原因,例如缺少磁盘空间,rebase可能会失败,但可能你也想停在这里。)

鉴于上述情况,其余部分应该很容易。

1 (G&amp; S icon here)什么,总是?是的,总是! ......好吧,几乎没有! (好吧,那不太合适。:-))