magia git (versão odt)

Download Magia Git (versão ODT)

If you can't read please download the document

Upload: slideuser

Post on 16-Apr-2017

6.563 views

Category:

Self Improvement


1 download

TRANSCRIPT

Magia Git

magia gitBen Lynnmagia gitBen LynnTradutor: Leonardo Siqueira Rodrigues {[email protected]}Informaes sobre a traduoFonte utilizadasAnonymous Pro1http://www.msstudio.com/FontSales/anonymouspro.html

ABCDEFGHIJKLMOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012456789APHont2http://www.aph.org/products/aphont.html

ABCDEFGHIJKLMOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012456789Diavlo Black3http://www.exljbris.nl

ABCDEFGHIJKLMOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz012456789Padres que tentei usar no texto:Termos estrangeiros no singular. Assim, quando necessrio mudei as frases para que o termo no singular encaixasse melhor;

Manter o nome Git com o "g" maisculo;

Seguir a conveno abaixo na formatao do texto:

Itlico para palavras estrangeiras, nome de comandos quando substantivados. Exemplo: "... no primeiro commit...", "... um backup...";

Negrito para comandos, nome de diretrios. Exemplo: "... ajuda do githelpreparse...".

Toda ajuda para corrigir e/ou melhorar o documento bem-vinda.ndicePrefcio7Agradecimentos!7Licena7Links8Introduo9Trabalhar Divertido9Controle de Verses9Controle distribudo10Uma superstio11Conflitos de mesclagem (Merge)11Truques bsicos12Salvando estados12Adicionar, Remover, Renomear12Desfazer/Refazer avanado13Revertendo14Download de arquivos14ltima Verso14Publicao instantnea14O que eu fiz?15Um pouco de clonagem16Sincronizando Computadores16Controle clssico de cdigo16Fazendo um Fork do Projeto17Backup Supremos17Multitarefa na velocidade da luz18Controle de Verses de Guerrilha18Bruxaria com branch20A tecla chefe20Trabalho porco21Correes rpidas22Fluxo ininterrupto22Reorganizando uma improvisao23Gerenciando o Branch23Branch Temporrios24Trabalhe como quiser24Lies de historia26Estou correto26 e tem mais26Alteraes locais por ltimo27Reescrevendo o histrico27Fazendo histria28Onde tudo comeou a dar errado?29Quem Fez Tudo Dar Errado?30Experincia pessoal30Gro-Mestre Git32Disponibilizao de Cdigo32Gerao do Registro das Modificaes32Git por SSH, HTTP32Git Acima de Tudo33Commit do que Mudou33Meu Commit To Grande!34No perca a CABEA (HEAD)35Explorando o HEAD35Baseando se no Git36Dubls Duros na Queda37Segredos Revelados39Invisibilidade39Integridade39Inteligncia40Indexando41Repositrios Crus41Origem do Git41Atalhos do Git42Microsoft Windows42Arquivos Independentes42Quem Est Editando O Que?42Arquivo do Histrico43Clone Inicial43Projetos Volteis43Contador Global44Subdiretrios Vazios44Commit Inicial45

PrefcioGit4http://git-scm.com/

um canivete suo do controle de verses. Uma ferramente polivalente realmente verstil cuja extraordinria flexibilidade torna-o complicado de aprender, sobre tudo sozinho. Coloquei nestas paginas o pouco que aprendi, pois inicialmente tive dificuldade em compreender o manual do usurio do Git5http://www.kernel.org/pub/software/scm/git/docs/user-manual.html

.Como Arthur C. Clarke6http://pt.wikipedia.org/wiki/Arthur_C._Clarke

bem comentou: Qualquer tecnologia suficientemente avanada considerada magica. Esta uma tima forma de abordar o Git: novatos podem ignorar seu funcionamento interno e v-lo como algo divertido que pode agradar aos amigos e enfurecer os inimigos com suas horrendas habilidades.Ao invs de entrar em detalhes, forneceremos apenas instrues para casos especficos. Aps o uso repetido, voc gradualmente entender como cada truque, e como adaptar as receitas s suas necessidades.Outras EdiesTraduo Chinesa7http://docs.google.com/View?id=dfwthj68_675gz3bw8kj

: por JunJie, Meng e JiangWei.

Pagina nica8http://www-cs-students.stanford.edu/~blynn/gitmagic/book.html

: HTML, sem CSS.

Arquivo PDF9http://www-cs-students.stanford.edu/~blynn/gitmagic/book.pdf

: pronto para imprimir.

Agradecimentos!Agradecimentos a Dustin Sallings, Alberto Bertogli, James Cameron, Douglas Livingstone, Michael Budde, Richard Albury, Tarmigan e Derek Mahar pelas sugestes e melhorias. [Se esqueci de voc, por favor avise, as vezes esqueo de atualizar esta seco.]LicenaEste guia regido pelos termos da the GNU General Public License version310http://www.gnu.org/licenses/gpl-3.0.html

