用于将当前分支与 master 合并的 git 别名

Spo*_*ike 7 alias git

我正在尝试创建一个 git 别名,将当前签出的分支合并到主分支中。具体来说,我想快速让我的主分支跟上我正在做的事情。我有以下几点:

[alias]
    co = checkout
    ff = !git co master && git merge work && git co work
Run Code Online (Sandbox Code Playgroud)

但是我希望别名知道它在哪个分支上并返回到它。我尝试添加$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.
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么会这样?(顺便说一下,我在 Mac 上)

Chr*_*her 7

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

ff = !sh -c 'git checkout master && git merge "$1" && git checkout "$1"' -
Run Code Online (Sandbox Code Playgroud)

(死链接) “为什么”与 git 解析别名命令的方式有关,并在此 gmane 线程中进行了总结

-在所述命令信号的末端sh该选项处理结束。来自man sh

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

如果它不存在,它将通过将其$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
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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

用法(来自我的分支):

git merge-into master
Run Code Online (Sandbox Code Playgroud)