Git - Quais problemas surgem do trabalho direto no mestre?


25

Eu já vi muitos conselhos sobre modelos de ramificação git e a opinião mais comum parece ser que fazer alterações diretamente no ramo mestre é uma má ideia.

Um de nossos colegas de trabalho está muito feliz em fazer alterações diretamente no ramo principal e, apesar de várias conversas, parece que eles provavelmente não mudarão isso.

Neste momento, não consigo convencer um colega de trabalho que é uma prática ruim trabalhar diretamente no mestre, mas gostaria de entender as coisas que entrarão em conflito com sua maneira de trabalhar, para saber quando preciso revisitar esse assunto.


2
Defina "trabalhando diretamente". O mestre existe porque deve ser usado. O que você acha que é e para que não é?
Candied_orange #

3
Trabalhar fora do mestre está funcionando para você? Se for, por que você sente a necessidade de mudar agora? Se não estiver funcionando, que problemas você está enfrentando? Em vez de pedir que as pessoas apontem os argumentos de outras pessoas, podemos ajudá-lo a resolver seus problemas.
Thomas Owens

1
Parece que ele está desenvolvendo o tronco, o que, juntamente com a integração contínua, é bastante normal em uma equipe Agile. Se ele quiser trabalhar assim, você precisará aplicar o WIP para garantir que nunca haja muito trabalho em andamento contra um produto de cada vez - e também usar a alternância de recursos para garantir que o mestre possa ser liberado com os recursos incompletos desativados.
Sr. Cochese

... qual o tamanho da equipe?
ZJR

@ MrCochese Eu não chamaria o desenvolvimento de tronco no sentido aqui "normal". Certamente, nenhum dos muitos lugares em que usei o Git funcionou dessa maneira, e eu o desencorajaria. As ramificações de recursos funcionam melhor.
Marnen Laibow-Koser

Respostas:


57

Existem vários problemas quando as confirmações são enviadas diretamente para o mestre

  • Se você enviar um estado de trabalho em andamento para remoto, o mestre estará potencialmente quebrado
  • Se outro desenvolvedor começar a trabalhar para um novo recurso do mestre, ele começará com um estado potencialmente interrompido. Isso diminui o desenvolvimento
  • Recursos / correções diferentes não são isolados, de modo que a complexidade de todas as tarefas de desenvolvimento em andamento é combinada em um único ramo. Isso aumenta a quantidade de comunicação necessária entre todos os desenvolvedores
  • Você não pode fazer solicitações pull, que são um mecanismo muito bom para revisões de código
  • Você não pode espremer confirmações / alterar o histórico do git em geral, pois outros desenvolvedores já podem ter puxado o ramo mestre nesse meio tempo

11
Ei, olha! Você realmente respondeu à pergunta, diferente de todos os outros. ++ Bem-vindo ao SE.SE!
precisa

A maioria destes são problemas derivados de trabalhar diretamente mal no mestre , e não de trabalhar diretamente no mestre em si.
Ant P

1
@ AntP, que problemas poderiam ser evitados do seu ponto de vista?
Gernot

10

Explique a ele que os novos recursos precisam de seu próprio ramo de desenvolvimento que possa ser implantado em um ambiente de teste antes de ser enviado à produção.

Caso contrário, você estará em um estado perpétuo de recursos pela metade. Você não pode implantar recursos semi-concluídos na produção; portanto, se você estiver trabalhando diretamente na ramificação mestre, todos os outros deverão esperar que você conclua seu recurso antes que as alterações de outros possam entrar em produção, incluindo correções.

O uso de ramificações independentes para recursos significa que cada novo recurso pode ser testado e implantado independentemente dos outros.


"Você não pode implantar recursos semi-concluídos na produção" - isso não é verdade - é totalmente possível trabalhar diretamente na filial principal, enviar código a cada confirmação, implantar frequentemente "recursos semi-concluídos" e nunca quebrar nada . A entrega contínua consiste em fazer exatamente isso: dissociar a implantação da liberação. O que também acontece para resolver muitos outros problemas organizacionais que as pessoas normalmente tratam com soluções técnicas incompletas. Às vezes, isso envolve alternância de recursos, mas geralmente é possível criar e implantar 90% de um recurso sem alterações comportamentais visíveis.
Ant P

@ AntP: O processo que você está descrevendo não é o que eu chamaria de "recursos semi-concluídos". Esses recursos são testados, prontos para produção e utilizáveis, ou são ocultados por uma opção de recurso ou algo semelhante até que sejam testados, prontos para produção e utilizáveis. Você não está enviando recursos que não funcionam.
Robert Harvey