. Naturalmente, os fontes esto num repositrio Git, e so obtido digitando:$ git clone git://repo.or.cz/gitmagic.git # Cria a pasta "gitmagic".Veja a seguir outros locais.LinksUma vez listei algumas referncias, porm consome muito tempo mante-las. Alm disso, qualquer um pode usar um site de busca para encontrar tutoriais, guias e comparaes do Git com Subversion11http://subversion.tigris.org/

, Mercurial12http://www.selenic.com/mercurial/

, ou outro sistema de controle de verses.Repositrios Git grtishttp://repo.or.cz/ hospeda projetos livres, inclusive este guia.

http://gitorious.org/ outro site de hospedagem Git destinado a projetos de cdigo aberto.

http://github.com/ hospeda projetos de cdigo aberto de graa, inclusive este guia, e projetos privados tambm.

IntroduoUsarei uma analogia para falar sobre controle de verses. Veja na Wikipdia o verbete sistema de controle de verses13http://pt.wikipedia.org/wiki/Sistema_de_controle_de_verso

para uma melhor explicao .Trabalhar DivertidoMe divirto com jogos para computador quase minha vida toda. Em contrapartida, s comecei a usar sistemas de controle de verses quando adulto. Suspeito que no fui o nico, e comparar os dois pode tornar estes conceitos mais fceis de explicar e entender.Pense na edio de seu cdigo, documento, ou qualquer outra coisa, como jogar um jogo. Uma vez que tenha feito muitos progressos, e gostaria de de salva-los. Pra isso, voc clica em Salvar no seu editor preferido.Porm isto vai sobrescrever a verso anterior. como nos antigos jogos onde voc s tinha uma espao para salvar: voc pode salvar, mas nunca mais poder voltar a um estado salvo anteriormente. O que um pena, pois o estado anterior era uma parte muito divertida do jogo e voc gostaria de poder revisita-lo outra hora. Ou pior, o ultimo estado salvo um dificlimo e voc ter que recomear.Controle de VersesAo editar, voc pode Salvar como ... num arquivo diferente, ou copiar o arquivo antes de sobrescreve-lo se voc quiser manter as verses anteriores. Pode comprimi-los para economizar espao. Isto uma forma rudimentar e muito trabalhosa de controle de verses. Jogos de computador aperfeioaram este mtodo, muitos deles acrescentam automaticamente a data e a hora aos estados salvos.Vamos dificultar um pouco. Digamos que so um monte de arquivos juntos, como os fontes do seu projeto, ou arquivos para um website. Agora se quiser manter suas verses anteriores, ter que arquivar todo um diretrio ou vrios. Manter muitas verses na mo inconveniente e rapidamente se tornar caro.Em alguns jogos de computador, um estado salvo consiste de um diretrio cheio de arquivos. Estes jogos escondem estes detalhes do jogador e lhe apresentam uma interface conveniente para gerenciar as diferentes verses neste diretrio.Sistemas de controle de verses no so diferentes. Todos tem uma boa interface para gerenciar seu diretrio de verses. Voc pode salvar o diretrio sempre que desejar, e pode rever qualquer um dos estado salvos quando quiser. Ao contrrio da maioria dos jogos de computador, eles so geralmente mais espertos na economia de espao. Normalmente, apenas uns poucos arquivos mudam de verso para verso, e com poucas diferenas. Armazenar as diferenas, ao invs de todos os arquivos, economiza espao.Controle distribudoAgora imagine um jogo de computador muito difcil. To difcil de terminar que vrios jogadores experientes pelo mundo decidem formar uma equipe e compartilhar seus estados salvos do jogo para tentar vence-lo. Speedruns so exemplos reais: jogadores especializados em diferentes nveis do mesmo jogo colaboram na produo de resultados incrveis.Como voc configura um sistema para que todos possam obter facilmente o que os outros salvarem? E salvar novos estados?Nos velhos tempos, todos os projetos utilizava controle de verses centralizado. Um servidor em algum lugar mantm os jogos salvos. Ningum tem todos. Cada jogador mantm, em sua maioria, apenas alguns jogos salvos em suas maquinas. Quando algum jogador quiser avanar no jogo, ele pega o ultimo jogo salvo do servidor, joga um pouco, salva e manda de volta para o servidor para que os outros possam usar.E se um jogador quiser pegar um antigo jogo salvo por algum motivo? Talvez o atual jogo salvo esteja em um nvel impossvel de jogar devido algum ter esquecido um objeto trs nveis atrs, e preciso encontrar o ultimo jogo salvo que est em um nvel que pode ser completado com sucesso. Ou talvez queira comparar dois jogos salvo para saber o quanto um jogador avanou.Podem existir vrios motivos para ver uma verso antiga, mas o modus operandi o mesmo. Tm que solicitar ao servidor centralizado a antiga verso. E quanto mais jogos salvos forem necessrios, maior o trafego de informao.A nova gerao de sistemas de controle de verses, dentre eles o Git, conhecida como sistemas distribudos, e pode ser pensada como uma generalizao dos sistemas centralizados. Quando os jogadores pegam do servidor, eles recebem todos os jogos salvos, e no apenas o mais recente. como se estivessem espelhando o servidor.A primeira operao de clonagem pode ser bem demorada, especialmente se h um longo histrico, mas compensada no longo prazo. Um beneficio imediato que, se por qualquer raso desejar uma antiga verso, a trafego de informao com o servidor desnecessrio.Uma superstioUm equvoco popular que sistemas distribudos esto mal adaptados projetos que exijam um repositrio central oficial. Nada poderia estar mais longe da verdade. Fotografar algum roubara sua alma. Igualmente, clonar o repositrio master no diminui sua importncia.Uma boa comparao inicial : qualquer coisa que um sistema centralizado de controle de verses faz, um sistema distribudo de controle de verses bem concebido pode fazer melhor. Recursos de rede simplesmente mais oneroso que recursos locais. Embora vejamos mais adiante que existem inconvenientes numa abordagem distribuda, menos provvel que faa comparaes errneas com esta regra de ouro.Um pequeno projeto pode precisar de apenas uma frao dos recursos oferecidos pelo sistema. Mas, voc usa algarismos romanos quando calcula com nmeros pequenos? E mais, seu projeto pode crescer alm da suas expectativas. Usando Git, desde o inicio como ter um canivete suo, embora o use na maioria das vezes para abrir garrafas. No dia que necessitar, desesperadamente, de uma chave de fenda voc agradecer por ter mais do que um abridor de garrafas.Conflitos de mesclagem (Merge)Neste tpico, nossa analogia com jogos de computador tornasse ruim. Em disso, vamos considerar novamente a edio de um documento.Suponha que Alice insira uma linha no inicio do arquivo, e Bob uma no final. Ambos enviam suas alteraes. A maioria dos sistemas ir de maneira automtica e reativa deduzir o plano de ao: aceitando e mesclando as mudanas, assim as alteraes de Alice e Bob sero aplicadas.Agora suponha que ambos, Alice e Bob, faam alteraes distintas na mesma linha. Tornando impossvel resolver o conflito sem interveno humana. O segundo, entre Alice e Bob, que enviar suas alteraes ser informado do conflito, e escolher se aplica sua alterao sobre a do outro, ou revisa a linha para manter ambas as alteraes.Situaes muito mais complexas podem surgir. Sistemas de controle de verses so capazes de resolver os casos mais simples, e deixar os casos mais difceis para nos resolvermos. Normalmente seu comportamento configurvel.Truques bsicosAo invs de se aprofundar no mar de comandos do Git, use estes exemplos elementares para dar os primeiros passos. Apesar de suas simplicidades, cada um deles so muito teis. Na verdade, no meu primeiro ms com o Git, nunca precisei ir alm das informaes deste captulo.Salvando estadosPensando em tentar algo mais arriscado? Antes de faz-lo, tire um fotografia de todos os arquivos do diretrio atual com:$ git init$ git add .$ git commit -m "Meu primeiro backup"A sequncia de comandos acima devem ser memorizados, ou colocados em um script, pois sero usados com muita frequncia.Assim se algo der errado, voc s precisar executar:$ git reset --hardpara voltar para o estado anterior. Para salvar o estado novamente, faa:$ git commit -a -m "Outro backup"Adicionar, Remover, RenomearOs comandos acima s iro verificar alteraes os arquivos que estavam presentes quando voc executou seu primeiro gitadd. Se voc adicionar novos arquivos ou diretrios tira que informar ao Git, com:$ git add NOVOSARQUIVOS...Do mesmo modo, se voc quiser que o Git na verifique certos arquivos, talvez por t-los apagados, faa:$ git rm ANTIGOSARQUIVOS...Renomear um arquivo o mesmo que remover nome antigo e adicionar um novo nome. H tambm o atalho gitmv que tem a mesma sintaxe do comando mv. Por exemplo:$ git mv ANTIGOARQUIVO NOVOARQUIVODesfazer/Refazer avanados vezes, voc s quer voltar e esquecer todas as mudanas realizadas a partir de um certo ponto, pois esto todos erradas. Ento:$ git logmostrar uma lista dos ltimos commit e seus hash SHA1. Em seguida, digite:$ git reset --hard SHA1_HASHpara restaurar ao estado de um dado commit e apagar os registros de todos os novos commit a partir deste ponto permanentemente.Outras vezes voc quer voltar, brevemente, para um estado. Neste caso, digite:$ git checkout SHA1_HASHIsto levar voc de volta no tempo, preservando os novos commit. Entretanto, como nas viagens no tempo do filmes de fico, se voc editar e fizer um commit, voc estar nume realidade alternativa, pois suas aes so diferentes das realizadas da primeira vez.Esta realidade alternativa chamada de branch, ns falaremos mais sobre isso depois. Por hora, apenas lembre-se que:$ git checkout masterlhe levar de volta para o presente. Assim faa o Git parar de reclamar, sempre faa commit ou reset suas mudanas antes de executar um checkout.Voltemos para a analogia dos jogos de computador :git reset --hard: carrega um antigo salvamento e apagar todos os salvamento mais novos do que este que foi carregado.

