Como evitar conflitos de git em uma equipe?

Somos desenvolvedores que trabalham em um projeto e usamos o git para o projeto. Se dois ou mais de nós trabalhamos com o mesmo arquivo, temos conflitos de git que são difíceis de manipular, às vezes as alterações feitas por um desenvolvedor são perdidas quando esses conflitos ocorrem.

Como eles trabalham com o git em um time? Qual deve ser o thread correto para evitar conflitos de git?

Obrigado antecipadamente.

35
11 мая '13 в 0:10 2013-05-11 00:10 Dev01 é definido em 11 de maio de 2013 às 0:10 2013-05-11 00:10
@ 8 respostas

Antes de se aprofundar no fluxo de trabalho, antes de gastar um minuto ou um dólar em dinheiro para restaurar seus processos de comunicação, faça três perguntas à sua equipe:

  • Nós reforçamos os acordos de execução?
  • Se usarmos um IDE, todos eles usam as mesmas configurações de formatação e palavra-chave? Por exemplo, o Eclipse pode concluir automaticamente as configurações .
  • Nós produzimos artefatos de montagem de texto? Por exemplo, nós minimizamos js, geramos regras css a partir de .scss ou .scss ou criamos configurações xml .scss ? Nós verificamos eles?

Depois de vários anos de conflito e ajudando outras pessoas em seus fluxos de trabalho centralizados, imagino que essas três coisas causam a grande maioria de nossos conflitos coletivos:

2019

40
11 мая '13 в 6:55 2013-05-11 06:55 Resposta dada por Christopher em 11 de maio de 2013 às 6:55 2013-05-11 06:55

Bem, francamente, o fluxo de trabalho certo envolve boa comunicação e gerenciamento. Os membros da equipe nem sempre precisam trabalhar no mesmo conflito. Coisas como racks diários e um gerente atento, que sabe que todos os membros da equipe irão - pelo menos em geral - em muitos casos, fazer uma grande diferença para limitar isso.

Depende da natureza exata do produto, é claro, mas é mais um problema organizacional do que um problema git. Na verdade, os conflitos são muitas vezes percebidos como coisas “boas”, porque forçam as pessoas a levantarem-se de suas mesas ou telefonarem umas às outras para falar sobre por que um conflito surgiu e o que precisa ser feito nessa direção. Esta é uma chance de descobrir que uma pessoa deve possuir uma área ou conjunto de arquivos, ou pelo menos ser um ponto de contato para discutir as alterações nesta seção.

Fora do plano de desenvolvimento, não há como evitar conflitos de git, mas será o mesmo problema em qualquer sistema de controle de versão. Toda vez que duas pessoas mudam a mesma seção de código, você precisa descobrir quem vai ganhar. É por isso que na verdade não é apropriado olhar a versão para a solução, mas observe seus próprios métodos e métodos de sua equipe. Dois carros não podem passar pela interseção ao mesmo tempo, mas é muito difícil inventar carros que possam passar uns pelos outros, então inventamos sistemas de controle para luzes de freio e sinais de trânsito. Este é um problema semelhante. Não podemos fazer duas alterações no mesmo, não conflitam, por isso precisamos controlar como trabalhamos com arquivos.

Você pode considerar uma das interfaces que permite o bloqueio no git, mas eu realmente discordo desse conceito fora dos tipos de arquivo incomensuráveis. Acho que é melhor entender o fluxo de trabalho mais eficiente da equipe e, enquanto isso, usá-lo como uma oportunidade para mesclar arquivos de maneira muito eficaz. Eu fiz isso, e agora, depois de vários meses disso, os conflitos não me aborrecem.

10
11 мая '13 в 1:40 2013-05-11 01:40 a resposta é dada por Gary Fixler 11 de maio, '13 às 1:40 2013-05-11 01:40

Existe apenas uma maneira de evitar conflitos: não é necessário que pessoas diferentes editem o mesmo arquivo ao mesmo tempo. Em essência, cada arquivo tem um proprietário responsável por todas as alterações e quem pode transferir a propriedade para outro. A propriedade de arquivos pode ser transferida com base em uma função / filial específica ou no dia-a-dia, desde que a propriedade fique clara.

Se você achar que não pode dar cada arquivo a um proprietário, então:

  • você precisa dividir os arquivos em arquivos menores que podem ser atribuídos ao mesmo proprietário
  • É absolutamente necessário que os conflitos do GIT sejam resolvidos (todos os editores estão sentados para resolver conflitos individuais).
  • Use uma boa ferramenta com várias mesclagens para visualização e resolução de conflitos.
