Esta resposta tenta abordar como interessar programadores seniores git, não sobre como aprender gitda maneira mais rápida - para isso, o excelente livro git é ótimo ou qualquer quantidade de tutoriais (=> Google). Bons links para essa resposta são: Git é uma estrutura de dados puramente funcional ou, especialmente, o pequeno Como o git armazena seus dados .
Receio ter uma visão bastante sombria disso. Eu estive exatamente no seu lugar - sou um gitnerd e queria transformar uma equipe longe de svn, vamos encarar, resultados minúsculos. No meu caso, isso me levou a mudar ativamente minha própria percepção e a aceitar essas pessoas, simplesmente não podem ser "forçadas à felicidade". As pessoas não são computadores, é incrivelmente difícil programá-las. Ainda estou feliz por ter tentado, isso me mostrou de maneira bastante suave o que faço e o que não quero fazer na minha vida profissional.
Há pessoas que começam a se motivar quando há coisas novas envolvidas e outras que são desmotivadas. Isso não tem nada a ver com isso git, mas, gitespecificamente, você sempre tem o efeito de "por que deveríamos usá-lo se tudo svnestá bem?", O que é uma enorme barreira psicológica.
Além disso, realmente grokking gitrequer um interesse intenso em estruturas de dados abstratas. Pode parecer inacreditável, mas, na minha experiência, existem programadores que não têm interesse algum e que estão entediados e sobrecarregados por elementos mais complexos que as simples matrizes. Você pode argumentar de um lado para outro se aqueles deveriam fazer o trabalho que estão fazendo, mas é o que é.
Se as pessoas não estiverem interessadas, não entenderão. Claro e simples. Aposto que o desinteresse é a principal razão das notas ruins na escola, sem perder a inteligência.
Dito isto, aqui seria um currículo como eu o aplicaria, com base na acumulação de conhecimento de baixo para cima. Não funcionou para mim, mas você pode ter como inspiração fazer o seu próprio.
GUI
Embora a abordagem a seguir não precise necessariamente de suporte da GUI para as ações ( git addem um repositório hello world ...), ajuda tremendamente ter uma GUI para visualizar o repositório, desde o início. Se você não pode decidir sobre qual usar, use gitkcomo último recurso. Se vocês usam algum tipo de editor visual, encontre o gitcomponente da GUI.
A estrutura de dados (estática) é fundamental
Comece explicando os tipos de dados internos (existem apenas três mais um deles: blobs, árvores, confirmações, tags anotadas, a última das quais não interessa absolutamente nada neste estágio) e sua estrutura. Você pode fazer isso facilmente no quadro branco / com um lápis; a árvore é fácil de desenhar, pois nunca pode ser alterada; você pode literalmente adicionar coisas o tempo todo. Você pode fazer uma sessão de reprodução em um repositório local criado recentemente e usar git cat-fileos objetos reais para mostrar que eles são de fato tão triviais quanto os anunciados.
Se você pode ajudá-los a entender que
- ... existem literalmente apenas 3 tipos de objetos na história, todos eles muito simples, quase triviais e
- ... a maioria dos
gitsubcomandos apenas "massageia" esses objetos de uma maneira ou de outra, com operações quase triviais (basicamente, existe apenas uma: adicione um novo commit em algum lugar) e ...
- ... tudo pode ser facilmente visto bem na sua frente
lse com git cat-file...
então eles terão a tradução mental do que realmente está no repositório. Nesse ponto, os seniours podem se lembrar de que os elementos internos svnsão mágicos arcanos (já tiveram problemas com bloqueios dentro do repositório svn ou com ramificações "reintegrando" e tal?), E isso pode motivá-los um pouco.
Um problema, especificamente com as pessoas acostumadas svn, é se acostumar com a idéia de que um commit (o objeto, não a ação) sempre é toda a árvore de diretórios. Em svn, as pessoas são usadas para confirmar arquivos individuais. É uma abordagem radicalmente diferente. Ah, e o fato de o mesmo termo "confirmação" ser usado tanto para um objeto estático quanto para uma ação também não está ajudando.
O outro problema para os svncaras é que svnusa uma história linear, não uma árvore. Isso é, novamente, totalmente diferente. Então este é o momento para apontar dessas diferenças muito .
Ações explicadas em termos da estrutura
Quando eles entenderem de que partes um gitrepositório é composto, é hora de mostrar exatamente o que os gitsubcomandos individuais fazem em termos deles.
Estou falando sobre add, commitem conjunto com o diretório de trabalho local e o estágio (certifique-se de que eles entendam que o diretório de trabalho não é o mesmo que a área de preparação que não é o mesmo que o repositório).
Quando eles entenderem que esses comandos simplesmente crescem a árvore (que, novamente, neste estágio, consiste em 3 dos tipos - blobs, árvores, confirmações e não apenas confirmações), você pode fazer o primeiro git pushe git pull(no modo de avanço rápido! ) para mostrar a eles que, gitliteralmente, apenas está empurrando seus objetos, que os hashes são realmente apenas hashes de conteúdo, que você pode facilmente copiar essas coisas com um comando de cópia do sistema de arquivos e assim por diante.
Obviamente, fique longe de qualquer opção não essencial desses comandos, estamos falando git add hello.txtaqui.
Ramos
Observe que a ramificação é especialmente difícil para as svnpessoas, pois é totalmente diferente. O svnmodelo é muito mais fácil de visualizar, pois basicamente não há nada para visualizar - ele está à vista. O gitmodelo nem tanto. Certifique-se de que eles estejam cientes desde o início de que ramificações e tags são apenas "notas adesivas" apontando para algum lugar e, na verdade, não "existem" em termos do histórico estático e imutável.
Em seguida, faça exemplo após exemplo fácil para mostrar o que você realmente pode fazer com eles. Como você parece estar acostumado git, não deve ter dificuldade em encontrar motivação lá. Certifique-se de que eles sempre visualizem isso em termos de como a árvore cresce.
Se eles têm isso, você pode explicar como git pullé realmente git fetch && git merge; como todos os repositórios realmente contêm exatamente os mesmos objetos ( git fetché quase o mesmo que copiar coisas scpdentro do diretório de objetos git) e assim por diante.
Provavelmente, se a essa altura você não tiver conseguido despertar o interesse deles, poderá desistir, mas se eles conseguirem chegar tão longe, terão todas as ferramentas mentais à sua disposição e deve haver pouco medo envolvido mais. O restante (fluxo de trabalho do git ...) deve estar em declive então.
Últimas palavras
Isso parece muito esforço, e realmente é. Não venda isso como "precisamos disso para este projeto", mas "isso ajuda você a se desenvolver pessoalmente e ajudará em todas as suas interações adicionais". Você precisa de muito tempo para isso, e tempo é dinheiro. Se você não tiver aceitação da gerência sobre isso, pode não valer a pena; talvez você deva conversar com seu chefe.
Se você decidir deixar de ensinar aos desenvolvedores que aparentemente não são capazes de entender, mas absolutamente deve usá-lo gitno futuro, considere substituir toda a interação por gitcomandos por scripts elaborados ou alguma GUI que gitretire todos os detalhes. Coloque todo o controle de erros etc. nos scripts e tente fazê-lo funcionar.