git checkout: carrega um antigo salvamento, mas se jogar a partir dele, os prximos salvamento realizados se desvincularo dos salvamentos j realizados aps o que foi carregado. Qualquer salvamento que voc fizer ser colocado em um branch separado representado a realidade alternativa em que entrou. Lidaremos com isso mais a frente.

Voc pode escolher restaurar apenas alguns arquivos ou diretrios acrescentando-os ao final do comando.No gosta de copiar e colar hash? Ento use:$ git checkout :/"Meu primeiro b"para ir ao commit que comea a frase informada. Voc tambm pode solicitar pelo estado salvo a 5 commit atrs:$ git checkout master~5RevertendoComo num tribunal, eventos podem ser retirados dos registros. Igualmente, voc pode especificar qual commit desfazer.$ git commit -a$ git revert SHA1_HASHir desfazer apenas o commit do hash informado. Executando git log revelar que a regresso gravada como um novo commit.Download de arquivosObtenha a cpia dum projeto gerenciado com GIT digitando:$ git clone git://servidor/caminho/dos/arquivosPor exemplo, para obter todos os arquivos usados para criar este site:$ git clone git://git.or.cz/gitmagic.gitA seguir, teremos muito o que dizer sobre o comando clone.ltima VersoSe voc j obteve a copia de um projeto usando gitclone, pode agora atualizar para a ltima verso com:$ git pullPublicao instantneaSuponha que voc tenha escrito um script e gostaria de compartilha-lo. Voc poderia simplesmente dizer para pegarem do seu computador, mas se o fizerem enquanto voc esta melhorando o script ou experimentado algumas mudanas, eles podem ter problemas. Obviamente, por isso que existem ciclos de liberao. Desenvolvedores podem trabalhar num projeto com frequncia, mas s disponibilizam o cdigo quando sentem que o mesmo esta apresentvel.Para fazer isso com Git, no diretrio onde est seu script, execute:$ git init$ git add .$ git commit -m "Primeira liberao"Ento avise aos outros para executarem:$ git clone seu.computador:/caminho/do/scriptpara obter seu script. Assume-se que eles tm acesso ssh. Se no, execute gitdaemon e avise-os para executar:$ git clone git://seu.computador/caminho/do/scriptA partir de agora, toda vez que seu script estiver pronto para liberar, execute:$ git commit -a -m "Nova liberao"e seu usurios podem atualizar suas verses, indo para o diretrio que contm seu script, e executando:$ git pullSeu usurios nunca ficaro com uma verso do seu script que voc no queira. Obviamente este truque serve para tudo, no apenas script.O que eu fiz?Saiba quais as mudanas que voc fez desde o ltima commit com:$ git diffOu desde ontem:$ git diff "@{yesterday}"Ou entre uma verso particular e duas verses atrs:$ git diff SHA1_HASH "master~2"Tente tambm:$ git whatchanged --since="2 weeks ago"As vezes navego pelo histrico com o qgit14http://sourceforge.net/projects/qgit

