Eu sou o novo desenvolvedor - esta é minha primeira posição de programação.
Meu problema é o seguinte: Usamos git
- cortei uma ramificação de nossa develop
ramificação e depois comecei a trabalhar na tarefa menor que me foi atribuída. É muito lento, porque sou inexperiente. No momento em que estou pronto para mesclar meu ramo com develop
os outros, fizemos tantas mudanças que a solução dos conflitos é esmagadora (na verdade, parece mais fácil descartar meu trabalho e começar de novo a tarefa, o que, obviamente, não é uma solução sustentável )
Como supero isso? Existe uma tática que eu possa usar além de 'ser melhor em codificação'? Pretendo falar com meu supervisor na próxima semana.
Respostas:
Você obtém conflitos de mesclagem se as alterações feitas em sua ramificação estiverem próximas das alterações feitas por seus colegas na
develop
ramificação, ou seja, se você e seus colegas alteraram as mesmas linhas de código ou linhas adjacentes no mesmo arquivo.Portanto, para reduzir a probabilidade de conflitos de mesclagem, tente mesclar mais cedo para que seus colegas alterem menos linhas nesse meio tempo ou tente alterar menos linhas por conta própria.
Para alterar menos linhas, certifique-se de fazer apenas alterações relacionadas à sua tarefa.
Se você precisar experimentar maneiras diferentes de atingir seu objetivo, talvez algumas de suas experiências tenham mudado de linha que realmente não precisam ser alteradas? Desfazer essas alterações antes de mesclar.
Existem também alguns comandos Git que podem ajudá-lo a alterar o mínimo de linhas possível:
git diff
egit diff --staged
para ver quais linhas você mudou.git add -p
para adicionar apenas algumas de suas alterações em um arquivo.git commit --amend
egit rebase -i
ajustar os commit que você já fez no seu ramo de recursos local antes de enviá-los para outros repositórios Git.(Mudar o menor número de linhas possível também pode tornar mais fácil para rever o seu trabalho ou de usar ferramentas que trabalham sobre as diferenças entre comete tais como
git cherry-pick
,git rebase
,git bisect
, egit blame
.)Mas, mesmo que você reduza a probabilidade de conflitos de mesclagem, às vezes ainda ocorrerá conflitos de mesclagem. Portanto, não tenha medo deles, mas aprenda a resolver os conflitos.
fonte
git fetch
egit diff origin/develop
vai mostrar uma prévia do seu merge (tipo de). Dá a você a chance de limpar suas alterações antes de obter uma tonelada de conflitos sem sentido.Presumo que você esteja usando o git. Nesse caso, use
git rebase -i
(o-i
meio interativo). Faça uma tarefa diária (ainda mais frequentemente, se necessário) refazer sua ramificação contra a ramificação revelada. Isso traz as alterações de forma incremental todos os dias (pelo menos) para manter sua ramificação de recursos atualizada. Se houver conflitos durante o rebase diário, você precisará conversar com sua equipe sobre quem está trabalhando no quê.Se você executá-lo diariamente, provavelmente não precisará da parte interativa. Apenas deixe fazer o que quiser.
Sou um desenvolvedor bastante experiente e ainda me leva um pouco de tempo para me atualizar sobre um novo projeto. No seu caso, parece que você tem várias pessoas trabalhando no mesmo projeto simultaneamente; portanto, é um projeto muito grande ou um novo projeto que está evoluindo rapidamente. Em ambos os casos, não se preocupe se você levar vários meses para entrar no fluxo. Se eu alternar projetos por 2 ou 3 semanas e depois voltar, pode levar algumas horas (ou até um dia ou dois) para voltar totalmente a um projeto que escrevi 100% sozinho!
Em suma, não se preocupe em ser lento no momento. A maneira de melhorar é apenas continuar praticando. Não tenha medo de perguntar a outros desenvolvedores sobre aspectos dos projetos que você não entende.
EDITAR:
Ou use
merge
. Essa também é uma opção. Portanto, o acima seria: "usegit rebase -i
(os-i
meios interativos) ougit merge
". Quanto a qual usar, converse com o resto de sua equipe. Eles podem (ou não) ter fortes preferências de qualquer maneira. É claro que algumas pessoas não têm preferências fortes.fonte
git pull
que é apenas uma combinação degit fetch
egit merge
(ou você pode adicionar--rebase
para fazer uma rebase em vez de mesclar). Supondo que você esteja com apenas um dia de atraso e, em uma LAN, isso provavelmente será concluído em menos de segundo, poderá demorar alguns segundos na Internet. Mesmo na Internet e com pequenos conflitos de mesclagem, você pode estar atualizado e mesclado corretamente em menos de um minuto. Passar cinco minutos espalhados por toda a semana é muito melhor do que passar uma hora no final da semana lidando com um conflito de fusão.git bisect
: O material rebasado pode nem ser compilado, por issogit bisect
é inútil nos commits quebrados resultantes. @maaartinus: Eu, por exemplo, prefiro a história verdadeira ao invés da história linear. Se você se recuperar, é absolutamente necessário verificar cada novo comprometimento quanto à sanidade para evitar mentiras prejudiciais.Isso pode ser um sinal de engenharia de software ruim por parte da empresa. Muitas interdependências, problemas diferentes com recursos sobrepostos, tentar resolver problemas na ordem errada etc. podem causar a situação que você está descrevendo. Sugiro mesclar regularmente
develop
em seu ramo durante o desenvolvimentofonte
As respostas aceitas são mais do tipo "como usar melhor o Git", acho que isso é mais um problema de equipe do que um problema de engenharia ou ferramentas.
Se você estiver enfrentando muitos conflitos de mesclagem, significa que você e outra pessoa da equipe estão pisando nos dedos uns dos outros.
Você ou eles devem ter como objetivo desenvolver espaço pessoal durante a codificação e evitar trabalhar em áreas que já estão ocupadas.
Na minha equipe, tendemos a um alto grau de propriedade da tarefa.
Normalmente, tomarei a propriedade total e completa de dois ou três arquivos de cada vez e trabalhei neles em uma filial por um dia ou dois.
Normalmente, se alguém tocar nesses arquivos, é apenas se for absolutamente necessário para suas próprias tarefas, geralmente não trabalhamos juntos no mesmo bloco de tarefas!
Se você achar que precisa mesclar bastante, o código de todas as equipes está em um único lugar (o que é algo a ser evitado por si só) ou todas as suas tarefas.
Tudo isso dito, como um novo desenvolvedor, você provavelmente não está em posição de impor, solicitar ou até mesmo sugerir qualquer tipo de reestruturação.
O que eu esperaria é que suas tarefas tenham sido designadas como material "aprenda as cordas" que devem ser razoavelmente acessíveis no seu nível de habilidade para facilitar a entrada na equipe. Eles provavelmente foram selecionados das tarefas de um colega de trabalho que ainda está trabalhando na mesma área, daí seus conflitos de mesclagem.
A solução para isso é resolvê-lo, resolver os problemas, lidar com os conflitos de mesclagem da melhor maneira possível e não se preocupar muito, desde que você esteja fazendo o possível, cabe ao seu gerente se preocupar com seu progresso.
Você ficará mais rápido e mais confiante à medida que avança,
fonte
A coisa mais importante sobre a fusão é que, quanto mais você espera, mais doloroso fica. E o problema cresce mais que linear. Três vezes mais conflitos são nove vezes mais trabalho. Existem algumas estratégias:
Mesclar com o ramo de desenvolvimento sempre que ele muda, para que você esteja sempre próximo e nunca tenha um grande número de conflitos.
Se você demorar muito, pode ser porque você passa a maior parte do tempo descobrindo quais são as alterações e, em seguida, uma pequena quantidade de tempo implementando as alterações. Se for esse o caso, mescle com a ramificação de desenvolvimento antes de iniciar as alterações reais do código.
Converse com seus colegas sobre estratégias para evitar conflitos. Você terá conflitos se duas pessoas editarem o mesmo código. Não é apenas o mesmo arquivo, mas o mesmo código. Então, eu preciso de uma nova função functionA e você precisa de uma nova função functionB, e nós a adicionamos no final do mesmo arquivo, temos um conflito. Se o adicionarmos em lugares diferentes, não haverá conflito. Se nós dois o adicionarmos em um local no arquivo em que ele pertence logicamente, é provável que não tenhamos conflito.
Se você tiver conflitos, obtenha uma boa ferramenta diff, para poder comparar a ramificação de desenvolvimento antes da mesclagem, o código antes da mesclagem, o código original e o código mesclado e mesclar manualmente.
Na pior das hipóteses: você não joga fora o seu trabalho, mas use uma boa ferramenta de diferenças para descobrir exatamente quais alterações você fez, desvie novamente do desenvolvimento e aplique todas as alterações feitas manualmente em vez de digitá-las novamente.
fonte
Lidar com conflitos
git merge
geralmente é mais simples que emgit rebase
. No Git merge, você pode ver toda a lista de arquivos que foram modificados ao mesmo tempo. Não importa quantas confirmações foram feitas por outros colegas de trabalho, você precisará mesclar uma vez . Com o rebase do fluxo de trabalho, você pode acabar enfrentando os mesmos conflitos várias vezes e precisar revê-los manualmente. Você pode corrigir o 13º commit e sentir que não pode ver a luz saindo do túnel .Pela minha experiência, quando tentei resolver ingenuamente conflitos repetidos de rebase, acabei perdendo as modificações de alguém ou com um aplicativo que nem sequer foi compilado. Frequentemente, eu e colegas de trabalho realizamos muito trabalho, mas ficamos tão sobrecarregados com a complexidade de repetir conflitos que tivemos que abortar e perder nosso trabalho anterior depois de algumas punições de rebase.
Vou sugerir algumas técnicas, mas elas só podem ajudar a mesclar a ficar mais fácil do que automatizar a tarefa.
Também vi alguns maus hábitos nos fluxos de trabalho do Git em minhas equipes. Muitas vezes, as pessoas se comprometem demais com seus ramos. Eu pessoalmente testemunhei um desenvolvedor adicionando de 10 a 20 confirmados rotulados como "correção", cada um comprometendo uma ou duas linhas. Nossa política é que os commits sejam rotulados com tickets JIRA para que você tenha uma idéia.
@JacobRobbins sugere fazer
git rebase
uma tarefa diária. Eu gostaria de levar sua abordagem adiante.Primeiro, use rebase uma vez apenas para reduzir o número de confirmações para um punhado. E rebase apenas no ramo de desenvolvimento original , que é o commit do qual você ramificou. Quando digo algumas, posso dizer 3 ou 4 (por exemplo, todo o front end, todo back-end, todos os patches do banco de dados) ou qualquer figura humanamente razoável. Depois de consolidá-los, use
fetch
e trabalhe sua rebase na ramificação upstream. Isso não salvará você de conflitos, a menos que sua equipe revise sua própria abordagem, mas tornará sua vida menos dolorosa.Se você tiver perguntas adicionais sobre tarefas específicas, fique à vontade para pesquisar e perguntar no Stackoverflow.
[Editar] sobre a regra de não reformatação e escoteiro. Reformulei um pouco o formato RE para destacar que o que quero dizer é a tarefa de formatar do zero todo o arquivo de origem, incluindo o código que não foi tocado por você. Ao contrário de sempre formatar seu próprio código, que é perfeitamente desprezível, vários desenvolvedores, inclusive eu, são usados para reformatar o arquivo inteiro com os recursos do IDE. Quando o arquivo é tocado por outras pessoas, mesmo que as linhas afetadas não sejam alteradas em seu conteúdo e semântica, o Git o verá como um conflito. Somente um editor com reconhecimento de idioma muito poderoso pode sugerir que o conflito está relacionado apenas à formatação e mesclagem automática do fragmento melhor formatado. Mas não tenho evidências de tal ferramenta.
Afinal, a regra dos escoteiros não exige que você limpe a bagunça de outras pessoas. Apenas seu.
fonte
Primeiro, não pense em descartar suas alterações. Você perderá oportunidades para aprender o processo de mesclagem.
Segundo, encontre uma pessoa que trabalhou nos arquivos que estão causando conflito. Você pode ver a história. Converse com a pessoa e resolva conflitos nesses arquivos. Faça o mesmo para outros conflitos.
Se houver muitos conflitos, sua tarefa pode ser menor, mas repetitiva. Tente encontrar um padrão. Isso ajudaria a resolver conflitos pelas ferramentas de cliente da interface do usuário do Git. Eu uso o TortoiseGit. Ajuda na mesclagem.
E para evitar no futuro,
É uma prática muito boa mesclar o ramo de desenvolvimento regularmente ao ramo de recursos.
Se você tiver o IC ativado, veja se a ferramenta de IC fornece uma compilação de ramificação. Isso deve se basear em todas as verificações feitas no ramo de recursos, mas após a mesclagem, desenvolva o ramo.
fonte
Você deve executar regularmente (diariamente) o comando 'git fetch' (não git pull) do seu ramo de desenvolvimento. Isso fará com que outras pessoas cometam alterações e as traga para o seu ramo de recursos sem tentar integrar as alterações ao seu ramo.
É algo sobre o qual você deve conversar com o desenvolvedor líder (não necessariamente seu gerente), porque sua empresa pode ter seus próprios padrões ou maneiras recomendadas de lidar com esse problema; é muito comum Não espere até a próxima semana - descubra o processo agora e pergunte se você pode cometer algum trabalho trivial (como formatação de código ou adicionar comentários) para poder testar o processo.
fonte
Obviamente, a primeira coisa é evitar que várias pessoas trabalhem nos mesmos arquivos em primeiro lugar, pelo menos de uma maneira que leve a conflitos difíceis. Adicionar coisas às enumerações não é problema, desde que seja usado um bom formato de código. Alterar o fluxo de controle de maneiras diferentes e mover o código é muito mais complicado. Às vezes isso é inevitável, no entanto. Você precisará fazer perguntas ao resolver conflitos verdadeiramente complexos.
Dito isto, vejo muitas respostas recomendando mesclar / re-criar para desenvolver regularmente. Eu ficaria muito menos entusiasmado com esse tipo de conselho. Seu objetivo neste momento é tornar o processo de solução de conflitos o mais fácil e seguro possível. Uma coisa que ajudará tremendamente com esse processo é ter tantos testes de regressão disponíveis imediatamente, incluindo os novos que fazem parte do seu novo recurso. Se você sincronizar sua ramificação muito regularmente com o develop, invariavelmente acabará tendo que resolver conflitos enquanto estiver na metade da implementação do seu recurso. E isso significa que será muito mais difícil tentar descobrir o que o código deve fazer, como você não fez com ele. Antes de tentar mesclar, verifique se o seu ramo é uma unidade coerente de mudança. Melhor ainda,
Tentei não entrar no mérito de rebase sobre mesclagem, o que provavelmente é para outra pergunta. Nesse contexto, as ferramentas realmente não importam.
fonte
Isso soa como um cenário ideal para programação em pares !
Mais informações sobre os benefícios e abordagens básicas:
https://gds.blog.gov.uk/2018/02/06/how-to-pair-program-effectively-in-6-steps/
Você naturalmente acelerará com o tempo trabalhando sozinho, mas pode ser assustador até esse momento chegar, e às vezes também é um longo caminho. Além disso, embora as pessoas possam aprender rapidamente a estar em um ambiente estressante sempre pressionado a se atualizar, outras pessoas que não aprenderem bem sob pressão constante serão prejudicadas.
Em vez de trabalhar em um ramo por conta própria e tentar acompanhar outros desenvolvedores que são obviamente muito mais rápidos que você, você trabalha diretamente (o mesmo PC) com outro desenvolvedor. Dessa forma, você recebe conselhos instantâneos e provavelmente receberá dicas de como acelerar etc.
Você descobriria a melhor abordagem para o código específico em seu projeto, pois a programação em pares nem sempre faz sentido para alguns projetos - embora, sem dúvida, sempre faça sentido para o aprendizado, mesmo se você apenas sentar e assistir a alguém mais experiente que você (desde que sejam um bom desenvolvedor, experiência não significa necessariamente que eles usam boas práticas).
Sentar-se com um desenvolvedor mais rápido e experiente tem potencial para ajudar:
Meu conselho é discutir a programação de pares com os outros desenvolvedores e, em seguida, abordar seu supervisor. Se eles forem decentes, eles apreciarão sua iniciativa, que tem mais chances de você mostrar os profissionais da programação em pares (se eles precisarem disso, a maioria das pessoas sabe disso e é do conhecimento geral por que isso ajuda).
fonte
Existem alguns problemas subjacentes aqui. Seus problemas de fusão provavelmente não são sua culpa e são mais comumente um sintoma de más práticas.
1) Idealmente, você fundiria seu ramo para se desenvolver todos os dias. Tente ter código de trabalho pelo menos uma vez por dia que passe em todos os testes para que você possa mesclar-se ao desenvolvimento.
2) Se você não tiver código de trabalho em nenhum momento durante seu dia normal de trabalho, provavelmente terá grandes pedaços de código para trabalhar. Você precisa dividir sua tarefa em tarefas menores que podem ser concluídas (idealmente independentemente uma da outra) mais rapidamente para poder mesclar.
3) Seus arquivos de projetos provavelmente são muito grandes. Se houver muitos conflitos de mesclagem para um arquivo, há muitas pessoas trabalhando em um arquivo. Idealmente, algo em que uma pessoa está trabalhando deve ser separado do que todo mundo está trabalhando.
4) Sua equipe pode ser muito grande. Se você achar mais fácil jogar fora um recurso inteiro e recomeçar, é provável que haja muitas pessoas enviando código para o mesmo repositório.
5) Você pode não ter padrões consistentes de formatação de código. Se você nem sempre usar a mesma formatação de código, obterá muitos conflitos diferentes para o mesmo código. Dependendo de como o seu git está configurado, eles podem até chegar a conflitos de espaço em branco (finais de linha, recuo, tabulações versus espaços).
6) As pessoas podem estar enviando suas alterações diretamente para o ramo de desenvolvimento.
Aqui está o que você pode fazer: 1) Se você não conseguir mesclar o desenvolvimento todos os dias, mescle / rebase desenvolva no seu ramo todos os dias (ou com mais frequência).
2) Tente separar seu código do código de todos os outros.
3) Converse com o restante da equipe sobre recursos menores, padrões de codificação consistentes e melhor organização do código (arquivos menores, funções menores).
fonte
Na maioria das vezes, é isso que faço, na primeira vez em que corrigo um bug ou faço uma alteração no sistema, estou aprendendo sobre como fazê-lo. A próxima vez que eu corrigir o mesmo bug, leva apenas 1% do tempo, pois agora eu entendo o problema.
Também acho que, quando refiz um pouco de trabalho, escrevo um código melhor ...
Portanto, não há nada de errado em criar uma nova ramificação do mestre, refazendo seu trabalho nela, enquanto usa sua "ramificação privada" para lembrá-lo do que você precisa fazer.
Também é possível que você tenha descoberto uma maneira de dividir sua alteração em partes lógicas e corretas, cada uma que será mesclada na ramificação mestre depois de concluída. Por exemplo, os testes de unidade e as alterações no código de back-end podem ser feitos e mesclados. Em uma operação separada, você pode fazer as alterações na interface do usuário que as utilizam, portanto, há menos risco de alguém editar o mesmo arquivo da interface do usuário.
fonte
Se você não deseja mesclar a ramificação de desenvolvimento em sua ramificação com muita frequência, poderá obter um fluxo de trabalho mais parecido com o svn usando
git pull --rebase
. Isso irá puxar os novos commits e rebase seus commits neles. Isso significa que, quando você mesclar sua ramificação para o desenvolvimento, será uma mesclagem de avanço rápido (como se você tivesse adicionado todos os seus commits do passado ao mesmo tempo, um após o outro) e não tivesse nenhum conflito de mesclagem, porque você os resolveu durantegit pull --rebase
.Porém, quanto mais confirmações você fizer antes de mesclar sua ramificação para desenvolver ou evoluir para sua ramificação, mais complicada será a próxima rebase e subverte um pouco a sensação de ramificação de recursos, pois sua ramificação só existe enquanto estiver imersa .
fonte
Quando você trabalha em arquivos comuns, você ou seus colegas de equipe precisam resolver todos os conflitos antes que a mesclagem termine; portanto, em primeiro lugar, não fique chateado . Você ainda está trabalhando no projeto e se orgulha do seu trabalho. Agora, para fazer uma jogada mais inteligente, você pode seguir algumas sugestões abaixo.
Divida as tarefas independentemente:
Antes de iniciar seu trabalho, planeje e divida tarefas inteiras de maneira que a tarefa atribuída a cada membro da equipe seja o mais independente e modular possível (para evitar possíveis conflitos durante o desenvolvimento). Você pode se aproximar do seu líder de scrum para atribuir algumas tarefas independentes para você como você é novato.Mesclar confirmações frequentes granulares:
Não espere que a tarefa completa seja concluída antes da marcha final. Obviamente, qualquer tarefa maior pode ser particionada em várias subtarefas. Portanto, uma abordagem melhor é mesclar confirmações menores para subtarefas menores ao mesmo tempo, com frequência, para evitar a resolução de conflitos volumosa.Troque sua ramificação com frequência:
Faça uma prática de rebase frequente para sua filial local com a remota. Você pode usar o comando abaixo para refazer frequentemente sua ramificação local por uma remota,
Até agora, esse é o comando git mais útil para mim na minha vida de desenvolvimento.
Trabalhe em estreita colaboração com os colegas de equipe:
Se você realmente precisa trabalhar paralelamente com seu colega de equipe em uma tarefa comum, trabalhe em colaboração. Ela pode esperar algum tempo para evitar uma complexa resolução de conflitos para sua conveniência, pois você é iniciante e é especialista.
Acostume-se com as opções git:
Use o poder das ferramentas de fusão do git. Existem muitas maneiras convenientes de resolver conflitos durante a mesclagem. Às vezes, mesclar estratégias pode ajudar bastante. Esteja acostumado e destemido com os comandos git.
fonte