Conflitos de mesclagem complicados frequentes são um sinal de problemas?

35

Em nossa equipe, usamos o Git como nosso controle de origem. Temos várias áreas de código quase independentes, mas com alguma sobreposição. Ultimamente, discutimos fluxos de trabalho e abordagens para usar o controle de origem. Uma reclamação que surge quando eu promovo o uso de um fluxo de trabalho da ramificação de recursos é que as pessoas geralmente enfrentam conflitos de mesclagem complicados que resolvem incorretamente. Por complicado, quero dizer "não é óbvio quanto a como resolver". À luz disso, outros fluxos de trabalho estão sendo usados ​​mais ativamente, como um fluxo de trabalho baseado em "pull rebase".

Como defensor da abordagem do ramo de recursos, não estou realmente recebendo a reclamação. Sim, você precisa manter os ramos de recursos locais atualizados do mestre ou de qualquer outro lugar, mas esse é o único problema real que vejo. Estou pensando que, se suas fusões são sempre complicadas e podem ter efeitos secundários, isso é mais um problema de trabalho em equipe do que um problema do Git.

Estou correto em pensar isso? Os conflitos de mesclagem complicados são um sinal de algo bom ou ruim?

joshin4colours
fonte
11
Quanto tempo duram os recursos? Quão modularizado é o código? Você poderia (por exemplo) escolher a confirmação do código de teste (foi feita primeiro e separada do código real, certo?) Para ver como a funcionalidade mudou?
@ MichaelT A base de código é para nossa base de código de teste automatizado. Estamos prestes a começar a trabalhar em uma nova adição ao nosso projeto, que provavelmente precisará de algum desenvolvimento paralelo por um tempo. Daí a discussão de ramos de recursos versus outros.
Joshin4colours
7
As pessoas realmente enfrentam esse tipo de problema ou apenas temem que esses problemas possam aparecer?
Christopher Creutzig
2
Pela maneira tutorial IMPRESSIONANTE você ligou para :)
Vorac
11
Rebasear a ramificação do recurso ou mesclá-lo com o tronco resulta em mesclagens semelhantes. Rebasing realmente faz mais mesclagens e, como tal, é mais provável que crie conflitos ruins. O que importa é com que frequência é feito.
Jan Hudec

Respostas:

23

Não é impossível que o problema seja o seu código. Se a sua base de código tiver muitas inter-relações entre os módulos, todas as alterações terão tendrils em todos os lugares, e todos os desenvolvedores interagem com o código de qualquer outra pessoa, será um pesadelo.

Eu costumava pensar que você notaria isso de outras maneiras primeiro, mas é possível que você esteja tão acostumado a isso que não possa mais vê-lo.

Michael Kohne
fonte
9
Esse foi meu primeiro pensamento. Conflitos de mesclagem complicados ocorrem quando várias alterações são feitas no mesmo código. Se você tem um projeto bastante jovem, isso é comum, mas se você tem uma base de código de bom tamanho, isso pode ser um sinal de "objetos-deus" ou que alguns módulos / classes estão fazendo muito e precisam ser refatorados. Também pode resultar de comprometedores excessivamente zelosos que cometem dezenas de pequenas alterações, mas isso é menos comum.
TMN
11
O fato de nossa base de código ser um pouco "jovem" (aproximadamente 6 meses de idade, submetida a vários grandes refatores) pode ser um indicador disso.
Joshin4colours
10
@ joshin4colours Se você está refatorando enquanto alguém está escrevendo um recurso grande, está em apuros.
Sean McSomething
17

Estou acostumado ao fluxo de trabalho "buscar-rebase-empurrar". Na verdade, é o primeiro fluxo de trabalho mais primitivo descrito em seu tutorial. Aqui estão as vantagens:

  • Integração contínua e verdadeira
  • Gerenciamento precoce de conflitos - logo após a pessoa ter escrito e testado o código
  • Resposta rápida - "Ei, Bob, a interpolação cúbica que você escreveu está dando uma saída engraçada, você pode olhar enquanto estou no almoço?"
  • Sem mesclagem confirmada - linha do tempo limpa como se um desenvolvedor escrevesse everithyng

Agora, sobre conflitos de mesclagem complicados. Não entendo como é possível experimentar fusões frequentes e complicadas. A complicação decorre de não refazer a seleção por muito tempo, trabalhando nesse recurso por um mês.

Eu, pessoalmente, preferiria lidar com conflitos frequentes e fáceis de mesclar (na verdade, refazer a recuperação), em vez de um horror raro e abrangente.

Vorac
fonte
11
Ótima descrição de um bom fluxo de trabalho do Git, mas isso não responde muito bem à minha pergunta.
Joshin4colours
2
@joshy isso é verdade. Apenas o tipo do parágrafo do meio aborda sua pergunta. Mas aqui está uma resposta direta. Se a mesclagem for frequente e difícil, isso certamente será uma indicação de fluxo de trabalho / problema de comunicação / problema de arquitetura / divisão ou problema de funções.
Vorac
7

