首页 > 解决方案 > Git 别名,适用于 `main` 或 `master` 或其他

问题描述

使用 git 中的各种默认分支选择,我如何编写引用默认分支的脚本/别名,无论名称如何?

我的具体示例是我的别名,它基于最新的远程主机:

### version for `master`
#   rebaseOn = "!f() { BRANCH=$(git symbolic-ref --short HEAD) && git fetch && git pull --rebase; git rebase origin/${1:-master}; }; f"
### version for `main`
    rebaseOn = "!f() { BRANCH=$(git symbolic-ref --short HEAD) && git fetch && git pull --rebase; git rebase origin/${1:-main}; }; f"

用法:git rebaseOngit rebaseOn newParentBranch(因为它默认输入${1:-main}

我希望该命令适用于那里的任何一个版本,因为我使用的各种存储库都有mainormasterdefaultortrunk


到目前为止,我已经找到了https://stackoverflow.com/a/50056710/356218git remote show upstream | grep "HEAD branch" | sed 's/.*: //'但这对于插入别名来说相当长。

还有比这更好的选择吗?


迄今为止最好的答案

用我自己的话重述当前的最佳答案:

@matt 建议使用git branch --set-upstream-to

合并可能会稍微好一些(就像 git 一样)

注意:真正令人沮丧的是,当一个 repo 同时具有 amastermain分支时,很难通过 CLI 记住/知道/发现哪个是主要的(必须git log查看日期,记住相当晦涩的命令,或查看 github。所有这些都需要超过 2 秒和上下文变化,以了解挫折的程度)

标签: git

解决方案


继续伟大的@torek 的评论,你可以像这样设置你的别名:

main = !git symbolic-ref refs/remotes/origin/HEAD | cut -d'/' -f4
remotesh = remote set-head origin --auto
com = "!f(){ git checkout $(git main) $@;}; f"
upm = "!f(){ git pull --rebase --autostash origin $(git main) $@;}; f"
rebasem = "!f(){ git rebase -i --autosquash origin/$(git main) --no-verify $@;}; f"

git main将返回当前“主”分支(主/主)的名称。

在其他别名中使用$(git main)而不是硬编码的master分支名称。请记住,它需要是一个 shell 脚本(以 开头!),以便$(git main)实际插入。

如果有任何别名错误fatal: ref refs/remotes/origin/HEAD is not a symbolic ref,则只需运行git remotesh.


推荐阅读