将参数传递给Git别名命令

时间:2011-08-10 03:20:32

标签: git git-config git-alias

我可以将参数传递给Git命令的别名吗?

我在Git配置中有一些别名,如下所示:

rb1 = rebase -i HEAD~1
rb2 = rebase -i HEAD~2
rb3 = rebase -i HEAD~3
rb4 = rebase -i HEAD~4
....

是否可以制作rb别名,以便git rb <x>适用于任何<x>

我尝试了这个别名:

rb = rebase -i HEAD~

但是例如git rb 8不起作用。

4 个答案:

答案 0 :(得分:90)

如果考虑Git Faq section "Git Aliases with argument",你可以这样做,但是通过shell调用git:

[alias]
        rb = "!sh -c \"git rebase -i HEAD~$1\" -"

我还没有测试过,但是如果你能通过一个论证,那就是这样做的方法。

类似的解决方案是使用shell function

[alias]
        rb = "!f() { git rebase -i HEAD~$1; }; f"

答案 1 :(得分:4)

重新分配自分支后的所有提交

如果您只想重新设置分支中新增的所有提交,那么从您从父分支分支的时间开始,在配置中添加以下别名会更容易:

rbi = !sh -c \"git rebase -i `git merge-base $1 HEAD`\" -

然后,如果您想要重新添加已添加到当前分支的所有提交,则只需运行:

git rbi parentBranch

这种方法使用了一个参数,但是你不必知道要返回多少次提交,而是提供分支名称,它通过{{1}计算当前分支和父分支之间共享的最新提交。 }

为什么这样,而不是git rebase -i parentBranch

你这样做而不是直接git merge-base的原因是你可能不希望直到稍后处理合并冲突,或者甚至在一次提交中处理合并冲突,然后另一次提交中同一行的相同冲突。见https://stackoverflow.com/a/31036645/444610

答案 2 :(得分:1)

@Droogans在comment中针对已接受的答案指出,至少在macOS上(我想对于任何类似Unix的OS甚至Windows都一样),您可以使用$1作为占位符值,表示别名中的参数。因此,要设置别名以使git rb 8变成git rebase -i HEAD~8

    rb = "!git rebase -i HEAD~$1;"

您还可以在别名中多次使用它,因此,例如,如果您想要将git f my-branch转换为git fetch origin my-branch:my-branch的别名,则可以执行以下操作:

    f = "!git fetch origin $1:$1"

答案 3 :(得分:0)

我编写了此函数“ grb”,以便在Mac上进行Git交互式变基,因此我可以说grb 5来显示我最近的5次提交:

function grb {
  git rebase -i HEAD\~$1
}

此页面上的最高答案对我不起作用。 要查看我在Mac上使用的.bash_profile和所有其他Git别名:

https://github.com/rayning0/bash_profile/blob/master/.bash_profile#L149