我正在尝试创建一个 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
;有什么建议吗?