将参数传递给Git别名命令


71

我可以将参数传递给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
为什么您经常这样做,以为您需要这些别名?
meagar

4
这个问题确实来自“ rebase”的快捷方式,尽管对于这些不那么频繁的命令来说这似乎毫无意义。但是这个问题可能是一个普遍的问题。所以...
HaveF


同意@meagar。如果这样做的全部目的只是重新建立分支与父分支的分支以来的所有提交,而不必直接从该分支重新建立基础,那么这可能会导致合并冲突,您此时可能不必处理,请参阅我的答案。
赛斯·

Answers:


97

如果考虑“ Git常见问题”部分“带有参数的Git别名”,则可以这样做,但是可以通过外壳程序调用git:

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

我还没有测试过,但是如果您可以传递参数,那将是这样做的方法。

一个类似的解决方案是使用shell函数

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

谢谢!我添加了一个别名以在提交中显示文件($ 1 ==提交哈希)。shf =“!shf(){git diff-tree --no-commit-id --name-only -r $ 1;}; shf”
pymarco 2014年

5
我在Mac上使用的是1.7.12.4,但我从未使用过sh -c..."!git rebase -i HEAD~$1;"对我来说效果很好。
Droogans,2015年

2
我需要把#结尾放到最后:[config] rbi =“!git rebase -i HEAD〜$ 1#”
Juan AntonioTubío2015年

“!f(){git rebase -i HEAD〜$ 1;}; f”的语法就像一个字符!
MartinJH

在第一别名引号真的"..."..."...""...'...'..."
Nick Volynkin

4

重新分支以来的所有提交

如果您只是想对分支中所有新的提交进行重新设置,自从父分支分支分支以来,在配置中只包含以下别名会更容易:

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

然后,如果要重新添加已添加到当前分支的所有提交,则可以简单地运行:

git rbi parentBranch

这种方法使用一个参数,而不必知道要返回的提交数,只需提供分支名称,它就可以计算出当前分支与父分支之间共享的最新提交。 git merge-base

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

之所以这样做而不是简单,git rebase -i parentBranch是因为您可能不希望在以后再处理合并冲突,甚至不想在一次提交中处理合并冲突,然后在同一行的同一行中处理同一冲突。另一个提交。参见https://stackoverflow.com/a/31036645/444610


1
有趣的变化。+1。对于您提到的用例,比我的答案更精确。
VonC

1

@Droogans在对已接受的答案的评论中指出,至少在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"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.