Você afirmou que novos recursos precisam ser desenvolvidos em ramificações não principais porque não é possível implantar semi-acabados: esse não é o caso. É absolutamente possível desenvolver novos recursos diretamente no mestre e enviar todo e qualquer código relacionado a esses recursos para produção antes que o recurso seja concluído e sem atrasar outro desenvolvimento.
Ant P

1
@ AntP: A única coisa que os ramos de recursos têm que sua técnica não pode fornecer é uma contabilidade completa do trabalho realizado em um recurso específico. Em algumas lojas (especialmente as minhas), esse tipo de prestação de contas não é um luxo, mas um requisito.
Robert Harvey

1
@ AntP Se eu entendi direito, consideraria isso um passo atrás. Adoro bons rastreadores de problemas e os uso extensivamente, mas quero que o VCS me conte o histórico de desenvolvimento de qualquer recurso ou linha de código. O rastreador de problemas pode contar a história do lado comercial de uma mudança, mas se o VCS não puder me ajudar a rastrear e auditar o código por si só, ele não está fazendo seu trabalho. Essa é uma das razões pelas quais me oponho ao desenvolvimento baseado em tronco: torna o VCS estúpido, sem nenhuma vantagem compensadora que eu possa ver. (? Também: acoplamento frágil Uma característica é uma alteração de código.)
Marnen Laibow-Koser

2

O mestre deve ser potencialmente liberável. Período. Não deve haver trabalho pela metade no mestre (a menos que esteja desativado com um sinalizador de recurso)

Com isso dito, eu vi algumas equipes complicarem seu fluxo.

Não usar o PR ao integrar ao mestre é um erro, pois os desenvolvedores não terão o poder de escolher quando a integração ocorrer.

Um único ramo de desenvolvimento traz muito pouco valor. Geralmente isso apenas complica as coisas. Muitos ramos de recursos traz muito valor.

Criar ramificações para cada ambiente (dev, test, prod) é um erro. Isso está fora do escopo do git e deve ser tratado pelo pipeline de lançamento. A mesma construção exata deve ser implantada em todos os ambientes, o que é impossível se houver ramificações para cada ambiente.

Se um recurso é tão grande que não pode ser feito em um ou dois dias, todo o trabalho em um ramo de recurso deve estar em ramos separados e integrado ao PR.


Concordo com a maior parte do que você disse, exceto pelo seguinte: "A mesma versão exata deve ser implantada em todos os ambientes". De fato, um pipeline de liberação geralmente deve poder implantar diferentes compilações em diferentes ambientes e promovê-las à medida que os testes passam. Como você lida com isso, se não com ramificações diferentes (ou pelo menos tags diferentes)?
Marnen Laibow-Koser

Talvez eu não estivesse completamente claro. Depois que uma construção é implantada em um ambiente. Os mesmos artefatos devem ser implementados no próximo ambiente sem uma reconstrução.
Esben Skov Pedersen

Se você tem compilações repetíveis, não importa se você deve reconstruir. Se você não tiver compilações repetíveis, terá problemas maiores. :)
Marnen Laibow-Koser

... mas sim, acho que você deve marcar suas confirmações implantadas para promover o mesmo código (independentemente de reconstruir).
Marnen Laibow-Koser 18/05/19

Sim, mas a maioria dos servidores de CI pode vincular compilações a versões prontas para uso, facilitando o rastreamento de implantações. Quando configurado corretamente, não é realmente necessário rastrear implantações no git. Git é um scm. Não é uma ferramenta de implantação.
Esben Skov Pedersen

2
  • O mestre deve refletir um ramo de produção, uma versão final de trabalho.
  • Trabalhar diretamente no mestre significa que, se você criar bugs, não terá outra opção para "voltar" do que reverter / excluir / redefinir confirmações, o que não é uma maneira limpa de trabalhar e pode causar a perda de partes do novo código que estavam bem.
  • É claro que, nos primeiros estágios do desenvolvimento, talvez você possa começar a trabalhar diretamente no mestre, mas depois de ter algo a oferecer, use ramos de desenvolvimento, teste ou experiência para não tocar na versão de trabalho publicada, completa e em execução.

2

Primeiro, quero salientar que no git, tudo pullé literalmente uma operação de ramificação e tudo pushé uma mesclagem. A mastermáquina on de um desenvolvedor é uma ramificação completamente separada da masterem um repositório central que você compartilha, com a mesma posição de uma perspectiva técnica. Ocasionalmente, vou renomear minha versão local upstreamou algo assim, se ela se adequar melhor aos meus propósitos.