, em razo de sua interface mais fotognica, ou com o tig15http://jonas.nitro.dk/tig/

, uma interface em modo texto tima para conexes lentas. Alternativamente, instale um servidor web, execute gitinstaweb e use um navegador.Um pouco de clonagemEm sistemas de controle de verses mais antigos, checkout a operao padro para se obter arquivos. Obtendo assim os arquivos do ponto de salvamento informado.No Git e em outros sistemas distribudos de controle de verses, clonagem a operao padro. Para obter os arquivos clonasse o repositrio inteiro. Em outras palavras, voc praticamente faz um espelhamento do servidor central. Tudo o que se pode fazer no repositrio principal, voc pode fazer no seu repositrio local.Sincronizando ComputadoresEsta foi a razo pela qual usei o Git pela primeira vez. Eu posso aguentar fazer tarball16http://pt.wikipedia.org/wiki/TAR

ou usar o rsync para backup e sincronizaes bsicas. Mas as vezes edito no meu laptop, outras no meu desktop, e os dois podem no ter conversado entre si nesse perodo.Inicialize um repositrio Git e commit seus arquivos em uma das maquinas. Ento na outra:$ git clone outro.computador:/caminho/dos/arquivospara criar uma segunda copia dos seus arquivos e do repositrio Git. A partir de agora, use:$ git commit -a$ git pull outro.computador:/caminho/dos/arquivoso que deixar os arquivos da maquina em que voc est trabalhando, no mesmo estado que esto no outro computador. Se voc recentemente fez alguma alterao conflitante no mesmo arquivo, o Git lhe informar e voc poder fazer um novo commit e ento escolher o que fazer para resolv-lo.Controle clssico de cdigoInicialize um repositrio Git para seus arquivos:$ git init$ git add .$ git commit -m "Commit inicial"No servidor principal, inicialize um repositrio Git em branco com o mesmo nome, e inicie o daemon Git se necessrio:$ GIT_DIR=proj.git git init$ git daemon --detach # Ele pode j estar sendo executadoAlgumas hospedagens publicas, tais como o repo.or.cz, tero mtodos diferentes para configurar o repositrio inicial em branco, como atravs do preenchimento de um formulrio no site deles.Mande seu projeto para o servidor principal com:$ git push git://servidor.principal/caminho/do/proj.git HEADEstamos prontos. Para verificar os fontes, um desenvolvedor pode digitar:$ git clone git://servidor.principal/caminho/do/proj.gitAps realizar as alteraes, o cdigo enviado para o servidor com:$ git commit -a$ git pushSe o servidor principal tiver sido atualizado enquanto realizava as alteraes, ser necessrio obter a ltima verso antes de enviar as alteraes. Para sincronizar para a ltima verso:$ git commit -a$ git pullFazendo um Fork17http://pt.wikipedia.org/wiki/Fork

