检查是否可以使用git merge-base执行快进合并的正确方法是什么?

时间:2014-07-01 07:11:29

标签: git

我创建了一个执行以下任务的bash脚本:

  1. 从上游获取更改;
  2. 检查是否可以进行快进合并;
  3. 如果#2为真,则origin/master合并到master;
  4. 如果#2为假,则在master之上重新origin/master
  5. 代码如下:

    #!/bin/sh
    
    local_branch=$(git rev-parse --symbolic-full-name --abbrev-ref HEAD)
    remote_branch=$(git rev-parse --abbrev-ref --symbolic-full-name @{u})
    remote=$(git config branch.$local_branch.remote)
    
    echo "Fetching from $remote..."
    git fetch $remote
    
    if git merge-base --is-ancestor $local_branch $remote_branch; then
        echo 'Fast-forward is possible. Merging...'
        git merge --ff-only $remote_branch
    else
        echo 'Fast-forward is not possible. Rebasing...'
        git rebase --preserve-merges $remote_branch
    fi
    

    我测试了几次它似乎有效,但我对git merge-base部分不太自信。我知道快进合并背后的理论,使用masterorigin/master作为merge-base的参数似乎是正确的,但我不是Git专家。

    所以我问:是否正确检查是否可以在执行提取后进行快进合并?

5 个答案:

答案 0 :(得分:11)

git merge-base --is-ancestor <commit> <commit>

--is-ancestor检查第一个<commit>是否是第二个<commit>的祖先,如果为真则退出状态0,否则退出状态1。错误由非零状态发出信号,该状态不是1.

e.g。

 git merge-base --is-ancestor origin/master master

答案 1 :(得分:3)

如果您实际执行合并,您肯定会知道!使用临时分支,这样你就不会在其他分支中弄乱任何东西。

git fetch
git checkout -b tmp_branch master
git merge origin/master

您的脚本需要在此处评估合并结果,并将origin / master合并到master中。

只需在不需要时删除临时分支。

git branch -D tmp_branch

答案 2 :(得分:2)

检查$remote_branch是否为$local_branch的祖先的命令是:

test -z "$(git rev-list --max-count 1 $local_branch..$remote_branch)"

如果没有--max-count 1,则会列出$remote_branch但不是$local_branch中的所有提交。由于您只对有这样的提交感兴趣并且无论如何丢弃输出,您可以添加--max-count 1以加快速度。

答案 3 :(得分:1)

是的,您的支票完全正确。那里真的没有神秘感。

答案 4 :(得分:0)

您要使用--ff-only选项。

git merge origin/master --ff-only

如果可以快进,它将自动发生。如果不可能,则该命令将失败,并显示fatal: Not possible to fast-forward, aborting.,而您可以运行rebase命令。