Quais são alguns exemplos de práticas comumente usadas para nomear ramificações git? [fechadas]

1121

Estou usando um repositório git local interagindo com o repositório CVS do meu grupo há vários meses, agora. Fiz um número quase neurótico de galhos, a maioria dos quais se fundiu de volta ao meu tronco. Mas nomear está começando a se tornar um problema. Se eu tiver uma tarefa facilmente nomeada com um rótulo simples, mas a realizo em três estágios, cada um incluindo sua própria situação de ramificação e mesclagem, posso repetir o nome da ramificação a cada vez, mas isso torna o histórico um pouco confuso. Se eu for mais específico nos nomes, com uma descrição separada para cada estágio, os nomes das filiais começarão a ficar longos e difíceis de manejar.

Eu aprendi olhando através de tópicos antigos aqui que eu poderia começar a nomear ramos com um / no nome, ou seja, tópico / tarefa ou algo parecido. Posso começar a fazer isso e ver se isso ajuda a manter as coisas melhor organizadas.

Quais são algumas das práticas recomendadas para nomear ramificações git?

Edit: Ninguém realmente sugeriu quaisquer convenções de nomenclatura. Eu excluo ramificações quando terminar com elas. Por acaso, tenho vários por aí, devido à gerência constantemente ajustando minhas prioridades. :) Como exemplo de por que eu posso precisar de mais de uma ramificação em uma tarefa, suponha que eu precise confirmar o primeiro marco discreto da tarefa no repositório CVS do grupo. Nesse ponto, devido à minha interação imperfeita com o CVS, eu executaria esse commit e depois mataria esse branch. (Vi muita estranheza interagindo com o CVS se tentar continuar usando a mesma ramificação nesse ponto.)

skiphoppy
fonte
Sim - provavelmente é bom não ficar por perto ou empurrar galhos que não são úteis depois de terminar com eles. A menos que haja uma boa razão para manter um tópico ramificado (por exemplo, para consultá-lo mais tarde), não há problema em excluí-lo. O Git facilita a ramificação, e um corolário é que você pode acabar com muitos galhos triviais por aí que podem ser limpos sem muita demora.
Eric Walker
14
Veja também github.com/agis-/git-style-guide
Agis
2
Para completar, existem algumas seqüências de caracteres que você não pode usar .
Nick Westgate
18
Precisa haver um local para esse tipo de perguntas na rede StackExchange. Muito irritante quando alguém faz uma boa pergunta como essa e depois ela fica fechada por não seguir as regras. Se isso continuar acontecendo, isso provavelmente deve sinalizar a necessidade de apoiar esses tipos de perguntas de alguma forma. Somente estes provavelmente teriam que ser implementados no site Overflow, porque estão intimamente relacionados às perguntas do tipo programação. O excesso, para mim, não é para "perguntas objetivamente respondíveis" (muito específicas), é "perguntas de programação".
Nick Res
@Wim Usamos chaves de edição jira, combinadas com um título curto, por exemplo:KEY-1234/allow-users-to-do-smart-stuff
RobAu 8/17/17

Respostas:

938

Aqui estão algumas convenções de nomenclatura de ramificações que eu uso e os motivos delas

Convenções de Nomenclatura de Filiais

  1. Use tokens de agrupamento (palavras) no início dos nomes de suas ramificações.
  2. Defina e use tokens de lead curtos para diferenciar ramificações de maneira significativa para o seu fluxo de trabalho.
  3. Use barras para separar partes dos nomes de suas ramificações.
  4. Não use números simples como peças principais.
  5. Evite nomes descritivos longos para ramos de vida longa.

Tokens de grupo

Use tokens de "agrupamento" na frente dos nomes de suas ramificações.

group1/foo
group2/foo
group1/bar
group2/bar
group3/bar
group1/baz

Os grupos podem ser nomeados como você desejar para corresponder ao seu fluxo de trabalho. Eu gosto de usar substantivos curtos para os meus. Continue lendo para mais clareza.

Tokens curtos e bem definidos

Escolha tokens curtos para que eles não adicionem muito ruído a todos os nomes de suas ramificações. Eu uso estes:

wip       Works in progress; stuff I know won't be finished soon
feat      Feature I'm adding or expanding
bug       Bug fix or experiment
junk      Throwaway branch created to experiment

Cada um desses tokens pode ser usado para informar a qual parte do seu fluxo de trabalho cada filial pertence.

Parece que você tem várias ramificações para diferentes ciclos de alteração. Não sei quais são seus ciclos, mas vamos supor que eles sejam 'novos', 'testando' e 'verificados'. Você pode nomear seus ramos com versões abreviadas dessas tags, sempre escritas da mesma maneira, para agrupá-las e lembrá-lo em que estágio você está.