do ProjetoChateado com a rumo que o projeto esta tomando? Acha que pode fazer o trabalho melhor? Ento no seu servidor:$ git clone git://servidor.principal/caminho/dos/arquivosEm seguida avise a todos sobre seu fork do projeto no seu servidor.Qualquer hora depois, voc pode mesclar (merge) suas mudanas do projeto original no mesmo com:$ git pullBackup SupremosGostaria de numerosos arquivos geograficamente dispersos, redundantes e anti-falsificaes? Se seu projeto tem muitos desenvolvedores, no faa nada! Cada clonagem do seu cdigo um backup efetivo. E no apenas uma cpia do estado atual, e sim o histrico completo do seu projeto. Graas ao hash criptogrfico, se cada clonagem for corrompida, ele ser identificado assim que tentar se comunicar com os outros.Se seu projeto no to popular, encontre quantos servidores puder para hospedar seus clones.Um paranoico verdadeiro sempre anotar os ltimos 20 byte do hash SHA1 do cabealho (HEAD) em algum lugar seguro. Tem que ser seguro, e no privado. Por exemplo, publica-lo em um jornal funciona bem, pois muito difcil para um atacante alterar todas as cpias de um jornal.Multitarefa na velocidade da luzDigamos que voc queira trabalhar em diversas funes em paralelo. Ento faa um commit do seu projeto executando:$ git clone . /algum/novo/diretrioGit explora, at onde for seguramente possvel, hard links e compartilhamento de arquivos para criar este clone, assim isto deve ficar pronto em um instante, e voc pode agora trabalhar e duas funes independentes simultaneamente. Por exemplo, voc pode editar um clone enquanto o outro compilado.A qualquer momento, voc pode fazer um commit e pegar as alteraes de outro clone$ git pull /o/outro/cloneControle de Verses de GuerrilhaVoc est trabalhando em um projeto que utiliza outro sistema de controle de verses, sofrer a perda do Git? Inicialize um repositrio Git no seu diretrio de trabalho:$ git init$ git add .$ git commit -m "Commit inicial"clone-o, na velocidade da luz:$ git clone . /algum/novo/diretrioAgora vai para o novo diretrio e trabalhe nele, no no anterior, usando Git para felicidade geral da nao. De vez em quando voc desejar sincronizar com os outros, neste caso, v para o diretrio original, sincronize usando o outro sistema de controle de verses, e ento digite:$ git add .$ git commit -m "Sincronizando com os outros"Depois v para o novo diretrio e execute:$ git commit -a -m "Descrio das minhas alteraes"$ git pullO procedimento para enviar suas alteraes para os outros depende do outro sistema de controle de verses. O novo diretrio contm os arquivos com as suas alteraes. Execute qualquer comando do outro sistema de controle de verses necessrio para envia-las para o repositrio central.O comando gitsvn automatiza tudo isso para repositrios Subversion, e tambm pode ser utilizado para exportar um repositrio Git para um repositrio Subversion18http://google-opensource.blogspot.com/2008/05/export-git-project-to-google-code.html