7
12 мая '13 в 3:13 2013-05-12 03:13 a resposta é dada GoZoner May 12, '13 at 3:13 2013-05-12 03:13

Simplificando.

Há mais algumas coisas que você pode fazer que também podem ajudar. Ficará mais claro se eu publicá-las separadamente.

Se você colocar novas coisas, isso ajudará a determinar se você está criando conflitos.

Forneça uma lista de nomes de funcionários

 Andy, Oliver, Ivan, 

Então Brad e Patrick se juntam e seus nomes são adicionados à lista. Você adiciona Brad e eu adiciono Patrick. Adicionamos nomes ao final da lista e usamos git para combinar nossas listas. O resultado será familiar para os usuários do git: -

 Merge branch 'Patrick' into Brad Conflicts: names.txt @@@ -1,4 -1,4 +1,8 @@@ Andy, Oliver, Ivan, <<<<<<< HEAD +Brad, ======= + Patrick, >>>>>>> Patrick 

Agora suponha que fizemos a mesma coisa, mas coloque a ordem alfabética simples em nossa lista. Agora, quando chegamos à união dos dois ramos, os resultados são um pouco mais agradáveis:

 Andy, Ivan, Oliver, 

Adicione um nome e depois mescle outra pessoa com git para adicionar outro nome.

 Auto-merging names.txt Merge made by the 'recursive' strategy. names.txt | 1 + 1 file changed, 1 insertion(+) 

E obter

 Andy, Brad, Ivan, Oliver, Patrick, 

Como não sabemos quem vai se juntar à empresa, nós efetivamente adicionamos a lista aleatoriamente e, inserindo em locais aleatórios, os conflitos de localização nos arquivos são menos prováveis.

3
05 нояб. A resposta é dada por user3070485 05 nov 2015-11-05 18:39 '15 às 6:39 pm 2015-11-05 18:39

Use o início do bloco inicial

Em software como este ...

 function chess() { while (!end_of_game) { make_move() 

linhas de blocos de partida com colchetes de abertura são facilmente confundidas com outras linhas no software que consiste em colchetes de abertura separados. Se o mesmo software é escrito assim, adicionar um bloco começa com as linhas anteriores ...

 function chess() { while (!end_of_game) { make_move() 

que eu pessoalmente não gosto, mas o Git tem, há muito menos linhas que se parecem com o Git e se aceitam erroneamente, ou seja, É mais provável que o Git aceite a edição da mesma maneira que nós, para que qualquer conflito seja muito mais fácil de resolver.

E comenta até o final dos blocos

Use comentários para tornar linhas semelhantes distinguíveis.

Se você escrever muitos javascript e JSON, você pode ter muitas linhas parecidas com essa.

  } } } ) 

Se você comentar sobre a situação, eles podem se tornar distinguíveis.

  } } } ) // end of weekdays() 

e

  } } } ) // end of weekend() 

não parece mais o mesmo para o git. Isso ajudará o Git a entender melhor suas alterações. Se você adicionar algo, por exemplo

 function a() { ... } // end of a() 

