Isso vai parecer contra-intuitivo, mas ouça-me:
Incentive-os a começar a experimentar o git
Uma das coisas interessantes sobre o git é que é surpreendentemente fácil tornar qualquer operação local completamente segura. Quando comecei a usar o git, uma das coisas que me vi fazendo foi fechar o diretório inteiro como backup, caso eu estragasse alguma coisa. Mais tarde, descobri que esse é um enorme problema e quase nunca é realmente necessário para proteger seu trabalho, mas tem a virtude de ser muito seguro e muito simples, mesmo que você não saiba o que diabos está fazendo e como o comando que você deseja tentar será exibido. A única coisa que você deve evitar ao fazer isso é push
. Se você não pressionar nada, esta é uma maneira 100% segura de experimentar o que quiser.
O medo de tentar coisas é um dos maiores obstáculos ao aprendizado do git. Dá-lhe de modo muito controle sobre tudo o que é meio assustador. A realidade é que você pode manter algumas operações muito seguras durante a maior parte do seu uso diário, mas descobrir quais comandos são necessários, é preciso explorar.
Ao dar a eles uma sensação de segurança , eles estarão muito mais dispostos a tentar descobrir como fazer as coisas por conta própria. E eles terão muito mais poder para encontrar um fluxo de trabalho pessoal na máquina local que funcione para eles. E se nem todos fazem a mesma coisa localmente , tudo bem, desde que sigam os padrões com o que eles impõem . Se for necessário fechar o repositório inteiro antes de executar uma operação para fazê-los se sentir assim, tudo bem; eles podem aprender maneiras melhores de fazer as coisas à medida que avançam e tentam coisas. Qualquer coisa para você começar a tentar coisas e ver o que faz.
Isso não significa que o treinamento é inútil. Pelo contrário, o treinamento pode ajudá-lo a apresentar recursos, padrões e normas. Mas não é um substituto para sentar e realmente fazer coisas no seu trabalho diário. Nem o git nem o SVN são coisas sobre as quais você pode simplesmente ir a uma aula e saber tudo. Você precisa usá- los para resolver seus problemas para se familiarizar com eles e quais recursos são adequados para quais problemas.
Pare de desencorajá-los de aprender os meandros do git
Eu mencionei não pressionar nada, o que realmente vai contra uma das coisas que você está ensinando a eles: sempre "Commit & Push". Eu acredito que você deve parar de dizer para eles fazerem isso e dizer para começarem a fazer o contrário. O Git tem basicamente 5 "lugares" onde suas alterações podem ser:
- No disco, não confirmado
- Encenado, mas não confirmado
- Em uma confirmação local
- Em um esconderijo local
- Repositórios remotos (apenas confirmações e tags são sempre empurradas e puxadas entre diferentes repositórios)
Em vez de incentivá-los a puxar e empurrar tudo em uma única etapa, incentive-os a aproveitar esses 5 lugares diferentes. Incentive-os a:
Isso os incentivará a verificar seu trabalho antes que ele seja disponibilizado publicamente a todos, o que significa que eles perceberão seus erros mais cedo. Eles verão o commit e pensam: "Espere, não era isso que eu queria" e, ao contrário do SVN, eles podem voltar e tentar novamente antes de pressionar.
Depois que eles se acostumam à idéia de entender onde estão as alterações, eles podem começar a decidir quando ignorar as etapas e combinar determinadas operações (quando extrair porque você já sabe que deseja buscar + mesclar ou quando clicar na opção Confirmar e enviar) .
Este é realmente um dos enormes benefícios do git sobre o SVN, e o git é projetado com esse padrão de uso em mente. O SVN, por outro lado, assume um repositório central, portanto, não é surpreendente que as ferramentas para o git não sejam tão otimizadas para o mesmo fluxo de trabalho. No SVN, se seu commit estiver errado, seu único recurso real é um novo commit para desfazer o erro.
Fazer isso levará naturalmente à próxima estratégia:
Incentive-os a usar filiais locais
As ramificações locais realmente facilitam muitos pontos problemáticos do trabalho em arquivos compartilhados. Eu posso fazer todas as alterações que desejar no meu próprio ramo, e isso nunca afetará ninguém, pois não estou pressionando. Então, quando chegar a hora, eu posso usar todas as mesmas estratégias de mesclagem e rebase, apenas mais fáceis:
- Posso refazer minha ramificação local, o que torna trivial mesclá-la ao mestre.
- Eu poderia usar uma mesclagem simples (criar uma nova confirmação) no master para trazer as alterações da minha filial local para ele.
- Posso esmagar minha filial local inteira em um único commit no master, se achar que minha ramificação é uma bagunça demais para recuperar.
Usar ramificações locais também é um bom começo para descobrir uma estratégia sistemática de ramificação. Isso ajuda seus usuários a entender melhor suas próprias necessidades de ramificação, para que você possa escolher uma estratégia com base nas necessidades e no nível de entendimento / habilidade atual da equipe e não apenas cair no Gitflow porque todos já ouviram falar.
Sumário
Em resumo, o git não é SVN e não pode ser tratado como ele. Você precisa:
- Elimine o medo incentivando a experimentação segura.
- Ajude-os a entender como o git é diferente para que eles possam ver como isso altera o fluxo de trabalho normal.
- Ajude-os a entender os recursos disponíveis para ajudá-los a resolver seus problemas mais facilmente.
Isso tudo irá ajudá-lo a adotar gradualmente um melhor uso do git, até chegar ao ponto em que você pode começar a implementar um conjunto de padrões.
Características específicas
No prazo imediato, as seguintes idéias podem ajudar.
Rebase
Você mencionou rebase e que realmente não entende isso na sua pergunta. Então, aqui está o meu conselho: experimente o que acabei de descrever. Faça algumas alterações localmente enquanto outra pessoa faz algumas alterações. Confirme suas alterações localmente . Compacte o diretório do repositório como backup. Busque as alterações da outra pessoa. Agora tente executar um comando rebase e veja o que acontece com seus commits! Você pode ler inúmeras postagens no blog ou receber treinamento sobre rebase e como deve ou não usá-lo, mas nada disso é um substituto para vê-lo vivo em ação. Então tente .
merge.ff=only
Essa será uma questão de gosto pessoal, mas vou recomendá-la pelo menos temporariamente, pois você mencionou que já tem problemas com o tratamento de conflitos. Eu recomendo configurar merge.ff
paraonly
:
git config --global merge.ff only
"ff" significa "avanço rápido". Uma mesclagem de avanço rápido é quando o git não precisa combinar alterações de confirmações diferentes. Apenas move o ponteiro da ramificação para um novo commit ao longo de uma linha reta no gráfico.
O que isso faz na prática é impedir que o git tente automaticamente criar confirmações de mesclagem. Portanto, se eu confirmar algo localmente e puxar as alterações de outra pessoa, em vez de tentar criar um commit de mesclagem (e potencialmente forçar o usuário a lidar com conflitos), a mesclagem falhará. De fato, o git terá realizado apenas a fetch
. Quando você não possui confirmações locais, a mesclagem continua normalmente.
Isso oferece aos usuários a chance de revisar os diferentes commits antes de tentar mesclá-los e os força a tomar uma decisão sobre como lidar melhor com a combinação deles. Eu posso me refazer, continuar com a mesclagem (usando git merge --no-ff
para ignorar a configuração) ou até mesmo adiar a fusão de minhas alterações por enquanto e lidar com isso mais tarde. Acho que esse pequeno aumento de velocidade ajudará sua equipe a evitar tomar decisões erradas sobre fusões. Você pode deixar sua equipe desativá-lo assim que melhorar a manipulação de fusões.