.Bruxaria com branchRamificaes (Branch) e mesclagens (merge) instantneos so as caractersticas mas fantsticas do Git.Problema: Fatores externos inevitavelmente exigem mudanas de contexto. Um erro grave que se manifesta sem aviso, em uma verso j liberada. O prazo final diminudo. Um desenvolvedor que o ajuda, em uma funo chave do seu projeto, precisa sair. Em todos os casos, voc abruptamente deixar de lado o que esta fazendo e focar em uma tarefa completamente diferente.Interromper sua linha de pensamento provavelmente prejudicar sua produtividade, e quanto mais trabalhoso trocar de contexto, maior a perda. Com um controle de verses centralizado precisamos pegar uma nova cpia do servidor central. Sistemas distribudos fazem melhor, j que podemos clonar o que quisermos localmente.Mais clonar ainda implica copiar todo o diretrio de trabalho, bem como todo o histrico at o ponto determinado. Mesmo o custo reduzido no espao usado pelos arquivos que o Git tem com o compartilhamento destes arquivos, os arquivos do projeto em si so recriados na integra no novo diretrio.Soluo: O Git tem a melhor ferramenta para estas situaes que muito mais rpida e mais eficiente no uso de espao do que a clonagem: gitbranch.Com esta palavra mgica, os arquivos em seu diretrio de repente mudam de forma, de uma verso para outra. Esta transformao pode fazer mais do que apenas avanar ou retroceder no histrico. Seus arquivos podem mudar a partir da ltima liberao para a verso experimental, para a verso atualmente em desenvolvimento, ou para a verso dos seus amigos, etc.A tecla chefeSempre jogue um desses jogos que ao apertar de um boto (a tecla chefe), a tela instantaneamente mudar para uma planilha ou algo mais srio. Assim se o chefe passar pelo seu escritrio enquanto voc estiver jogando, poder rapidamente esconder o jogo.Em algum diretrio:$ echo "Sou mais esperto que meu chefe" > meuarquivo.txt$ git init$ git add .$ git commit -m "Commit inicial"Criamos um repositrio Git que rastrear um arquivo texto contendo uma certa mensagem. Agora digite:$ git checkout -b chefe # nada parece ter mudado aps isto$ echo "Meu chefe mais esperto que eu" > meuarquivo.txt$ git commit -a -m "Outro commit"ficou parecendo que ns sobrescrevemos nosso arquivo e fizemos um commit. Mas isto um iluso. Digite:$ git checkout master # troca para a verso original do arquivoe tcham tcham tcham! O arquivo texto foi restaurado. E se o chefe decidir rondar este diretrio. Digite:$ git checkout chefe # troca para verso adaptada para agradar o chefeVoc pode trocar entre as duas verses do arquivo quantas vezes quiser, e fazer commit independentes para cada uma.Trabalho porcoDigamos que voc est trabalhando em alguma funo, e por alguma razo, precisa voltar para uma antiga verso e temporariamente colocar algumas declaraes de controle para ver como algo funciona. Ento:$ git commit -a$ git checkout SHA1_HASHAgora voc pode adicionar temporariamente cdigo feio em todo canto. Pode at fazer commit destas mudanas. Quando estiver tudo pronto,$ git checkout masterpara voltar para o trabalho original. Observe que qualquer mudana sem commit so temporrias.E se voc desejasse salvar as mudanas temporrias depois de tudo? Fcil:$ git checkout -b sujeirae faa commit antes de voltar ao branch master. Sempre que quiser voltar sujeira, simplesmente digite:$ git checkout sujeiraNs j falamos deste comando num captulo anterior, quando discutimos carregamento de antigos estados salvos. Finalmente podemos contar toda a histria: os arquivos mudam para o estado requisitado, porm samos do branch master. Cada commit realizado a partir deste ponto nos seus arquivos o levaro em outra direo, que nomearemos mais a diante.Em outra palavras, depois de fazer checkout em um estado antigo, o Git automaticamente o colocar em um novo branch no identificado, que pode ser identificado e salvo com gitcheckout-b.Correes rpidasVoc esta fazendo algo quando mandam largar o que quer que seja e corrigir um erro recm descoberto:$ git commit -a$ git checkout -b correes SHA1_HASHEnto assim que tiver corrigido o erro:$ git commit -a -m "Erro corrigido"$ git push # envia para o repositrio principal$ git checkout mastere volte a trabalhar no que estava fazendo anteriormente.Fluxo ininterruptoAlguns projetos requerem que seu cdigo seja revisado antes que o envie. Para tornar a vida fcil daqueles que forem revisar seu cdigo, se voc tem um a grande mudana para fazer, voc pode quebra em dois ou mais partes, e ter cada parte revisada separadamente.E se a segunda parte no puder ser escrita at que a primeira seja aprovada e revisada? Em muitos sistemas de controle de verses, voc teria que mandar a primeira parte para os revisores, e aguardar at que seja aprovada para ento comear a segunda parte.Atualmente isso no verdade, mas nestes sistemas de edio da segunda parte antes da primeira ser aprovada envolve muito sofrimento e privaes. No Git, os branch e merge so indolores (termo tcnico para rpido e local). Ento aps fazer o commit da primeira parte e enviado para reviso:$ git checkout -b parte2Em seguida, codifique a segunda parte da grande mudana sem esperar que a primeira parte tenha sido aceita. Quando a primeira parte for aprovada e enviada,$ git checkout master$ git merge parte2$ git branch -d parte2 # no precisar mais deste branche a segunda parte das mudanas est pronta para ser revisada.Mais espere! E se no for to simples? Digamos que voc cometeu em erro na primeira parte, que voc tem que corrigir antes de envia-la. Sem problema! Primeiro, volte para branch master com:$ git checkout masterCorrija o problema da primeira parte das mudanas e aguarde a aprovao. Se no simplesmente repita este passo. Voc provavelmente desejar fazer um merge da verso corrigida da primeira parte com a segunda, logo:$ git checkout part2e$ git merge masterAgora como anteriormente. Logo que a primeira parte for aprovada e enviada:$ git checkout master$ git merge parte2$ git branch -d parte2e, novamente, a segunda parte est pronta para a reviso. fcil estender este truque para qualquer nmero de partes.Reorganizando uma improvisaoTalvez voc goste de trabalhar com todos os aspectos de um projeto num mesmo branch. E gostaria de trabalhar e que os outros s vejam seus commit, apenas quando eles estiverem organizados. Inicie um par de branch:$ git checkout -b organizado$ git checkout -b desorganizadoA seguir, trabalhe em alguma coisa: corrigindo erros, adicionando funes, adicionando cdigo temporrio, e assim por diante, faa commit muitas vezes ao longo do caminho. Ento:$ git checkout organizado$ git cherry-pick SHA1_HASHaplique um dado commit ao branch "organizado". Com os cherry-picks apropriados voc pode construir um branch que contm apenas cdigo permanente, e tem commit relacionados agrupados juntos.Gerenciando o BranchDigite:$ git branchpara listar todos os branch. H sempre um branch chamado "master", e voc comea por aqui, por default. Alguns defendem que o branch master deve ser intocvel e criar novos branch para suas prprias mudanas.As opes d e m permitem a voc deletar ou mover (renomear) um branch. Veja githelpbranch.Branch TemporriosDepois de um tempo voc perceber que est criando branch de curta durao, frequentemente e por motivos parecidos: cada novo branch serve apenas para guardar o estado atual, assim voc pode rapidamente voltar para estados antigos para corrigir um erro ou algo assim. anlogo a mudar o canal da TV temporariamente para ver o que esta passando nos outros canais. Mas, ao invs de apertar dois botes, voc esta criando, checando e apagando branch temporrios e seus commit. Felizmente, o Git tem um atalho que to conveniente como um controle remoto de TV:$ git stashIsto salva o estado atual num local temporrio (um stash) e restaura o estado anterior. Seu diretrio de trabalho parece ter voltado ao estado anteriormente salvo, e voc pode corrigir erros, puxar as mudanas mais novas, e assim por diante. Quando quiser retornar ao estado anterior ao uso do stash, digite:$ git stash apply # Pode ser preciso resolver alguns conflitos.Voc pode ter mltiplos stash, e manipula-los de vrias formas. Veja githelpstash. Como deve ter adivinhado, o Git usa branch por traz dos panos para fazer este truque.Trabalhe como quiserAplicaes como Mozilla Firefox19http://www.mozilla.com/