new/frabnotz
new/foo
new/bar
test/foo
test/frabnotz
ver/foo

Você pode dizer rapidamente quais ramificações atingiram cada estágio diferente e agrupá-las facilmente usando as opções de correspondência de padrões do Git.

$ git branch --list "test/*"
test/foo
test/frabnotz

$ git branch --list "*/foo"
new/foo
test/foo
ver/foo

$ gitk --branches="*/foo"

Use barras para separar as peças

Você pode usar quase todos os delimitadores que desejar nos nomes das filiais, mas as barras são as mais flexíveis. Você pode preferir usar traços ou pontos. Mas as barras permitem que você renomeie algumas ramificações ao empurrar ou buscar de / para um controle remoto.

$ git push origin 'refs/heads/feature/*:refs/heads/phord/feat/*'
$ git push origin 'refs/heads/bug/*:refs/heads/review/bugfix/*'

Para mim, as barras também funcionam melhor para expansão de guias (conclusão de comandos) no meu shell. Da maneira que eu o configurei, posso procurar ramificações com diferentes sub-partes digitando os primeiros caracteres da parte e pressionando a tecla TAB. O Zsh me fornece uma lista de ramos que correspondem à parte do token que eu digitei. Isso funciona para os tokens anteriores e os incorporados.

$ git checkout new<TAB>
Menu:  new/frabnotz   new/foo   new/bar


$ git checkout foo<TAB>
Menu:  new/foo   test/foo   ver/foo

(O Zshell é muito configurável sobre a conclusão de comandos e eu também poderia configurá-lo para lidar com traços, sublinhados ou pontos da mesma maneira. Mas eu escolho não fazê-lo.)

Também permite procurar ramificações em muitos comandos git, como este:

git branch --list "feature/*"
git log --graph --oneline --decorate --branches="feature/*" 
gitk --branches="feature/*" 

Advertência: Como Slipp aponta nos comentários, as barras podem causar problemas. Como os ramos são implementados como caminhos, você não pode ter um ramo chamado "foo" e outro ramo chamado "foo / bar". Isso pode ser confuso para novos usuários.

Não use números simples

Não use o uso de números simples (ou números hexadecimais) como parte do esquema de nomes de ramificações. Dentro da expansão de tabulação de um nome de referência, o git pode decidir que um número faz parte de um sha-1 em vez de um nome de ramificação. Por exemplo, meu rastreador de problemas nomeia erros com números decimais. Eu nomeio meus ramos relacionados CRnnnnn em vez de apenas nnnnn para evitar confusão.

$ git checkout CR15032<TAB>
Menu:   fix/CR15032    test/CR15032

Se eu tentasse expandir apenas 15032, o git não teria certeza se queria pesquisar nomes de SHA-1 ou de filial, e minhas escolhas seriam um pouco limitadas.

Evite nomes descritivos longos

Nomes longos de ramificações podem ser muito úteis quando você estiver olhando para uma lista de ramificações. Mas isso pode atrapalhar a visualização de logs de uma linha decorados, pois os nomes das ramificações podem consumir a maior parte da linha única e abreviar a parte visível do log.

Por outro lado, nomes longos de ramificações podem ser mais úteis em "mesclar confirmações" se você não as reescrever habitualmente à mão. A mensagem de confirmação de mesclagem padrão é Merge branch 'branch-name'. Você pode achar mais útil exibir mensagens de mesclagem como em Merge branch 'fix/CR15032/crash-when-unformatted-disk-inserted'vez de apenas Merge branch 'fix/CR15032'.

frase
fonte
156
Uma desvantagem de usar uma mistura de formulários como bug/20574/frabnotz-findere bug/20424é que, depois que você inicia sem um sub-token, não pode adicioná-lo mais tarde e vice-versa. EG: Se você criar uma bug/20424ramificação, não poderá criar uma bug/20424/additional-fixingramificação posteriormente (a menos que exclua a bug/20424ramificação). Da mesma forma, se bug/20574/frabnotz-finderjá é um ramo, você não pode criar um bug/20574ramo. Costumo usar um delimitador que não seja do sub-token em casos como este (por exemplo bug/20574_frabnotz-finder) ou escolher um nome padrão para o sub-token (por exemplo bug/20424/main).
amigos estão dizendo
5
Ele também tem o benefício de solicitar algumas ferramentas baseadas em GUI do Git para permitir o colapso de divisões de tokens como uma exibição de lista de diretórios. No exemplo acima, você veria um featuregrupo e um buggrupo, expansíveis para exibição foo, bartags para o primeiro e a 20574, 20592groups e 20424, 21334tags para o último.
Slipp D. Thompson
47
Vou iniciar uma campanha para nunca usar barras na nomeação de ramificações git. A razão para isso é que, em um IC, por exemplo, você deseja consultar o nome da filial ao empacotar o código, por exemplo, deseja consultar o nome da filial ao criar um uri ou PATH (por exemplo), talvez criar um uri em um script bash; você terá problemas para criar a uri devido à barra que adiciona uma parte da url. Sim, é possível substituir a barra, mas levará muito tempo para resolver.
Adam Spence
13
É um problema que barras invertidas tenham significado para o git em alguns casos? Por exemplo, em resposta a git branch -a, e obtendo remotes/origin/master, etc. Quando vejo o git me falar sobre um ramo, não uso barras, então quando vejo um, sei que é uma referência "especial".
Dogweather
11
Você poderia usar alguns exemplos em vez de foo e bar, por favor?
precisa saber é o seguinte
329