Mesclagens e rebotes devem causar exatamente os mesmos conflitos, para aqueles conflitos inerentes que um ser humano deve resolver (ou seja, dois desenvolvedores alterando a mesma linha de código). Para outros conflitos, as mesclagens tendem a ser mais limpas, porque você não está alterando o SHA-1 de confirmações em todo o lugar. Não tenho certeza de como você está conseguindo entrar em um estado em que as fusões causam mais conflitos do que rebotes, mas é certamente um sinal de que o fluxo de trabalho de algumas pessoas está bagunçado e eles provavelmente precisam de mais treinamento sobre como o git funciona. Eles estão removendo os commits de mesclagem de outras pessoas quando realizam suas refazeres locais, ou algo assim?

O benefício e a desvantagem do método pull-rebase é muito semelhante aos fluxos de trabalho centralizados com os quais muitas pessoas estão acostumadas. Você não precisa entender a ramificação para usá-la.

De qualquer forma, é perfeitamente possível executar um fluxo de trabalho de ramificação de recursos apenas localmente, se você não conseguir que outras pessoas façam logon nele.

Karl Bielefeldt
fonte
5

O projeto em que estou trabalhando apresenta esse tipo de problema de tempos em tempos e parece resultar de alguns fatores:

  • Estamos usando o Visual Studio e arquivos como o Visual Studio .sln são apenas documentos XML (que não respondem bem a mesclagens textuais) cheios de Guids (que o Git não pode entender melhor do que o resto de nós) e podem ser facilmente mal mesclado e causar a perda de arquivos.
  • Algumas pessoas estão trabalhando em áreas semelhantes do código, para que as alterações recebidas possam estar próximas umas das outras nas classes. Embora inevitável nessa situação, esse tipo de configuração será um trabalho muito difícil para qualquer sistema de controle de origem. Mesmo se você tiver uma ótima comunicação em sua equipe, às vezes as pessoas não perceberão que estão esbarrando no código umas das outras e surgem conflitos.

Estou interessado no potencial do Semantic Merge para ajudar com alguns desses problemas, mas obviamente isso é útil se você estiver trabalhando em um idioma que ele possa analisar e ainda não enfrentei nenhum desafio significativo quando eu ' estou usando, então não posso garantir sua eficácia.

glenatron
fonte
4

A menos que os desenvolvedores estejam modificando confirmações históricas (em vez de mesclagens puras), os conflitos em um modelo git do tipo de fluxo de trabalho do recurso são um sinal de uma base de código fortemente acoplada (/ brandnew codebase) ou atribuição de recurso sobreposto.

sjakubowski
fonte
0

Você tem uma ramificação principal (principal) e todos trabalham em suas ramificações de recursos.

O trabalho nas ramificações dos recursos pode levar de algumas horas a alguns meses.

De vez em quando alguém reverterá a mesclagem do seu changeset de volta ao ramo principal. O líder de sua equipe precisa garantir que apenas uma pessoa faça uma mesclagem inversa por vez. Uma vez feito isso, você precisará encaminhar a mesclagem da ramificação principal para a ramificação de recursos. Depois que todo mundo faz uma mesclagem direta, outra pessoa pode ter permissão para reverter a mesclagem na ramificação principal. Caso contrário, muitas alterações serão mescladas reversamente e você terá vários conflitos de mesclagem na mesclagem direta.

Apenas para esclarecer a terminologia, por "mesclagem reversa", quero dizer mesclar da ramificação do recurso na ramificação principal, e por "mesclagem direta", quero dizer mesclar da ramificação principal na ramificação do recurso. Com base no que já experimentei antes, é provável que você veja mais conflitos de mesclagem na mesclagem reversa, em oposição à mesclagem direta.

CodeART
fonte
11
A fusão no ramo principal nunca deve ter nenhum conflito. Você sempre mescla o principal ao recurso primeiro, portanto, o recurso ao principal fica livre de conflitos.
precisa saber é o seguinte
@ gnasher729 - Eu acho que é isso que esta resposta está dizendo - a sugestão que eu vejo é que todo desenvolvedor mescla do principal para os ramos de recursos toda vez que alguém comete algo no main, para que todos os conflitos sejam resolvidos imediatamente nos ramos de recursos.
Periata Breatta
Ele disse "você é mais propensos a ter conflitos na concentração de recurso para mestre"
gnasher729
0

Duas coisas que podem ajudar: Primeiro, evite qualquer ferramenta que faça alterações por conta própria. Dois desenvolvedores que usam configurações diferentes de guias são uma receita para o desastre. Segundo, faça alterações em locais diferentes. Você tem um problema, por exemplo, se três desenvolvedores adicionarem código no final do mesmo arquivo - muito melhor se eles adicionarem código em lugares diferentes.

gnasher729
fonte