permitem que se abra mltiplas abas e mltiplas janelas. Alternando entre as abas temos diferentes contedos na mesma janela. Branch no Git so como abas para seu diretrio de trabalho. Seguindo na analogia, a clonagem no Git como abrir uma nova janela. Ser capaz de fazer ambos, melhora a experincia do usurio.Num nvel mais alto: vrios gerenciadores de janelas no linux20http://www.linux.org

permitem a existncia de vrias reas de trabalho: e instantaneamente alternar entre elas. O que similar ao branch no Git, enquanto a clonagem seria como anexar outro monitor para ganhar mais uma rea de trabalho.Outro exemplo o utilitrio screen21http://www.gnu.org/software/screen/

. Esta preciosidade lhe permite criar, destruir e alternar entre mltiplas sesses de terminais no mesmo terminal. Ao invs de abrir novos terminais (clone), voc pode use o mesmo se usar o screen (branch). Na realidade, voc pode fazer muito mais com o screen mas isso assunto para outro texto.Clonagem, branch e merge so rpidos e locais no Git, encorajando-o a usar a combinao que mais lhe convir. Git deixa voc trabalhar exatamente como quiser.Lies de historiaUma consequncia da natureza distribuda do Git que o histrico pode ser editado facilmente. Mas se voc adulterar o passado, tenha cuidado: apenas rescreva a parte do histrico que s voc possui. Assim como as naes sempre argumentam sobre quem comete atrocidades, se algum tiver um clone cuja verso do histrico seja diferente do seu, voc pode ter problemas para conciliar suas rvores quando interagirem.Claro, se voc controlar todas as outras rvores tambm, ento no h problema, uma vez que pode sobrepor-las.Alguns desenvolvedores gostam de um histrico imutvel, com falhas ou no. Outros, que suas rvores estejam apresentveis antes de libera-las ao pblico. O Git contempl ambos pontos de vista. Tal como clonagem, branch e merge, rescrever o histrico simplesmente outro poder que o Git lhe concede. Cabe a voc a us-lo sabiamente.Estou corretoAcabou de fazer um commit, mas queria ter escrito uma mensagem diferente? Ento execute:$ git commit --amendpara mudar a ultima mensagem. Percebeu que esqueceu de adicionar um arquivo? Execute gitadd para adiciona-lo, e ento execute o comando acima.Quer incluir mais algumas modificaes no ultimo commit? Faa-as e ento execute:$ git commit --amend -a e tem maisSuponha que o problema anterior dez vezes pior. Aps uma longa sesso onde fez um monte de commit. E voc no est muito feliz com a organizao deles, e algumas das mensagens dos commit poderiam ser reformuladas. Ento execute:$ git rebase -i HEAD~10e os ltimos 10 commit aparecero em seu $EDITOR favorito. Trecho de exemplo:pick 5c6eb73 Adicionado link para repo.or.czpick a311a64 Reorganizadas as analogias em "Trabalhe como quiser"pick 100834f Adicionado origem (push target) ao MakefileEnto:Remova os commit deletando linhas;

