我正在尝试创建一个 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 上)
如果要在 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)
归档时间: |
|
查看次数: |
1600 次 |
最近记录: |