Aponto isso porque muitas organizações pensam que estão usando filiais com mais eficiência do que o seu colega, quando na verdade estão fazendo pouco mais do que criar um nome adicional para uma filial ao longo do caminho, que não será salva na história. Se o seu colega está confirmando recursos em uma confirmação atômica, é tão fácil voltar como uma confirmação de mesclagem de uma ramificação de recursos. A grande maioria dos ramos de recursos deve ter uma vida útil muito curta e, freqüentemente, mesclada de qualquer maneira.

Dito isto, os principais inconvenientes de seu estilo de trabalho são duplos. Primeiro, torna muito difícil colaborar em um recurso inacabado. No entanto, não seria difícil criar uma filial apenas nos momentos em que a colaboração é necessária.

Segundo, torna a revisão antes da mesclagem muito difícil. Nesse ponto, você não precisa convencê-lo. Você pode adotar uma ferramenta como github, gerrit ou gitlab e exigir revisões de código de solicitação pull e passou por testes automatizados para todas as mesclagens. Se você não está fazendo algo assim, francamente, você não está usando o git em todo o seu potencial, e não é de admirar que seu colega não veja esse potencial.


1
Também enviar aos desenvolvedores sua máquina filial todos os dias é um bom backup.
Ian

Não entendo sua primeira importância. Não vejo como a pullcriaria uma nova ramificação ou como a pushseria uma operação de mesclagem. Em vez disso, a pullé literalmente a fetchseguido de a merge!
mkrieger1

@ mkrieger1 Posso ver facilmente como alguém pode considerar o local mastercomo um ramo diferente origin master. Tecnicamente, eles são ramos diferentes em dois controles remotos diferentes, cada um com sua própria história.
RubberDuck

@RubberDuck Sim, exatamente. With pull: Before: dois ramos potencialmente apontando para confirmações diferentes - Depois: dois ramos apontando para confirmações equivalentes - Nenhum ramo criado, portanto, eu não chamaria isso de "operação de ramificação". Se qualquer um dos dois comandos, eu chamaria pushisso, porque potencialmente cria uma nova ramificação no controle remoto. O que não faz, é uma fusão.
mkrieger1

@ mkrieger1 você precisa considerar também a direção da mesclagem.
precisa

2

Outras respostas já mencionaram várias vantagens (recursos isolados, código sempre entregável no mestre, etc.) por trabalhar NÃO no mestre diretamente.

Para mim, você parece ter um problema diferente. Obviamente, você não possui um processo de desenvolvimento, que é acordado ou usado por todos os seus desenvolvedores (ou o desenvolvedor em questão está ignorando totalmente o processo).

Você possui ramificações de recursos, que são mescladas no master ou também possui ramificações de versões diferentes ou utiliza um processo totalmente diferente?

"Não use o ramo mestre" não é suficiente.


2

Um de nossos colegas de trabalho está muito feliz em fazer alterações diretamente no ramo principal e, apesar de várias conversas, parece que eles provavelmente não mudarão isso.

Isso me leva a acreditar que há mais problemas. Trabalhar no master ou não faz parte principalmente de uma filosofia maior sobre como, o que e quando você lança produtos.

Portanto, em conjunto com um "você nunca deve trabalhar no mestre", você tem testes de recursos, você testa o trabalho um do outro, revisa o código um do outro. Testes de aceitação e integração.

Se você não tem nenhuma das opções acima e está apenas fazendo isso para "fazer git", você também pode trabalhar no master.


1

Não há "má prática" em trabalhar diretamente na filial. Mas você precisa decidir o que melhor suporta seu processo:

Pergunta 1: Seu mestre deve representar o estado atual da versão do seu software? Em seguida, você deve apresentar um ramo de desenvolvimento global e mesclar o desenvolvimento no final de um desenvolvimento de release.

Pergunta 2: você deseja ter um processo de revisão de código? Então você deve ter "ramificações de recursos" que serão mescladas no mestre (ou no desenvolvimento, se você tiver um) por meio de solicitações pull.

Pergunta 3: É necessário compartilhar o estado do código intermediário com outros desenvolvedores que ainda não devem ser publicados na produção (ou teste)? É o caso de mais de um desenvolvedor desenvolver um recurso. Então você deve introduzir "ramos de recursos".


Tags são uma maneira muito viável de representar o estado de uma base de código no lançamento. O Git facilita muito o check-out de uma tag específica. Faz um ramo de desenvolvimento meio discutível.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.