Branches default alternativas no Oh-My-Zsh

2026-03-16

post-thumb

Se você usa o plugin git do Oh-My-Zsh, provavelmente já se acostumou com os aliases gcm (checkout main) e gcd (checkout develop). Até que você entra num projeto com branches default diferentes e vê isso:

gcm
error: pathspec 'master' did not match any file(s) known to git
gcd
error: pathspec 'develop' did not match any file(s) known to git

Na empresa onde trabalho, usamos um sistema de branches diferente do convencional: a branch principal se chama staging (equivalente à main) e a branch de desenvolvimento se chama qa (equivalente à develop). Isso faz com que os aliases do Oh-My-Zsh não encontrem as branches esperadas.


A solução

O plugin git do Oh-My-Zsh usa duas funções para resolver o nome das branches default: git_main_branch e git_develop_branch. Todos os aliases que dependem dessas branches (como gcm, gcd, grbm, gmd, entre outros) chamam essas funções por baixo dos panos.

A solução é sobrescrever essas funções para incluir os nomes alternativos das suas branches. Criei um arquivo custom-git.zsh no diretório custom do Oh-My-Zsh:

# ~/.oh-my-zsh/custom/custom-git.zsh

Com o seguinte conteúdo:

# Overwrite Oh-My-Zsh git_main_branch function to also look up to default branch "staging"
git_main_branch() {
  command git rev-parse --git-dir &>/dev/null || return
  local ref
  for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,master,staging}; do
    if command git show-ref -q --verify "$ref"; then
      echo "${ref:t}"
      return
    fi
  done
  echo master
}
# Overwrite Oh-My-Zsh git_develop_branch function to also look up to default branch "qa"
git_develop_branch() {
  command git rev-parse --git-dir &>/dev/null || return
  local ref
  for ref in refs/{heads,remotes/{origin,upstream}}/{develop,dev,devel,development,qa}; do
    if command git show-ref -q --verify "$ref"; then
      echo "${ref:t}"
      return
    fi
  done
  echo develop
}

O Oh-My-Zsh carrega automaticamente qualquer arquivo .zsh dentro de ~/.oh-my-zsh/custom/, então basta reabrir o terminal e os aliases voltam a funcionar.


Como funciona

As funções percorrem uma lista de nomes possíveis (tanto em branches locais quanto remotas) e retornam o primeiro match. A ordem importa: se o repositório tiver main e qa, vai usar main. Se só tiver qa, vai usar qa.

Isso significa que o mesmo setup funciona tanto nos seus projetos pessoais (que usam main/develop) quanto nos projetos da empresa (que usam qa/staging), sem precisar trocar nada.