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

标签 git

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

  1. 从上游获取更改;
  2. 检查是否可以进行快进 merge ;
  3. 如果#2 为真,则将 origin/master merge 到 master 中;
  4. 如果#2 为假,则在 origin/master 之上重新设置 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 部分不是很有信心。我知道快进 merge 背后的理论,使用 masterorigin/master 作为 merge-base 的参数似乎是正确的,但我不是 Git 专家。

所以我问:在执行提取后检查是否可以进行快进 merge 的正确方法是正确的吗?

最佳答案

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

--is-ancestor检查第一个 <commit>是第二个的祖先<commit> , 如果为真则以状态 0 退出,否则以状态 1 退出。错误由非 1 的非零状态表示。

例如

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

关于git - 检查是否可以使用 git merge-base 执行快进 merge 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24504400/

相关文章:

git - 撤消 git 自动 merge

git - 清除 Bitbucket 上的 git 存储库?

git - 将多个文件夹和文件从 git 存储库复制到另一个存储库,同时保留历史记录

node.js - git bash 找不到模块 npm-cli.js

java - 如何避免在 Eclipse 中成为 Master

git - 如何在 Git 存储库中移动现有的 Git 子模块?

html - GitHub Pages (github.io) 找不到 doxygen 生成的页面 (404)

git - 如何在 Github 桌面 gui 中设置 git diff 参数

git - 控制 Go 包版本

linux - Git/Egit 配置