Um modelo de ramificação Git bem-sucedido de Vincent Driessen tem boas sugestões. Uma imagem está abaixo. Se este modelo de ramificação lhe interessar, considere a extensão do fluxo para git . Outros comentaram sobre o fluxo

O modelo de Driessen inclui

  • Uma ramificação principal, usada apenas para liberação. Nome típico master.

  • Um ramo "desenvolvido" fora desse ramo. Esse é o usado para a maioria dos trabalhos da linha principal. Nome comum develop.

  • Vários ramos de recursos fora do ramo de desenvolvimento. Nome com base no nome do recurso. Eles serão mesclados novamente no desenvolvimento, não nos ramos mestre ou de liberação.

  • Libere a ramificação para manter as liberações candidatas, com apenas correções de bugs e sem novos recursos. Nome típico rc1.1.

Os hotfixes são ramificações de curta duração para alterações que vêm do master e serão inseridas no master sem a participação do branch de desenvolvimento.

insira a descrição da imagem aqui

Brian Carlton
fonte
129
Exceto que ele realmente não aborda a questão, uma vez que deixa várias convenções de nomenclatura para o usuário, especialmente para ramos de recursos (eles podem ser "qualquer coisa, exceto mestre, desenvolvimento, lançamento ou hotfix ")
Brian
1
@Brian Com o que uma convenção de nomenclatura de recursos ajudaria no contexto dos problemas que o modelo resolve? Atualmente, não vejo realmente como fazer distinções adicionais nos recursos realmente ajuda. Talvez o futuro vs o próximo lançamento, mas isso é negociável e, portanto, não deve fazer parte do nome. Para facilitar a leitura, talvez apenas acrescentá-los com o recurso- * seja suficiente. Você se levantou votou algumas vezes, então eu só estou curioso para ouvir o seu processo de pensamento ...
Nick Res
2
Embora sejam boas informações, esta resposta aborda a questão do fluxo em vez da convenção de nomenclatura. Eu acho que o OP gostaria de saber quais palavras reais usar (substantivos vs verbos), delimitadores, maiúsculas e minúsculas etc.
Caltor
6
O livro Entrega Contínua (p. 36) argumenta que esse modelo é antitético à Integração Contínua, ... essencialmente, não é realmente "ágil".
21417 Markon
Na verdade, isso não responde à pergunta que foi feita. Isso oferece informações sobre a integração de um fluxo de trabalho git específico em um cronograma abrangente de desenvolvimento e lançamento; no entanto, a operação está procurando conselhos sobre as convenções sobre o que realmente chamamos de filiais.
Wheeler #
56

Minha preferência pessoal é excluir o nome da ramificação depois que terminar uma ramificação de tópico.

Em vez de tentar usar o nome do ramo para explicar o significado do ramo, inicio a linha de assunto da mensagem de confirmação no primeiro commit nesse ramo com "Branch:" e incluo explicações adicionais no corpo da mensagem, se o assunto não me dá espaço suficiente.

O nome do ramo em meu uso é puramente um identificador para se referir a um ramo de tópico enquanto trabalha nele. Depois que o trabalho no ramo de tópico é concluído, eu me livro do nome do ramo, às vezes marcando o commit para referência posterior.

Isso torna a saída git branchmais útil também: lista apenas ramificações de longa duração e ramificações de tópicos ativas, nem todas as ramificações.

Aristóteles Pagaltzis
fonte
53

Misturei e combinei com diferentes esquemas que vi e com base nas ferramentas que estou usando.
Portanto, o nome completo do meu ramo seria:

nome / recurso / número do rastreador de problemas / descrição curta

que seria traduzido para:

microfone / blogs / RSSI-12 / logo-fix

As partes são separadas por barras, porque elas são interpretadas como pastas no SourceTree para facilitar a organização. Usamos o Jira para o rastreamento de problemas, portanto, a inclusão do número facilita a pesquisa no sistema. A inclusão desse número também o torna pesquisável ao tentar encontrar esse problema no Github ao tentar enviar uma solicitação de recebimento.

