-
1. Primeiros Passos
- 1.1 Sobre Controle de Versão
- 1.2 Uma Breve História do Git
- 1.3 O que é Git?
- 1.4 A Linha de Comando
- 1.5 Instalando o Git
- 1.6 Configuração inicial do Git
- 1.7 Obtendo Ajuda
- 1.8 Resumo
-
2. Fundamentos do Git
-
3. Ramificação (Branching) no Git
-
4. Git no Servidor
- 4.1 Os Protocolos
- 4.2 Colocando o Git em um Servidor
- 4.3 Gerando a sua Chave Pública SSH
- 4.4 Configurando o Servidor
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Opções de Hospedagem de Terceiros
- 4.10 Resumo
-
5. Git Distribuído
-
6. GitHub
-
7. Ferramentas do Git
- 7.1 Seleção de Revisão
- 7.2 Área de Stage Interativa
- 7.3 Fazendo Stash e Limpando
- 7.4 Assinando Seu Trabalho
- 7.5 Pesquisando (Searching)
- 7.6 Reescrevendo o Histórico
- 7.7 Reset Desmistificado
- 7.8 Merging Avançado
- 7.9 Rerere
- 7.10 Depurando com Git
- 7.11 Submódulos
- 7.12 Empacotando (Bundling)
- 7.13 Substituir (Replace)
- 7.14 Armazenamento de Credenciais
- 7.15 Resumo
-
8. Customizando o Git
- 8.1 Configuração do Git
- 8.2 Atributos do Git
- 8.3 Hooks do Git
- 8.4 Uma Política de Exemplo Imposta pelo Git
- 8.5 Resumo
-
9. Git e Outros Sistemas
- 9.1 Git como Cliente
- 9.2 Migrando para o Git
- 9.3 Resumo
-
10. Git Internals (Por Dentro do Git)
- 10.1 Encanamento e Porcelana (Plumbing and Porcelain)
- 10.2 Objetos do Git
- 10.3 Referências do Git
- 10.4 Arquivos de pacote (Packfiles)
- 10.5 Refspec
- 10.6 Protocolos de Transferência
- 10.7 Manutenção e Recuperação de Dados
- 10.8 Variáveis de Ambiente
- 10.9 Resumo
-
A1. Appendix A: O Git em Outros Ambientes
- A1.1 Interfaces Gráficas
- A1.2 Git no Visual Studio
- A1.3 Git no Visual Studio Code
- A1.4 Git no IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git no Sublime Text
- A1.6 Git no Bash
- A1.7 Git no Zsh
- A1.8 Git no PowerShell
- A1.9 Resumo
-
A2. Appendix B: Incorporando o Git nos seus Aplicativos
- A2.1 Linha de Comando do Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Appendix C: Comandos do Git
- A3.1 Configuração e Ajustes
- A3.2 Obtendo e Criando Projetos
- A3.3 Snapshots Básicos
- A3.4 Branches e Merges
- A3.5 Compartilhando e Atualizando Projetos
- A3.6 Inspeção e Comparação
- A3.7 Depuração
- A3.8 Patches
- A3.9 E-mail
- A3.10 Sistemas Externos
- A3.11 Administração
- A3.12 Comandos de Encanamento
6.3 GitHub - Mantendo um Projeto
Mantendo um Projeto
Agora que nos sentimos confortáveis contribuindo com um projeto, vamos olhar para o outro lado: criar, manter e administrar o seu próprio projeto.
Criando um Novo Repositório
Vamos criar um novo repositório para compartilhar o código do nosso projeto.
Comece clicando no botão “New repository” (Novo repositório) no lado direito do painel, ou a partir do botão + na barra de ferramentas superior ao lado do seu nome de usuário, como visto em O menu suspenso “New repository”.
Isso leva você ao formulário “new repository” (novo repositório):
Tudo o que você realmente precisa fazer aqui é fornecer o nome de um projeto; o restante dos campos é totalmente opcional.
Por enquanto, basta clicar no botão “Create Repository” (Criar Repositório), e bum — você tem um novo repositório no GitHub, chamado <user>/<project_name>.
Como você ainda não tem nenhum código lá, o GitHub lhe mostrará instruções de como criar um repositório Git totalmente novo ou conectar um projeto Git existente. Não vamos nos estender sobre isso aqui; se você precisar de uma atualização, verifique Fundamentos do Git.
Agora que o seu projeto está hospedado no GitHub, você pode fornecer a URL a qualquer pessoa com quem queira compartilhar o seu projeto.
Todo projeto no GitHub é acessível via HTTPS em https://github.com/<user>/<project_name>, e via SSH em git@github.com:<user>/<project_name>.
O Git pode fazer fetch de e push para ambas as URLs, mas elas têm controle de acesso com base nas credenciais do usuário que se conecta a elas.
|
Note
|
Muitas vezes é preferível compartilhar a URL baseada em HTTPS para um projeto público, já que o usuário não precisa ter uma conta no GitHub para acessá-lo para clonagem. Os usuários terão que ter uma conta e uma chave SSH carregada para acessar o seu projeto se você lhes der a URL SSH. A versão em HTTPS também é exatamente a mesma URL que eles colariam em um navegador para ver o projeto lá. |
Adicionando Colaboradores
Se você estiver trabalhando com outras pessoas a quem deseja dar acesso de commit, você precisará adicioná-las como “collaborators” (colaboradores). Se Ben, Jeff e Louise se inscreverem para contas no GitHub, e você quiser dar a eles acesso de push ao seu repositório, você pode adicioná-los ao seu projeto. Ao fazer isso, você dará a eles acesso de “push”, o que significa que eles terão acesso tanto de leitura quanto de gravação ao projeto e ao repositório Git.
Clique no link “Settings” (Configurações) na parte inferior da barra lateral direita.
Em seguida, selecione “Collaborators” (Colaboradores) no menu do lado esquerdo. Em seguida, basta digitar um nome de usuário na caixa e clicar em “Add collaborator” (Adicionar colaborador). Você pode repetir isso quantas vezes quiser para conceder acesso a todos que desejar. Se precisar revogar o acesso, basta clicar no “X” no lado direito da linha deles.
Gerenciando Pull Requests
Agora que você tem um projeto com algum código nele e talvez até mesmo alguns colaboradores que também têm acesso de push, vamos ver o que fazer quando você mesmo receber um Pull Request.
Os Pull Requests podem vir de um branch em um fork do seu repositório ou podem vir de outro branch no mesmo repositório. A única diferença é que os que estão em um fork costumam ser de pessoas onde você não pode fazer push para o branch delas e elas não podem fazer push para o seu, enquanto em Pull Requests internos, geralmente, ambas as partes podem acessar o branch.
Para estes exemplos, vamos assumir que você seja “tonychacon” e tenha criado um novo projeto de código Arduino chamado “fade”.
Notificações por E-mail
Alguém chega, faz uma alteração no seu código e lhe envia um Pull Request. Você deve receber um e-mail notificando-o sobre o novo Pull Request e ele deve se parecer com Notificação por e-mail de um novo Pull Request.
Existem algumas coisas a serem notadas sobre este e-mail. Ele lhe dará um pequeno diffstat — uma lista de arquivos que foram alterados no Pull Request e em que quantidade. Ele lhe dá um link para o Pull Request no GitHub. Ele também lhe dá algumas URLs que você pode usar a partir da linha de comando.
Se você notar a linha que diz git pull <url> patch-1, esta é uma forma simples de mesclar (merge) um branch remoto sem ter que adicionar um remoto.
Nós analisamos isso rapidamente em Fazendo Checkout de Branches Remotos.
Se desejar, você pode criar e mudar para um branch de tópico e, em seguida, executar este comando para mesclar as alterações do Pull Request.
As outras URLs interessantes são as URLs .diff e .patch, que, como você pode adivinhar, fornecem versões diff unificadas e patch do Pull Request.
Você poderia tecnicamente mesclar o trabalho do Pull Request com algo como isto:
$ curl https://github.com/tonychacon/fade/pull/1.patch | git am
Colaborando no Pull Request
Como abordamos em O Fluxo do GitHub (GitHub Flow), agora você pode ter uma conversa com a pessoa que abriu o Pull Request. Você pode comentar em linhas de código específicas, comentar em commits inteiros ou comentar no Pull Request inteiro em si, usando o GitHub Flavored Markdown em toda parte.
Toda vez que alguém comenta no Pull Request, você continuará a receber notificações por e-mail, para saber que há atividade acontecendo. Cada um deles terá um link para o Pull Request onde a atividade está acontecendo e você também pode responder diretamente ao e-mail para comentar na thread do Pull Request.
Uma vez que o código esteja de uma forma que você goste e queira mesclá-lo, você pode fazer o pull do código e mesclá-lo localmente, seja com a sintaxe git pull <url> <branch> que vimos anteriormente, ou adicionando o fork como um remoto e fazendo fetch e merge.
Se o merge for trivial, você também pode simplesmente clicar no botão “Merge” no site do GitHub. Isso fará um merge “non-fast-forward”, criando um commit de merge mesmo que um merge fast-forward fosse possível. Isso significa que, aconteça o que acontecer, toda vez que você clica no botão de merge, um commit de merge é criado. Como você pode ver em Botão Merge e instruções para fazer o merge de um Pull Request manualmente, o GitHub lhe dá todas essas informações se você clicar no link de dica.
Se você decidir que não quer mesclá-lo, você também pode simplesmente fechar o Pull Request e a pessoa que o abriu será notificada.
Refs de Pull Request
Se você estiver lidando com um monte de Pull Requests e não quiser adicionar um monte de remotos ou fazer pulls pontuais toda vez, há um truque bacana que o GitHub permite que você faça. Este é um truque um pouco avançado e vamos analisar os detalhes disso um pouco mais em Refspec, mas ele pode ser bastante útil.
Na verdade, o GitHub anuncia (advertises) os branches de Pull Request de um repositório como uma espécie de pseudo-branches no servidor. Por padrão, você não os obtém quando clona, mas eles estão lá de forma obscura e você pode acessá-los com bastante facilidade.
Para demonstrar isso, usaremos um comando de baixo nível (frequentemente referido como um comando de “plumbing” ou encanamento, sobre o qual leremos mais em Encanamento e Porcelana (Plumbing and Porcelain)) chamado ls-remote.
Esse comando geralmente não é usado em operações do dia a dia no Git, mas é útil para nos mostrar quais referências estão presentes no servidor.
Se executarmos esse comando no repositório “blink” que estávamos usando antes, obteremos uma lista de todos os branches, tags e outras referências no repositório.
$ git ls-remote https://github.com/schacon/blink
10d539600d86723087810ec636870a504f4fee4d HEAD
10d539600d86723087810ec636870a504f4fee4d refs/heads/master
6a83107c62950be9453aac297bb0193fd743cd6e refs/pull/1/head
afe83c2d1a70674c9505cc1d8b7d380d5e076ed3 refs/pull/1/merge
3c8d735ee16296c242be7a9742ebfbc2665adec1 refs/pull/2/head
15c9f4f80973a2758462ab2066b6ad9fe8dcf03d refs/pull/2/merge
a5a7751a33b7e86c5e9bb07b26001bb17d775d1a refs/pull/4/head
31a45fc257e8433c8d8804e3e848cf61c9d3166c refs/pull/4/merge
É claro, se você estiver em seu repositório e executar git ls-remote origin ou qualquer remoto que deseje verificar, ele mostrará algo semelhante a isso.
Se o repositório estiver no GitHub e você tiver Pull Requests abertos, você obterá essas referências prefixadas com refs/pull/.
Estas são basicamente branches, mas como elas não estão sob refs/heads/, você normalmente não as obtém ao clonar ou fazer fetch do servidor — o processo de fetch normalmente as ignora.
Existem duas referências por Pull Request - a que termina em /head aponta exatamente para o mesmo commit que o último commit no branch do Pull Request.
Então, se alguém abrir um Pull Request no nosso repositório e seu branch for nomeado bug-fix apontando para o commit a5a775, em nosso repositório não teremos um branch bug-fix (já que está no fork deles), mas teremos pull/<pr#>/head apontando para a5a775.
Isso significa que podemos muito facilmente baixar todo branch de Pull Request de uma só vez sem ter que adicionar um monte de remotos.
Agora, você poderia fazer algo como o fetch da referência diretamente.
$ git fetch origin refs/pull/958/head
From https://github.com/libgit2/libgit2
* branch refs/pull/958/head -> FETCH_HEAD
Isto diz ao Git: “Conecte-se ao remoto origin e baixe o ref chamado refs/pull/958/head.”
O Git obedece de bom grado e baixa tudo o que você precisa para construir esse ref, e coloca um ponteiro para o commit que você deseja sob .git/FETCH_HEAD.
Você pode seguir isso com git merge FETCH_HEAD no branch onde deseja testar a alteração, mas a mensagem do commit de merge parecerá um pouco estranha.
Além disso, se você estiver revisando um monte de pull requests, isso se torna entediante.
Há também uma forma de fazer fetch de todos os pull requests e mantê-los atualizados sempre que você se conectar ao remoto.
Abra o .git/config em seu editor favorito e procure pelo remoto origin.
Deve se parecer um pouco com isto:
[remote "origin"]
url = https://github.com/libgit2/libgit2
fetch = +refs/heads/*:refs/remotes/origin/*
A linha que começa com fetch = é um “refspec”.
É uma forma de mapear nomes no remoto com nomes no seu diretório .git local.
Esse em particular diz ao Git: "as coisas no remoto que estão sob refs/heads devem ir para o meu repositório local sob refs/remotes/origin."
Você pode modificar esta seção para adicionar outro refspec:
[remote "origin"]
url = https://github.com/libgit2/libgit2.git
fetch = +refs/heads/*:refs/remotes/origin/*
fetch = +refs/pull/*/head:refs/remotes/origin/pr/*
Essa última linha diz ao Git: “Todos os refs que se parecem com refs/pull/123/head devem ser armazenados localmente como refs/remotes/origin/pr/123.”
Agora, se você salvar esse arquivo e fizer um git fetch:
$ git fetch
# …
* [new ref] refs/pull/1/head -> origin/pr/1
* [new ref] refs/pull/2/head -> origin/pr/2
* [new ref] refs/pull/4/head -> origin/pr/4
# …
Agora, todos os pull requests remotos são representados localmente com refs que atuam de forma muito parecida com as branches de rastreamento (tracking branches); eles são somente leitura e são atualizados quando você faz um fetch. Isso torna super fácil testar o código de um pull request localmente:
$ git checkout pr/2
Checking out files: 100% (3769/3769), done.
Branch pr/2 set up to track remote branch pr/2 from origin.
Switched to a new branch 'pr/2'
Os mais observadores entre vocês devem ter notado o head no final da porção remota do refspec.
Há também um ref refs/pull/#/merge no lado do GitHub, que representa o commit que resultaria se você clicasse no botão “merge” no site.
Isso pode permitir que você teste o merge antes mesmo de apertar o botão.
Pull Requests de Pull Requests
Você não apenas pode abrir Pull Requests que visam o branch principal ou master, como na verdade pode abrir um Pull Request visando qualquer branch na rede.
De fato, você pode até mesmo visar outro Pull Request.
Se você vir um Pull Request que está indo na direção certa e tiver uma ideia para uma alteração que dependa dele ou sobre a qual não tenha certeza se é uma boa ideia, ou simplesmente não tiver acesso de push ao branch de destino, você pode abrir um Pull Request diretamente para ele.
Quando você vai abrir um Pull Request, há uma caixa na parte superior da página que especifica de qual branch você está solicitando fazer o pull e para qual branch você está solicitando fazer o pull. Se você clicar no botão “Edit” (Editar) à direita dessa caixa, poderá alterar não apenas os branches, mas também de qual fork.
Aqui, você pode facilmente especificar o merge do seu novo branch em outro Pull Request ou outro fork do projeto.
Menções e Notificações
O GitHub também possui um sistema de notificações embutido muito bom que pode ser útil quando você tem dúvidas ou precisa de feedback de indivíduos ou equipes específicas.
Em qualquer comentário, você pode começar a digitar um caractere @ e ele começará a preencher automaticamente (autocomplete) com os nomes e nomes de usuário de pessoas que são colaboradoras ou contribuidoras do projeto.
Você também pode mencionar um usuário que não está nesse menu suspenso, mas muitas vezes o recurso de autocompletar pode torná-lo mais rápido.
Assim que você publicar um comentário com uma menção a um usuário, esse usuário será notificado. Isso significa que essa pode ser uma forma realmente eficaz de puxar as pessoas para conversas em vez de fazê-las pesquisar (poll). Com muita frequência, em Pull Requests no GitHub, as pessoas puxam outras pessoas de suas equipes ou de suas empresas para revisar uma Issue ou Pull Request.
Se alguém for mencionado em um Pull Request ou Issue, ele será “inscrito” (subscribed) nele e continuará recebendo notificações sempre que alguma atividade ocorrer. Você também será inscrito em algo se o abriu, se estiver observando (watching) o repositório ou se comentar sobre algo. Se você não deseja mais receber notificações, há um botão “Unsubscribe” (Cancelar Inscrição) na página que você pode clicar para parar de receber atualizações sobre ele.
A Página de Notificações
Quando mencionamos “notificações” aqui em relação ao GitHub, queremos dizer uma maneira específica que o GitHub tenta entrar em contato com você quando ocorrem eventos e há algumas maneiras diferentes de configurá-las. Se você for para a guia “Notification center” (Centro de notificações) na página de configurações, poderá ver algumas das opções que você tem.
As duas opções são receber notificações por “Email” e pela “Web” e você pode escolher uma, nenhuma ou ambas para quando participar ativamente de coisas e para atividades em repositórios que você está observando.
Notificações na Web
Notificações na Web só existem no GitHub e você só pode verificá-las no GitHub. Se você tiver essa opção selecionada em suas preferências e uma notificação for acionada para você, você verá um pequeno ponto azul sobre o ícone de notificações na parte superior da tela, como visto em Centro de notificações.
Se você clicar nele, verá uma lista de todos os itens sobre os quais foi notificado, agrupados por projeto. Você pode filtrar as notificações de um projeto específico clicando em seu nome na barra lateral esquerda. Você também pode confirmar a leitura (acknowledge) da notificação clicando no ícone de marca de seleção ao lado de qualquer notificação, ou confirmar a leitura de todas as notificações em um projeto clicando na marca de seleção na parte superior do grupo. Há também um botão de silenciar (mute) ao lado de cada marca de seleção que você pode clicar para não receber mais notificações sobre aquele item.
Todas essas ferramentas são muito úteis para lidar com um grande número de notificações. Muitos usuários avançados (power users) do GitHub simplesmente desligarão totalmente as notificações por e-mail e gerenciarão todas as suas notificações através desta tela.
Notificações por E-mail
Notificações por e-mail são a outra forma de lidar com notificações pelo GitHub. Se você tiver isso ativado, receberá e-mails para cada notificação. Vimos exemplos disso em Comentários enviados como notificações por e-mail e Notificação por e-mail de um novo Pull Request. Os e-mails também serão agrupados em threads corretamente, o que é bom se você estiver usando um cliente de e-mail com suporte a threads.
Há também uma boa quantidade de metadados incorporados aos cabeçalhos dos e-mails que o GitHub lhe envia, o que pode ser muito útil para configurar filtros e regras personalizadas.
Por exemplo, se olharmos os cabeçalhos de e-mail reais enviados para Tony no e-mail mostrado em Notificação por e-mail de um novo Pull Request, veremos as seguintes informações entre as enviadas:
To: tonychacon/fade <fade@noreply.github.com>
Message-ID: <tonychacon/fade/pull/1@github.com>
Subject: [fade] Wait longer to see the dimming effect better (#1)
X-GitHub-Recipient: tonychacon
List-ID: tonychacon/fade <fade.tonychacon.github.com>
List-Archive: https://github.com/tonychacon/fade
List-Post: <mailto:reply+i-4XXX@reply.github.com>
List-Unsubscribe: <mailto:unsub+i-XXX@reply.github.com>,...
X-GitHub-Recipient-Address: tchacon@example.com
Há algumas coisas interessantes aqui.
Se você quiser destacar ou redirecionar e-mails para este projeto ou mesmo Pull Request em particular, as informações em Message-ID lhe dão todos os dados no formato <usuario>/<projeto>/<tipo>/<id>.
Se isso fosse uma issue, por exemplo, o campo <tipo> teria sido “issues” em vez de “pull”.
Os campos List-Post e List-Unsubscribe significam que, se você tiver um cliente de e-mail que os compreenda, você pode postar facilmente na lista ou cancelar a inscrição (“Unsubscribe”) na thread.
Isso seria essencialmente o mesmo que clicar no botão de silenciar (“mute”) na versão web da notificação ou em “Unsubscribe” na própria página da Issue ou Pull Request.
Também vale a pena notar que se você tiver ambas as notificações por e-mail e pela web ativadas e ler a versão por e-mail da notificação, a versão web também será marcada como lida se você tiver imagens permitidas em seu cliente de e-mail.
Arquivos Especiais
Existem alguns arquivos especiais que o GitHub notará se estiverem presentes em seu repositório.
README
O primeiro é o arquivo README, que pode ser de quase qualquer formato que o GitHub reconheça como prosa.
Por exemplo, pode ser README, README.md, README.asciidoc, etc.
Se o GitHub vir um arquivo README no seu código-fonte, ele o renderizará na página de destino (landing page) do projeto.
Muitas equipes usam este arquivo para armazenar todas as informações relevantes do projeto para alguém que possa ser novo no repositório ou projeto. Geralmente, isso inclui coisas como:
-
Para que serve o projeto
-
Como configurá-lo e instalá-lo
-
Um exemplo de como usá-lo ou colocá-lo para rodar
-
A licença sob a qual o projeto é oferecido
-
Como contribuir com ele
Uma vez que o GitHub renderizará este arquivo, você pode incorporar imagens ou links nele para maior facilidade de compreensão.
CONTRIBUTING
O outro arquivo especial que o GitHub reconhece é o arquivo CONTRIBUTING.
Se você tiver um arquivo chamado CONTRIBUTING com qualquer extensão de arquivo, o GitHub mostrará Abrindo um Pull Request quando existe um arquivo CONTRIBUTING quando alguém começar a abrir um Pull Request.
A ideia aqui é que você pode especificar coisas específicas que você quer ou não quer em um Pull Request enviado para o seu projeto. Dessa forma, as pessoas podem de fato ler as diretrizes antes de abrirem o Pull Request.
Administração de Projeto
Geralmente não há muitas coisas administrativas que você possa fazer com um único projeto, mas há alguns itens que podem ser de interesse.
Mudando o Branch Padrão
Se você estiver usando um branch diferente de “master” como seu branch padrão, no qual você quer que as pessoas abram Pull Requests ou vejam por padrão, você pode alterar isso na página de configurações do seu repositório, na guia “Options” (Opções).
Basta alterar o branch padrão no menu suspenso e ele será o padrão para todas as principais operações a partir de então, incluindo qual branch é feito o checkout por padrão quando alguém clona o repositório.
Transferindo um Projeto
Se você quiser transferir um projeto para outro usuário ou para uma organização no GitHub, há uma opção “Transfer ownership” (Transferir propriedade) na parte inferior da mesma guia “Options” (Opções) da página de configurações do seu repositório que permite fazer isso.
Isso é útil se você estiver abandonando um projeto e alguém quiser assumi-lo, ou se o seu projeto estiver crescendo e você quiser movê-lo para uma organização.
Isso não apenas move o repositório, juntamente com todos os seus observadores (watchers) e estrelas (stars), para outro lugar, mas também configura um redirecionamento da sua URL para o novo lugar. Ele também redirecionará clones e fetches do Git, não apenas solicitações da web.