Git:包含交互式基础的合并工作流的快捷方式

时间:2018-06-27 01:56:19

标签: git

当我想将功能分支中的更改引入主分支时,我经常执行以下操作:

$ git checkout feature-branch
$ git rebase -i master # Clean up the history
$ git checkout master
$ git reset --hard feature-branch

此命令序列是否有快捷方式?

编辑:蒂姆·比格里森(Tim Biegeleisen)指出,我可能不运行git reset --hard feature-branch,而只是运行git merge feature-branch。不过,我想要的是一种类似git rebase-merge feature-branch的快捷方式,该快捷方式将导致与我的命令序列相同的master分支。

2 个答案:

答案 0 :(得分:1)

我不知道交互式rebase内部发生了什么,但是我会提到这是更典型的rebase工作流程:

git checkout feature-branch
git rebase master
git checkout master
git merge feature-branch

基本思想是,我们通过引入master的最新提交来重写功能分支,然后重新应用来自功能分支的唯一提交。然后,我们可以使用来自功能分支的那些新提交来快速转发master分支。

请注意,这并不比您当前拥有的短,但是我相信这是用于重新定基的更典型的工作流程。根据您在交互式基准库中所做的操作,我建议的上述工作流程可能不再起作用。

答案 1 :(得分:1)

只需为自己编写一个小的脚本或别名即可进行变基,并且如果成功(且仅当成功!),便会对master进行快进操作(假设这是您想要的结果)。

请记住,任何重新配置​​都可能出错,这可能是由于用户中止操作或由于在执行选择樱桃步骤之一期间的合并失败而引起的。幸运的是,git rebase本身是一个性能良好的Unix / Linux / POSIX工具:成功时退出零,失败时退出非零,这样您就可以知道它是成功还是失败。其他Git命令与此类似。因此,这可以通过小的bash / sh shell函数来实现:

rebase-merge() {
    case $# in
    1) ;; # good
    *) echo "usage: rebase-merge <branch>" 1>&2; exit 1;;
    esac
    git checkout "$1" &&
        git rebase -i master &&
        git checkout master &&
        git merge --ff-only "$1"
}

有可能将其作为Git别名混入到全局.gitconfig中的单行表达式。我将其作为练习留给读者。

还有其他一些更奇妙的方法可以做到这一点,但这实际上就是您正在做的事情(但简化为使用git mege --ff-only以确保Git仅进行快速合并,否则将失败。可能),只是变成了命令。我使用我喜欢的结构添加了检查以确保“ $#”(参数数量)正好为1,因为如果您决定要使用目标分支(当前硬编码为{{ 1}},两次)为可选:只需将设置从“ case ...”更改为:

master

,然后使用case $# in 1) target=master;; 2) target="$2";; *) echo "usage ..." ... esac 代替文字"$target"