Apresentação
Não há nada mais frustrante no mundo do versionamento que um push ou
um pull rejeitado. Mas ao incorporarmos as ferramentas de versionamento
em nossa rotina de trabalho será inevitável em algum momento não
esbarrar em alguma mensagem de rejeição de um push ou pull que, a
maioria das vezes, tem como principal razão a existência de conflitos em
versões de documentos. Portanto, nesta seção vamos entender o que são
conflitos de versionamento, quais suas principais causas e como podemos
resolvê-los.
O que são os conflitos?
Conflitos são, de maneira muito sucinta, duas (ou mais) versões de um
mesmo arquivo. Conflitos são comuns mesmo quando não estamos utilizando
ferramentas de versionamento. Por exemplo, quando tentamos “colar” um
documento em uma pasta com um arquivo que já apresenta o mesmo nome.
Neste momento temos que tomar decisões: Manter o arquivo antigo?
Substituir o arquivo antigo pelo novo arquivo? Manter ambos os arquivos?
Essas são as mesmas decisões que devemos tomar quando lidamos com
conflitos de versões utilizando o git. Com a diferença que temos muito
mais controle de decisão do manejo dos conflitos nos arquivos sob
versionamento.
Quais as principais causas?
Os conflitos surgem por uma série de razões. Baseado no nosso uso
pessoal do versionamento, as duas razões mais comuns que geram versões
conflitantes são:
1 - Devido ao uso de arquivos em repositórios compartilhados, onde
duas ou mais pessoas criam versões diferentes de um mesmo arquivo em
comum.
2 - Devido ao uso de arquivos em diferentes máquinas. Mesmo que o
repositório seja de um único proprietário, caso esteja sendo utilizado
em mais de um computador, versões diferentes de um mesmo arquivo podem
ser criados.
Novamente, essas são as duas fontes mais comuns de conflitos que nós
nos deparamos na nossa prática diária, mas é importante lembrar que
outras fontes de conflito existem. O importante é saber identificar a
fonte de conflito e encotrar a melhor solução para sua resolução.
Veremos isso na próxima seção.
Como identificar conflitos
O conflito irá aparecer em seu console da seguinte maneira:
Quando gerados, os conflitos aparecem em nossos códigos da seguinte
maneira
O arquivo com conflito vai ser indicado no seu console, ao abrir este
arquivo o local de conflito vai aparecer como indicado na figura
acima.
O que é importante entender: A região entre os caracteres
<<<<<< HEAD ======= indica a situação do seu arquivo
local. A região do código entre os caracteres =====
>>>>>>>>> [caracteres e números como indicado
na figura] indica a situação do arquivo no remoto.
A partir disso uma decisão deve ser tomada:
1 - manter um dos dois estados do repositório
2 - realizar um híbrido
3 - excluir ambas
Após tomada essa decisão os caracteres especiais devem ser removidos
do texto
Referências para resolução de conflitos
Aqui trago algumas das referências mais úteis para a resolução de
conflitos. Primeiro, um velho conhecido, o livro da Jenny Brian. O capítulo
22 é um apanhado muito interessante que apresenta
diferentes formas de resolução de conflitos, incluindo os prós e contras
de cada uma delas.
A segunda referência é o site “Oh
shit, Git!?!?”. Este site não se trata de um conjunto didático, mas
sim um compilado de soluções práticas a problemas recorentes no mundo do
versionamento, incluindo problemas de conflitos.
A terceira referência é este material produzido por Tapas
Adhikary, que apresenta de maneira detalhada a origem dos conflitos
e como resolvê-los
LS0tDQp0aXRsZTogJ1Jlc29sdcOnw6NvIGRlIGNvbmZsaXRvcyBkZSB2ZXJzw6NvJw0KYXV0aG9yOiAiR2FicmllbCBOYWthbXVyYSINCmRhdGU6ICJgciBTeXMuRGF0ZSgpYCINCm91dHB1dDogaHRtbF9kb2N1bWVudA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCBmaWcuYWxpZ24gPSAiY2VudGVyIikNCmBgYA0KDQpgYGB7ciBrbGlwcHksIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmtsaXBweTo6a2xpcHB5KCkNCmBgYA0KDQojIEFwcmVzZW50YcOnw6NvDQoNCk7Do28gaMOhIG5hZGEgbWFpcyBmcnVzdHJhbnRlIG5vIG11bmRvIGRvIHZlcnNpb25hbWVudG8gcXVlIHVtIHB1c2ggb3UgdW0gcHVsbCByZWplaXRhZG8uIE1hcyBhbyBpbmNvcnBvcmFybW9zIGFzIGZlcnJhbWVudGFzIGRlIHZlcnNpb25hbWVudG8gZW0gbm9zc2Egcm90aW5hIGRlIHRyYWJhbGhvIHNlcsOhIGluZXZpdMOhdmVsIGVtIGFsZ3VtIG1vbWVudG8gbsOjbyBlc2JhcnJhciBlbSBhbGd1bWEgbWVuc2FnZW0gZGUgcmVqZWnDp8OjbyBkZSB1bSBwdXNoIG91IHB1bGwgcXVlLCBhIG1haW9yaWEgZGFzIHZlemVzLCB0ZW0gY29tbyBwcmluY2lwYWwgcmF6w6NvIGEgZXhpc3TDqm5jaWEgZGUgY29uZmxpdG9zIGVtIHZlcnPDtWVzIGRlIGRvY3VtZW50b3MuIFBvcnRhbnRvLCBuZXN0YSBzZcOnw6NvIHZhbW9zIGVudGVuZGVyIG8gcXVlIHPDo28gY29uZmxpdG9zIGRlIHZlcnNpb25hbWVudG8sIHF1YWlzIHN1YXMgcHJpbmNpcGFpcyBjYXVzYXMgZSBjb21vIHBvZGVtb3MgcmVzb2x2w6otbG9zLg0KDQojIE8gcXVlIHPDo28gb3MgY29uZmxpdG9zPw0KDQpDb25mbGl0b3Mgc8OjbywgZGUgbWFuZWlyYSBtdWl0byBzdWNpbnRhLCBkdWFzIChvdSBtYWlzKSB2ZXJzw7VlcyBkZSB1bSBtZXNtbyBhcnF1aXZvLiBDb25mbGl0b3Mgc8OjbyBjb211bnMgbWVzbW8gcXVhbmRvIG7Do28gZXN0YW1vcyB1dGlsaXphbmRvIGZlcnJhbWVudGFzIGRlIHZlcnNpb25hbWVudG8uIFBvciBleGVtcGxvLCBxdWFuZG8gdGVudGFtb3MgImNvbGFyIiB1bSBkb2N1bWVudG8gZW0gdW1hIHBhc3RhIGNvbSB1bSBhcnF1aXZvIHF1ZSBqw6EgYXByZXNlbnRhIG8gbWVzbW8gbm9tZS4gTmVzdGUgbW9tZW50byB0ZW1vcyBxdWUgdG9tYXIgZGVjaXPDtWVzOiBNYW50ZXIgbyBhcnF1aXZvIGFudGlnbz8gU3Vic3RpdHVpciBvIGFycXVpdm8gYW50aWdvIHBlbG8gbm92byBhcnF1aXZvPyBNYW50ZXIgYW1ib3Mgb3MgYXJxdWl2b3M/IA0KRXNzYXMgc8OjbyBhcyBtZXNtYXMgZGVjaXPDtWVzIHF1ZSBkZXZlbW9zIHRvbWFyIHF1YW5kbyBsaWRhbW9zIGNvbSBjb25mbGl0b3MgZGUgdmVyc8O1ZXMgdXRpbGl6YW5kbyBvIGdpdC4gQ29tIGEgZGlmZXJlbsOnYSBxdWUgdGVtb3MgbXVpdG8gbWFpcyBjb250cm9sZSBkZSBkZWNpc8OjbyBkbyBtYW5lam8gZG9zIGNvbmZsaXRvcyBub3MgYXJxdWl2b3Mgc29iIHZlcnNpb25hbWVudG8uDQoNCiMjIFF1YWlzIGFzIHByaW5jaXBhaXMgY2F1c2FzPw0KDQpPcyBjb25mbGl0b3Mgc3VyZ2VtIHBvciB1bWEgc8OpcmllIGRlIHJhesO1ZXMuIEJhc2VhZG8gbm8gbm9zc28gdXNvIHBlc3NvYWwgZG8gdmVyc2lvbmFtZW50bywgYXMgZHVhcyByYXrDtWVzIG1haXMgY29tdW5zIHF1ZSBnZXJhbSB2ZXJzw7VlcyBjb25mbGl0YW50ZXMgc8OjbzogDQoNCjEgLSBEZXZpZG8gYW8gdXNvIGRlIGFycXVpdm9zIGVtIHJlcG9zaXTDs3Jpb3MgY29tcGFydGlsaGFkb3MsIG9uZGUgZHVhcyBvdSBtYWlzIHBlc3NvYXMgY3JpYW0gdmVyc8O1ZXMgZGlmZXJlbnRlcyBkZSB1bSBtZXNtbyBhcnF1aXZvIGVtIGNvbXVtLiANCg0KMiAtIERldmlkbyBhbyB1c28gZGUgYXJxdWl2b3MgZW0gZGlmZXJlbnRlcyBtw6FxdWluYXMuIE1lc21vIHF1ZSBvIHJlcG9zaXTDs3JpbyBzZWphIGRlIHVtIMO6bmljbyBwcm9wcmlldMOhcmlvLCBjYXNvIGVzdGVqYSBzZW5kbyB1dGlsaXphZG8gZW0gbWFpcyBkZSB1bSBjb21wdXRhZG9yLCB2ZXJzw7VlcyBkaWZlcmVudGVzIGRlIHVtIG1lc21vIGFycXVpdm8gcG9kZW0gc2VyIGNyaWFkb3MuDQoNCk5vdmFtZW50ZSwgZXNzYXMgc8OjbyBhcyBkdWFzIGZvbnRlcyBtYWlzIGNvbXVucyBkZSBjb25mbGl0b3MgcXVlIG7Ds3Mgbm9zIGRlcGFyYW1vcyBuYSBub3NzYSBwcsOhdGljYSBkacOhcmlhLCBtYXMgw6kgaW1wb3J0YW50ZSBsZW1icmFyIHF1ZSBvdXRyYXMgZm9udGVzIGRlIGNvbmZsaXRvIGV4aXN0ZW0uIE8gaW1wb3J0YW50ZSDDqSBzYWJlciBpZGVudGlmaWNhciBhIGZvbnRlIGRlIGNvbmZsaXRvIGUgZW5jb3RyYXIgYSBtZWxob3Igc29sdcOnw6NvIHBhcmEgc3VhIHJlc29sdcOnw6NvLiBWZXJlbW9zIGlzc28gbmEgcHLDs3hpbWEgc2XDp8Ojby4NCg0KDQojIENvbW8gaWRlbnRpZmljYXIgY29uZmxpdG9zDQoNCk8gY29uZmxpdG8gaXLDoSBhcGFyZWNlciBlbSBzZXUgY29uc29sZSBkYSBzZWd1aW50ZSBtYW5laXJhOg0KDQpRdWFuZG8gZ2VyYWRvcywgb3MgY29uZmxpdG9zIGFwYXJlY2VtIGVtIG5vc3NvcyBjw7NkaWdvcyBkYSBzZWd1aW50ZSBtYW5laXJhDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSxvdXQud2lkdGg9IjgwJSJ9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJmaWdzIiwgImNvbmZsaWN0cy1hbGwucG5nIikpDQpgYGANCg0KTyBhcnF1aXZvIGNvbSBjb25mbGl0byB2YWkgc2VyIGluZGljYWRvIG5vIHNldSBjb25zb2xlLCBhbyBhYnJpciBlc3RlIGFycXVpdm8gbyBsb2NhbCBkZSBjb25mbGl0byB2YWkgYXBhcmVjZXIgY29tbyBpbmRpY2FkbyBuYSBmaWd1cmEgYWNpbWEuIA0KDQpPIHF1ZSDDqSBpbXBvcnRhbnRlIGVudGVuZGVyOiBBIHJlZ2nDo28gZW50cmUgb3MgY2FyYWN0ZXJlcyA8PDw8PDwgSEVBRCA9PT09PT09IGluZGljYSBhIHNpdHVhw6fDo28gZG8gc2V1IGFycXVpdm8gbG9jYWwuIEEgcmVnacOjbyBkbyBjw7NkaWdvIGVudHJlIG9zIGNhcmFjdGVyZXMgPT09PT0gPj4+Pj4+Pj4+IFtjYXJhY3RlcmVzIGUgbsO6bWVyb3MgY29tbyBpbmRpY2FkbyBuYSBmaWd1cmFdIGluZGljYSBhIHNpdHVhw6fDo28gZG8gYXJxdWl2byBubyByZW1vdG8uDQoNCkEgcGFydGlyIGRpc3NvIHVtYSBkZWNpc8OjbyBkZXZlIHNlciB0b21hZGE6DQoNCjEgLSBtYW50ZXIgdW0gZG9zIGRvaXMgZXN0YWRvcyBkbyByZXBvc2l0w7NyaW8NCg0KMiAtIHJlYWxpemFyIHVtIGjDrWJyaWRvIA0KDQozIC0gZXhjbHVpciBhbWJhcw0KDQpBcMOzcyB0b21hZGEgZXNzYSBkZWNpc8OjbyBvcyBjYXJhY3RlcmVzIGVzcGVjaWFpcyBkZXZlbSBzZXIgcmVtb3ZpZG9zIGRvIHRleHRvDQoNCiMgUmVmZXLDqm5jaWFzIHBhcmEgcmVzb2x1w6fDo28gZGUgY29uZmxpdG9zDQoNCkFxdWkgdHJhZ28gYWxndW1hcyBkYXMgcmVmZXLDqm5jaWFzIG1haXMgw7p0ZWlzIHBhcmEgYSByZXNvbHXDp8OjbyBkZSBjb25mbGl0b3MuIA0KUHJpbWVpcm8sIHVtIHZlbGhvIGNvbmhlY2lkbywgbyBsaXZybyBkYSBKZW5ueSBCcmlhbi4gTyBbKipjYXDDrXR1bG8gMjIqKl0oaHR0cHM6Ly9oYXBweWdpdHdpdGhyLmNvbS9naXQtYnJhbmNoZXMuaHRtbD9xPWNvbmZsaSNkZWFsaW5nLXdpdGgtY29uZmxpY3RzKSDDqSB1bSBhcGFuaGFkbyBtdWl0byBpbnRlcmVzc2FudGUgcXVlIGFwcmVzZW50YSBkaWZlcmVudGVzIGZvcm1hcyBkZSByZXNvbHXDp8OjbyBkZSBjb25mbGl0b3MsIGluY2x1aW5kbyBvcyBwcsOzcyBlIGNvbnRyYXMgZGUgY2FkYSB1bWEgZGVsYXMuDQoNCkEgc2VndW5kYSByZWZlcsOqbmNpYSDDqSBvIHNpdGUgWyJPaCBzaGl0LCBHaXQhPyE/Il0oaHR0cHM6Ly9vaHNoaXRnaXQuY29tLykuIEVzdGUgc2l0ZSBuw6NvIHNlIHRyYXRhIGRlIHVtIGNvbmp1bnRvIGRpZMOhdGljbywgbWFzIHNpbSB1bSBjb21waWxhZG8gZGUgc29sdcOnw7VlcyBwcsOhdGljYXMgYSBwcm9ibGVtYXMgcmVjb3JlbnRlcyBubyBtdW5kbyBkbyB2ZXJzaW9uYW1lbnRvLCBpbmNsdWluZG8gcHJvYmxlbWFzIGRlIGNvbmZsaXRvcy4NCg0KQSB0ZXJjZWlyYSByZWZlcsOqbmNpYSDDqSBlc3RlIG1hdGVyaWFsIHByb2R1emlkbyBwb3IgW1RhcGFzIEFkaGlrYXJ5XShodHRwczovL3d3dy5mcmVlY29kZWNhbXAub3JnL25ld3MvcmVzb2x2ZS1tZXJnZS1jb25mbGljdHMtaW4tZ2l0LWEtcHJhY3RpY2FsLWd1aWRlLyksIHF1ZSBhcHJlc2VudGEgZGUgbWFuZWlyYSBkZXRhbGhhZGEgYSBvcmlnZW0gZG9zIGNvbmZsaXRvcyBlIGNvbW8gcmVzb2x2w6otbG9zDQo=