0

如果分支存在或不存在git checkout,有没有办法别名?git checkoutgit checkout -b

4

2 回答 2

4

这是一种方法。在您的用户中进行设置.gitconfig

[alias]
    magic = !sh -c 'git show-ref --verify --quiet refs/heads/\"$1\" && git checkout \"$1\" || git checkout -b \"$1\"' -

用法:git magic <branch name>

它是这样工作的:

  1. show-ref用于检查分支是否存在。该--verify标志用于指定一个确切的路径,所以如果你这样做git show-ref --verify refs/heads/<branch name>,你将只匹配你的 repo 本地的分支,而不是任何远程上具有相同名称的分支:

    通过要求精确的引用路径来启用更严格的引用检查。--quiet除了返回错误代码 1 外,如果未指定,它还会打印错误消息。

    --quiet确保您看不到任何您不需要的错误消息:

    不要将任何结果打印到标准输出。与--verify此结合使用时,可用于静默检查引用是否存在。

  2. 如果show-ref以代码 0 退出,则分支存在,执行 after 命令&&,检查分支。否则,show-ref以非零状态 1 退出,并且&&不执行 after 的命令,但之后的命令||会创建一个具有该名称的新分支并将其签出。

但是,我应该警告,所写的别名不能很好地与分支名称的 msysgit bash 选项卡完成配合,它会导致发生以下错误,我还不确定为什么:

$ git magic fsh.exe": declare: `_git_'git': not a valid identifier

如果您不尝试使用制表符完成分支名称,则别名仍然可以正常工作。我发现这个 Stack Overflow 问题和答案可能有助于解决选项卡完成问题,但我不确定:Git aliases - command line autocompletion of branch names

如果您有兴趣了解有关如何将参数传递给 Git 别名的更多信息,请参阅Linux Kernel Git Wiki中的带参数的高级别名

于 2013-08-02T00:40:41.080 回答
2

不,如果您想将命令保留为git checkout. 根据 git-config手册页

为了避免脚本使用的混乱和麻烦,隐藏现有 Git 命令的别名将被忽略。

其他解决方案(例如 Cupcake 的解决方案)可能有效,但您必须接受别名的新名称。

于 2013-08-02T01:35:42.513 回答