我创建了一个执行以下任务的bash脚本:
origin/master
合并到master
; master
之上重新origin/master
代码如下:
#!/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
部分不太自信。我知道快进合并背后的理论,使用master
和origin/master
作为merge-base
的参数似乎是正确的,但我不是Git专家。
所以我问:是否正确检查是否可以在执行提取后进行快进合并?
答案 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命令。