【问题标题】:Pass an argument to a Git alias command将参数传递给 Git 别名命令
【发布时间】:2011-10-23 17:55:24
【问题描述】:

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

【问题讨论】:

  • 你为什么经常这样做,以至于你认为你需要这些别名?
  • 这个问题确实来自“rebase”的快捷方式,尽管对于这些不那么频繁的命令来说这似乎是一个毫无意义的问题。但是这个问题可以是一个普遍的问题。所以...
  • 同意@meagar。如果这样做的全部目的只是重新设置所有提交,因为您的分支与其父分支不同,而不必直接从该分支重新设置基准,这可能导致您目前可能不一定想要处理的合并冲突,看我的回答。

标签: git git-config git-alias


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢!我添加了一个别名来显示提交中的文件($1 == 提交哈希)。 shf = "!shf() { git diff-tree --no-commit-id --name-only -r $1; }; shf"
  • 我在 Mac 上使用 1.7.12.4,但我从不使用 sh -c 部分..."!git rebase -i HEAD~$1;" 对我来说很好。
  • 我需要在末尾添加一个#:[config] rbi = "!git rebase -i HEAD~$1 #"
  • "!f() { git rebase -i HEAD~$1; }; f" 语法就像一个魅力!
  • 第一个别名中的引号真的是"..."..."..."而不是"...'...'..."吗?
【解决方案2】:

重新设置分支后的所有提交

如果您只是想对分支中的所有新提交进行 rebase,因为您从父分支分支时,在您的配置中使用以下别名会更容易:

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

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

git rbi parentBranch

这种方法使用一个参数,但不必知道要返回多少次提交,您只需提供分支名称,它会计算出当前分支和父分支之间通过git merge-base共享的最新提交/p>

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

您这样做而不是直接git rebase -i parentBranch 的原因是您可能不想在稍后处理合并冲突,或者甚至在一次提交中处理合并冲突,然后相同在另一个提交中的同一行发生冲突。见https://stackoverflow.com/a/31036645/444610

【讨论】:

  • 有趣的变化。 +1。比我对您提到的用例的回答更准确。
【解决方案3】:

@Droogans 在comment 中针对已接受的答案指出,至少在 macOS 上(我想对于任何类似 unix 的操作系统,甚至可能是 Windows),您都可以使用 @987654322 @ 作为代表别名中参数的占位符值。所以,要设置一个别名,让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"

【讨论】:

    【解决方案4】:

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

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

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

    https://github.com/rayning0/zsh_profile/blob/master/.zprofile#L157

    【讨论】:

    • 没有必要使用代字号
    猜你喜欢
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-09
    • 2017-10-22
    • 2021-10-20
    • 2019-10-12
    相关资源
    最近更新 更多