Reorganize os commit reorganizando linhas;

Substitua pick por edit para modificar a mensagem do commit;

Substitua pick por squash para unir (merge) um commit com o anterior.

Se marcar um commit para edio, execute:$ git commit --amendCaso contrrio, execute:$ git rebase --continuePortanto, faa commit cedo e com freqncia: e arrume tudo facilmente mais tarde com um rebase.Alteraes locais por ltimoVoc esta trabalhando em um projeto ativo. Faz alguns commit locais ao longo do tempo, e sincroniza com a rvore oficial com merge. Este ciclo se repete algumas vezes at estar tudo pronto para ser enviado rvore central.Mas agora o histrico no seu clone local esta uma confuso com o emaranhado de modificaes locais e oficiais. Voc gostaria de ver todas as suas modificaes em uma seo contnua e depois todas as modificaes oficiais.Este um trabalho para gitrebase conforme descrito acima. Em muitos casos pode se usar a opo onto e evitar sua interao.Veja tambm githelprebase com exemplos detalhados deste incrvel comando. Voc pode dividir commit. Ou at reorganizar branch de uma rvore.Reescrevendo o histricoEventualmente, ser necessrio que seu controle de cdigo tenha algo equivalente ao modo Stanlinesco de retirada de pessoas das fotos oficiais, apagando-os da histria. Por exemplo, suponha que temos a inteno de lanar um projeto, mas este envolve um arquivo que deve ser mantido privado por algum motivo. Talvez eu deixe meu numero do carto de crdito num arquivo texto e acidentalmente adicione-o ao projeto. Apaga-lo insuficiente, pois, pode ser acessado pelos commit anteriores. Temos que remover o arquivo de todos os commit:$ git filter-branch --tree-filter 'rm meu/arquivo/secreto' HEADVeja githelpfilterbranch, que discute este exemplo e mostra um mtodo mias rpido. No geral, filterbranch permite que voc altere grandes sees do histrico s com um comando.Depois, voc deve substituir os clones do seu projeto pela verso revisada se desejar interagir com eles depois.Fazendo histriaQuer migrar um projeto para Git? Se ele for gerenciado por um algum dos sistemas mais conhecidos, ento possvel que algum j tenha escrito um script para exportar todo o histrico para o Git.Seno, de uma olhada em gitfastimport, que l um texto num formato especifico para criar o histrico Git do zero. Normalmente um script usando este comando feito as pressas sem muita frescura e executado uma vez, migrando o projeto de uma s vez.Por exemplo, cole a listagem a seguir num arquivo temporrio, como /tmp/history:commit refs/heads/mastercommitter Alice Thu, 01 Jan 1970 00:00:00 +0000data