适用于“main”或“master”或其他的 Git 别名

Thy*_*ine 24 git

由于 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"
Run Code Online (Sandbox Code Playgroud)

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

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


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

还有比这更好的选择吗?


迄今为止最佳答案

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

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

  • 我想您git branch --set-upstream-to <main/master>在最初克隆存储库时进行了设置,并且在运行该命令时与您接触的每个存储库保持一致
  • 因此,您可以忽略 github 等所说的默认主控,并知道在您的此设置中,您始终在本地使用您的首选项
    • 与结对编程或任何必须回归标准行为的行为相反
  • 然后在变基到 之前default,您必须pull选择名称(编写此脚本),以便在变基之前包含任何新的提交
    • 因此,如果您使用一个分支与处理其他事情并行工作,那么default您实际上无法使用此方法做到这一点,总是需要一个单独的分支来处理尚未准备好推送的提交
  • 然后就可以合并default并推送,无需额外工作

合并的效果可能会更好一些(就像 git 的情况一样)

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

jto*_*mpl 22

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

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

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

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

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


tor*_*rek 2

您在这里有很多选择。但是,我建议您不要使用我在这里列出的任何一个,因为您的分支名称是您的。您没有理由需要使用与其他存储库相同的名称。这也是马特在评论中建议的

\n

不过,您的选择包括:

\n
    \n
  • 在您自己的存储库中阅读origin/HEAD

    \n
    repo-A$ git symbolic-ref refs/remotes/origin/HEAD\nrefs/remotes/origin/master\n\nrepo-B$ git symbolic-ref refs/remotes/origin/HEAD\nrefs/remotes/origin/main\n
    Run Code Online (Sandbox Code Playgroud)\n

    例如,其中 repo-A 是使用 的旧存储库的克隆,master而 repo-B 是使用 的较新存储库的克隆。main

    \n

    请注意,您有时可能需要运行git remote set-head --auto让您的 Git 注意到Git 已重命名mastermain,因此更新您的origin/HEADGit 以匹配。您的origin/HEAD值是在您运行时建立的git clone,之后不会更新,除非您使用git remote set-head --auto. 您当然可以将此git remote set-head操作放入您的别名中。

    \n
  • \n
  • 使用git remote show,就像你展示的那样。它在一个别名中:为什么你关心别名有多长?

    \n
  • \n
  • 使用上游设置(git branch --set-upstream-to)然后运行git rebase​​,即可选择当前分支的上游。当然,这主要是针对分支;据推测,当您想在强制推送之前更新名为over on 的分支时,您正在使用此别名。如果是这样,那么这个选项就是一个糟糕的选项。origin/namenamenamenameorigin

    \n
  • \n
  • 写一个脚本。将脚本放在您的某个地方,例如$PATH命名它。git-rebase-on-default-branch运行git rebase-on-default-branch将运行您的脚本。现在它不是一个别名,而是一个脚本\xe2\x80\x94,无论你喜欢什么语言\xe2\x80\x94,你都可以在其中放入任意数量的代码,使其变得如你所愿的聪明和花哨。(我明白了,这也是\xc3\x94rel\ 的建议。)

    \n
  • \n
\n

毫无疑问还有更多,但这至少应该涵盖一些基础。

\n