我可以将参数传递给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
不起作用。
答案 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