Conflitos de merge são comuns e muitas vezes o desenvolvedor não entende o que são. Este é um problema extremamente comum e, infelizmente, não se conhece uma boa maneira de evitá-lo.
Como surgem conflitos no merge
Vamos chamar seus desenvolvedores de Alice e Bob. Alice fez os commits 1-5, e Bob fez os commits A e X. Aqui está uma história plausível:
-
Bob faz o commit A.
Alice faz os commits 1-4, e faz push deles para o repositório central (remoto).
Bob tenta fazer push do A, mas não consegue, pois seu repositório está desatualizado.
$ git push ! [rejected] master -> master (non-fast-forward)
Então o Bob faz o que você disse para ele fazer: ele roda o pull primeiro. Entretanto, dá um conflito no merge porque o commit A e os commits 1-4 mexem no mesmo código.
$ git pull Auto-merging file.txt CONFLICT (content): Merge conflict in file.txt Automatic merge failed; fix conflicts and then commit the result.
Bob vê as alterações das outras pessoas em sua cópia de trabalho, e não entende porque elas estão ali.
$ git status both modified: file.txt
Ele pensa que o Git está fazendo algo errado, quando na verdade, o Git está pedindo a ele para resolver um conflito no merge. Ele tenta pegar uma cópia nova do arquivo, mas recebe o erro:
$ git checkout HEAD file.txt error: path 'file.txt' is unmerged
Como isso não funcionou, ele tenta com
-f
:$ git checkout -f HEAD file.txt warning: path 'file.txt' is unmerged
Sucesso! Então ele faz o commit e push das suas alterações.
$ git commit $ git push
Onde a coisa fica complicada
Existem muitas ferramentas git por aí. Sério. O Visual Studio e o Xcode vêm com integração com o Git, existem várias outras GUIs e até vários clientes de linha de comando. As pessoas também são desleixadas com a maneira que descrevem como usam o Git, e a maioria dos desenvolvedores não se sentem confortáveis o suficiente com o modo como o Git funciona além do "pull commit push"
Alguns pontos relevantes a cerca disso:
A maioria dos desenvolvedores não sabem realmente como usar o Versionador de código, exceto por alguns comandos realmente simples (commit, push).
Quando o Versionador de código não se comporta da maneira que os desenvolvedores esperam, eles recorrem a táticas como copiar e colar algum comando que não entendem muito bem para "consertar as coisas", adicionando o parâmetro -f ou simplesmente apagam o repositório e começam novamente com um nova cópia.
Em equipes de desenvolvimento, muitas vezes apenas os desenvolvedores líderes realmente sabem o que está acontecendo no repositório.
Então na verdade isso é um problema de capacitação.
Acho que a principal lição aqui é que o Bob precisa aprender é que o git pull é só um git fetch e git merge, e que você pode obter conflitos de merge e precisa agir de maneira muito consciente e proposital ao resolver os merges. Isso se aplica mesmo quando não há conflitos relatados... mas não vamos quebrar a cabeça com isso por enquanto!
Deixe um comentário (0)