O git provavelmente verá isso como uma unidade de mudança e não pensará que você adicionou algo como

 } function a() { ... 

pouco antes do fim de alguma outra função. Mesmo que isso não impeça conflitos, se o Git vir e apresentar suas alterações de maneira inteligente (ou seja, como as examinamos mentalmente), você poderá resolver conflitos facilmente. Um título descritivo, com comentários sobre quais funções são executadas, os parâmetros que elas executam, etc. Também ajuda a evitar que o Git confunda o conteúdo das funções vizinhas.

1
05 нояб. A resposta é dada por user3070485 05 nov 2015-11-05 19:12 '15 às 19:12 2015-11-05 19:12

Notifique os colegas quando você clicou em suas alterações.

Outra maneira de reduzir a dor do conflito é simplesmente dizer aos colegas quando você pressionou suas mudanças. Isso permite que eles coloquem suas alterações e resolvam alguns conflitos ali e depois. Qualquer conflito provavelmente estará entre suas mudanças recentes, novas na sua mente e no que elas estão trabalhando, frescas em sua mente.

Se as pessoas não puxarem as mudanças do ramo principal até que tenham completado um grande desenvolvimento, e então enfrentem conflitos com as mudanças feitas por um número de pessoas na mesma área, então será mais difícil de resolver.

Use o mergetool

Um dos objetivos do Git é o controle de versão. Outros programas especializados em mesclagem de arquivos e resolução de conflitos. Se você configurar um mergetool para usar com o git, ele pode resolver automaticamente muitos problemas que o Git trata como um conflito, ou pelo menos faz um bom palpite para você checar e deixar intocado se parecer bem, ou você confie na ferramenta.

Isso deixa menos conflitos reais que exigem uma solução sensata para resolver.

Use arquivos menores

Eu adiciono um novo controlador na parte inferior do mycontrollers.js, e você adiciona um novo controlador na parte inferior do yourcontrollers.js: não há problema.

Adicionamos um novo controlador na parte inferior de allcontrollers.js: conflict.

(Entretanto, lembre-se de ordenar as coisas em ordem alfabética. MyNewController (), começando com M, pode estar no meio de um arquivo, e seuNovoController (), começando com Y, pode ir no final do mesmo arquivo, novamente sem conflito.)

1
23 июня '16 в 19:10 2016-06-23 19:10 a resposta é dada por user3070485 junho 23 '16 às 19:10 2016-06-23 19:10

Para reduzir o número de conflitos no gerenciamento de versões sem se preocupar com quem edita, basta fazer pequenas alterações e corrigi-las / passo a passo. Divida o problema em partes pequenas o suficiente para poder alterar rapidamente os arquivos e empurrá-los de volta para o tronco. Quanto mais curtos forem os seus ramos, menor a probabilidade de você mesclar conflitos.

Mesmo assim, em algum momento, duas pessoas editarão o mesmo arquivo ao mesmo tempo, sem culpa alguma. A pergunta óbvia é quando isso acontece:

"Como posso me livrar da eliminação de conflitos entre gits?

A resposta é que você tem que puxar o tronco e, muitas vezes, reorganizar o seu galho para ele, e você vai notar conflitos o mais cedo possível, enquanto eles ainda são pequenos. Neste ponto, ambos os desenvolvedores devem se sentar juntos e discutir com calma a melhor maneira de continuar, enquanto as mudanças em suas mentes são novas.

Compare essa abordagem com uma tentativa de resolver conflitos em enormes filiais de vida longa em pânico pouco antes do prazo final para o lançamento, quando os desenvolvedores lutam para memorizar o pensamento por trás de todas as mudanças que fizeram há algum tempo.

0
11 февр. A resposta é dada por Will Sheppard 11 de fevereiro 2016-02-11 19:37 '16 às 19:37 2016-02-11 19:37

Use UTF-8, não UTF-16 para arquivos de texto.

Muitas versões do Git (ou seja, cada versão que usei, até onde eu sei) podem processar arquivos UTF-16 como arquivos binários devido ao grande número de bytes zero em um arquivo de texto UTF-16 típico.

Uma vez que o Git considera um arquivo como um arquivo binário, ele provavelmente continuará tratando o arquivo como um arquivo binário, mesmo que ele seja modificado. Isso significa que o controle de versão é executado armazenando as versões completas do arquivo, não as diferenças entre eles, e algumas das vantagens do sistema de controle de versão são perdidas. (Edit: Não. Recentemente, testei isso alterando o arquivo UTF-16 para UTF-8, executando-o, editando-o e tornando-o novamente - e comecei a processar alterações na forma de alterações de texto depois que os arquivos de origem e edição eram UTF-8. )

A maioria dos editores modernos reconhece o estilo de codificação de caracteres e o estilo de final de arquivo e salva o arquivo no mesmo formato. Alguns editores (por exemplo, Babelpad) permitem que você escolha se deseja salvar seu arquivo em UTF-8 ou UTF-16, com ou sem ordenação de bytes.

Se um arquivo que você quer controlar usando a versão (i) no formato UTF-16, e (ii) funcionará igualmente bem em UTF-8 - por exemplo, o programa fonte para um compilador moderno decente - você deve considerar convertê-lo para UTF-8.

Se o Git assumir que seu código-fonte é um arquivo binário antes de seu primeiro commit, olhe para ele e veja se ele deve ser enviado para o editor e salve-o em outro formato que o Git reconheça como texto.

(Nota: arquivos Linux tendem a ter UTF-8 por padrão. Alguns programas do Windows têm o hábito de criar UTF-16, então os usuários do Windows provavelmente terão um problema. Também note que você deseja consertar isso antes do primeiro consertando um arquivo antes que o Git pense que ele tem um arquivo binário!)

2019