用于合并当前分支和主分支的 git 别名

用于合并当前分支和主分支的 git 别名

我正在尝试创建一个 git 别名,将当前签出的分支合并到主分支。具体来说,我希望快速让我的主分支跟上我正在处理的工作。我有以下内容:

[alias]
    co = checkout
    ff = !git co master && git merge work && git co work

但是我希望别名知道它在哪个分支上并返回到它。我尝试添加,$1但不幸的是,在别名的最后一次签出时出现错误:

# with
[alias]
    co = checkout
    ff = !git co master && git merge $1 && git co $1

> git ff work
Switched to branch 'master'
Already up-to-date.
error: pathspec 'work' did not match any file(s) known to git.

有人知道为什么会这样吗?(顺便说一下,我用的是 Mac)

答案1

如果要在 git 别名中使用位置参数,请务必指定sh -c。以下方法在本地对我有用:

ff = !sh -c 'git checkout master && git merge "$1" && git checkout "$1"' -

(无效链接) “为什么”与 git 解析别名命令的方式有关,在这个 gmane 帖子中进行了总结

-命令末尾的 表示选项sh处理已完成。来自man sh

-- 表示选项结束并禁用进一步的选项处理。-- 后面的任何参数都被视为文件名和参数。- 的参数相当于 --。

如果它不存在,它会在别名中引入一个错误,因为它被视为命令$1上的选项sh而不是位置参数。考虑这个简单的例子:

$ sh -c 'echo $1' foo          # equivalent to 'echo' without argument

$ sh -c 'echo $1' - foo        # will pass 'foo' to the string as $1
foo

在第一种情况下,'foo' 被sh当作选项使用。在第二种情况下,它被正确地解释为$1字符串。

答案2

这是一个不需要指定当前分支而可以选择任何目标分支的版本:

merge-into = !sh -c '_CURRENT_BRANCH=$(git symbolic-ref --short HEAD) && git checkout $1 && git merge $_CURRENT_BRANCH && git checkout $_CURRENT_BRANCH' -

用法(来自我的分支):

git merge-into master

答案3

感谢答案在这个帖子中,我更新了一些我一直使用的别名:

  • git fold <target> [source]-- 将<target>分支合并到当前分支(保留历史记录),可选择指定source当前分支以外的分支;mff是另一种简写

    fold = !sh -c '_CURRB=$(git symbolic-ref --short HEAD) && git checkout $1 && git merge --no-ff ${2-$_CURRB} -e' - ; per suggestion http://nvie.com/posts/a-successful-git-branching-model/ + https://superuser.com/questions/435744/git-alias-for-merging-current-branch-with-master
        mff = "!git fold"
    
  • git foldback <target> [source]-- 与 相同fold,但切换回source(当前)分支

    foldback = !sh -c '_CURRB=$(git symbolic-ref --short HEAD) && git fold $1 ${2-$_CURRB} && git checkout ${2-$_CURRB}' -
    
  • git fuse <target> [source]-- 与 相同fold,但删除源分支(即当您完成某个功能时)

    fuse = !sh -c '_CURRB=$(git symbolic-ref --short HEAD) && git fold $1 $2 && git branch -d ${2-$_CURRB}' - ; per suggestion http://nvie.com/posts/a-successful-git-branching-model/
    

我对 shell 的东西了解不够,不知道更好的重用方法_CURRB;有什么建议吗?

相关内容