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

Mic*_*ord 22 git

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

  1. 从上游获取更改;
  2. 检查是否可以进行快进合并;
  3. 合并origin/mastermaster#2是否为真;
  4. 调整基线master之上origin/master,如果#2是假的

代码如下:

#!/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
Run Code Online (Sandbox Code Playgroud)

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

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

小智 13

git merge-base --is-ancestor <commit> <commit>
Run Code Online (Sandbox Code Playgroud)

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

例如

 git merge-base --is-ancestor origin/master master
Run Code Online (Sandbox Code Playgroud)

  • 并且状态代码可以用`echo $?`进行检查,因此手动检查的示例命令可以是'git merge-base --is-ancestor开发myotherbranch &amp;&amp; echo $?`。 (3认同)
  • @BobRay,您可以将分支名称代替“&lt;commit&gt;”,然后 git 将其解析为该分支的 HEAD 引用的提交。 (3认同)
  • @lucidbrot 我认为如果第一个命令失败,`&amp;&amp;` 将不起作用。所以也许这会稍微好一些: `git merge-base --is-ancestor Development myotherbranch; 回声$?` (2认同)

小智 8

您想使用该--ff-only选项。

git merge origin/master --ff-only

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


Mar*_*n G 3

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

git fetch
git checkout -b tmp_branch master
git merge origin/master
Run Code Online (Sandbox Code Playgroud)

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

当不需要时,只需删除临时分支即可。

git branch -D tmp_branch
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的回答。它可能有效,但“merge-base”更简单,因为它只需计算两次提交之间的合并基础即可给出即时答案。 (4认同)