MikeG
fonte
Eu sou o mesmo, exceto o número do bug / recurso na mensagem de confirmação (para integração do GitHub -> Pivotal Tracker).
Leo
Eu estou querendo saber o que significa RSSI.
Renshuki
@renshuki é apenas uma chave genérica do projeto Jira. Qualquer que seja o rastreador de problemas que você use, insira o ID do ticket
MikeG 25/04
@ MikeG obrigado pela precisão!
Renshuki 29/04/19
3
Eu uso o mesmo, exceto que eu passar o número de emissão, juntamente com a descrição:name/feature/issue-tracker-number-short-description
lephleg
22

Por que são necessárias três ramificações / mesclagens para cada tarefa? Você pode explicar mais sobre isso?

Se você usa um sistema de rastreamento de bugs, pode usar o número do bug como parte do nome da filial. Isso manterá os nomes das ramificações exclusivos e você poderá prefixá-los com uma palavra curta e descritiva ou duas para mantê-los legíveis por humanos, como "ResizeWindow-43523". Isso também ajuda a facilitar as coisas quando você limpa os galhos, pois pode procurar o bug associado. É assim que costumo nomear meus galhos.

Como essas ramificações acabam sendo mescladas novamente no mestre, você deve excluí-las com segurança depois de mesclar. A menos que você esteja se fundindo --squash, o histórico inteiro da ramificação ainda existirá, caso você precise.

farktronix
fonte
12

Observe que, conforme ilustrado no commit e703d7 ou commit b6c2a0d (março de 2014), agora parte do Git 2.0, você encontrará outra convenção de nomenclatura (que pode ser aplicada às ramificações).

"Quando você precisa usar espaço, use hífen" é uma maneira estranha de dizer que você não deve usar um espaço.
Como é mais comum que as descrições da linha de comando usem várias palavras tracejadas, você nem deseja usar espaços nesses locais.

Um nome de filial não pode ter espaço (consulte " Quais caracteres são ilegais em um nome de filial? " E a git check-ref-formatpágina do manual ).

Portanto, para cada nome de filial que seria representado por uma expressão com várias palavras, usar uma ' -' (traço) como separador é uma boa ideia.

VonC
fonte
7

Seguindo a sugestão de farktronix, usamos os números de ticket de Jira para similares em mercurial, e estou planejando continuar usando-os para ramificações git. Mas acho que o próprio número do bilhete provavelmente é único o suficiente. Embora possa ser útil ter uma palavra descritiva no nome do ramo, conforme observado pelo farktronix, se você alternar entre ramos com bastante frequência, provavelmente precisará digitar menos. Então, se você precisar saber o nome da filial, procure no Jira as palavras-chave associadas no ticket, se não souber. Além disso, você deve incluir o número do ticket em cada comentário.

Se sua ramificação representa uma versão, parece que a convenção comum é usar o formato xxx (exemplo: "1.0.0") para nomes de ramificações e vx.xx (exemplo "v1.0.0") para nomes de marcas (para evitar conflitos) . Consulte também: existe uma convenção de nomenclatura padrão para tags git

Gary S. Weaver
fonte
1
Há algum problema com conflitos? Se a intenção é que uma v1.2.4ramificação acabe levando a um ponto final com uma v1.2.4tag (estou correto ao assumir que esta é a situação em que você está nomeando ramificações e tags após uma versão) , isso importa? A tag ainda pode ser acessada em refs/tags/v1.2.4e a ramificação em refs/heads/v1.2.4, e parece que o Git preferirá o nome da tag quando for ambíguo (com um aviso).
Slipp D. Thompson
1
Para o exemplo da versão, como mencionei na minha resposta, uma prática sugerida é prefixar "v" para nomes de marcas, não ramos. Evite a ambiguidade se puder evitar falhas de comunicação e porque isso pode causar problemas ao migrar para o que for o próximo e maior VCS mais recente.
Gary S. Weaver
2
Recentemente, trabalhei com um repositório em que limitamos cada ramo de versão com uma tag com o mesmo nome. Funcionou consideravelmente bem porque não há pouca ou nenhuma ambiguidade (a tag aponta para o último commit no ramo correspondente na maioria dos casos) e, quando houver, o Git "faz a coisa certa" (com um aviso). Eu prefiro isso, porque se alguém cometer um erro grave e se comprometer ainda mais com um ramo restrito, o Git continuará escolhendo a tag, que é a intenção. A ambiguidade pode simplificar as coisas quando o sistema tem tudo sob controle e a intenção é clara.
Slipp D. Thompson