Manual Clone e Commit no Git

Versão do documento: 4.0, 02/01/2025

Introdução

Este documento tem como objetivo orientar todos os colaboradores sobre o uso correto dos repositórios Git, bem como das ferramentas associadas.

Como efetuar o Clone

Um clone, no Git, é a replicação inicial de um repositório remoto para uma pasta no computador pessoal, semelhante a um SVN Checkout. Inicialmente, acessar o Gitlab, repositório interno da Basis: https://gitlab.basis.com.br/. O login será realizado através do SSO Basis, usando as mesmas credenciais do SGO.

sso login
Figura 1. Tela de login do SSO

Conforme a figura acima, o usuário e a senha da rede devem ser digitados.

Ao entrar, a tela inicial é apresentada. Nela, é possível verificar projetos aos quais se tem acesso, bem como os grupos que abrangem tais projetos.

gitlab
Figura 2. Tela inicial do Gitlab

É possível pesquisar o repositório do qual se deseja fazer um clone na caixa de pesquisa no canto superior direito da tela. Ou, se preferir, usar os menus de Projetos ou Grupos, no canto superior esquerdo.

gitlab busca
Figura 3. Busca no Gitlab

Se o repositório não aparecer logo na busca inicial, ao pressionar Enter ou selecionar a caixa "em todo o Gitlab", o sistema apresentará uma tela mais completa com todos os resultados encontrados, bem como a possibilidade de pesquisar em grupos e projetos específicos.

gitlab busca avancada
Figura 4. Busca avançada no Gitlab

Ao selecionar um repositório, serão apresentados os arquivos e pastas de sua raiz, de forma que se pode explorar e visualizar detalhes dos mesmos:

gitlab repositorio
Figura 5. Listagem do Repositório

Para obter o endereço de clone, basta clicar no botão destacado Clonar, no canto direito, atentando para a seleção do tipo de clone, que pode ser HTTPS ou SSH. Para esta seção, será usado o clone via HTTPS. Clicando no ícone de prancheta ao lado do link, a URL será copiada.

gitlab clone
Figura 6. Endereço para clonar

Instalação e configuração do TortoiseGit

Baixando e instalando o TortoiseGit

O software TortoiseGit é uma de várias possíveis interfaces gráficas para Git no Windows. Ele pode ser baixado em sua versão mais recente no site: https://tortoisegit.org/download/. Para que o TortoiseGit funcione corretamente, faz-se necessária a instalação do Git for Windows, no site: http://git-scm.com/download/win. Apenas após a instalação do mesmo, o TortoiseGit deve ser instalado. Atenção à versão baixada (32-bit ou 64-bit), que deve obedecer às especificações da sua máquina para as duas instalações.

Usando TortoiseGit para o clone

Usando o Windows Explorer, na pasta onde se deseja manter o repositório local, clica-se com o botão direito. No menu de contexto, a opção "Git Clone" deve ser selecionada.

tortoisegit explorer menu
Figura 7. Menu contextual do Tortoise Git

Na janela que segue, no campo URL, deve ser colado o link de clone copiado da página de repositório do Gitlab. Se o link já estiver previamente copiado, deve aparecer automaticamente no campo.

tortoisegit clone
Figura 8. Clonando no Tortoise Git

Da primeira vez que se faz qualquer operação num repositório, o TortoiseGit exige informações de usuário. Basta colocar o nome de usuário e e-mail Basis, e clicar em OK.

tortoisegit config
Figura 9. Configurando o Git no Tortoise

O nome de usuário e a senha da rede devem ser digitados para validar o clone.

tortoisegit password
Figura 10. Inserindo senha no Tortoise Git

Os mesmos ficarão salvos no Gerenciador de Credenciais do Windows, caso precisem ser alterados.

windows gerenciador credenciais
Figura 11. Gerenciador de Credenciais Windows

Após a confirmação da senha, uma tela será exibida informando o progresso do clone.

tortoisegit cloning
Figura 12. Progesso do clone no Tortoise Git

Ao concluir, o repositório já estará localmente replicado na máquina do usuário.

Usando SSH

O Git oferece a opção de clone dos repositórios via HTTPS, como já foi apresentado, ou via SSH. O SSH costuma ser mais prático e menos limitado que o HTTPS, mas necessita de várias configurações locais e remotas para funcionar devidamente.

Inicialmente, deve ser gerada uma chave SSH localmente na sua máquina. Para tanto, vamos usar a interface padrão de console do Git for Windows, que também serve como alternativa ao próprio TortoiseGit, se for mais interessante usar comandos de linha diretamente em vez de uma interface gráfica.

Na máquina local, buscar, no menu Iniciar ou na barra de buscas do Windows, o programa Git Bash. A janela inicial será um console em preto:

gitbash
Figura 13. Git Bash

Digitar o seguinte, e pressionar Enter:

ssh-keygen -t rsa

O console vai pedir, na ordem:

  • Um caminho para os arquivos de chave. Apenas pressione Enter, e mantenha o padrão.

  • Uma senha para a chave. É opcional, mas dará mais segurança à mesma (obs.: com o preenchimento desse campo, será necessário inserir a mesma senha toda vez que for fazer alguma operação no repositório).

  • Escrever a senha outra vez. Deixar vazio se ficou vazio anteriormente. Ao final, a chave será gerada dentro do diretório selecionado na primeira entrada. Por padrão: C:\Users\[SeuUsuario]\.ssh

gitbash keygen
Figura 14. Gerando Chave SSH no Git Bash

Acessando o caminho da chave no Windows, devem haver dois arquivos: id_rsa e id_rsa.pub. O segundo deve ser aberto em qualquer editor de texto, para que se possa copiar a chave.

notepad id rsa.pub
Figura 15. Chave Pública RSA

Com a chave em mãos, entrar no Gitlab, e adentrar a seção "Configurações", no menu do canto superior direito.

gitlab config
Figura 16. Entrando nas configurações no Gitlab

Ali dentro, selecionar no menu esquerdo "Chaves SSH". Na seção que se abrir, colar a chave do id_rsa.pub, dar um título para identificar a chave, então clicar no botão "Adicionar Chave" abaixo.

gitlab add key
Figura 17. Adicionando Chave no Gitlab

Feita a adição com sucesso, a última coisa que precisa ser feita é uma alteração local do programa utilizado para SSH no TortoiseGit. No menu iniciar ou de busca, procurar por Settings, um programa que tenha o ícone do TortoiseGit. Entrando no mesmo, selecionar o item Network no menu esquerdo. Ali dentro em SSH, basta colocar o caminho do executável SSH do Git for Windows (por padrão, C:\Program Files\Git\usr\bin\ssh.exe, variando o início do caminho de acordo com a sua pasta de instalação) e clicar em OK.

tortoisegit ssh config
Figura 18. Configurando ssh no Tortoise Git

Feito isso, operações de repositório já podem ser realizadas usando SSH. Basta fazer o clone do repositório utilizando o link SSH que o mesmo fornece na página do repositório.

gitlab clone ssh
Figura 19. Endereço para clonar com SSH

Commit e Push

Sempre, antes que seja feita qualquer alteração de arquivos num repositório via Commit/Push, deve ser executado um Pull, que atualiza o repositório local com as últimas mudanças do repositório online.

tortoise git pull 1
Figura 20. Fazendo pull no Tortoise Git
tortoise git pull 2
Figura 21. Confirmando o pull no Tortoise Git

Vale lembrar o Git solicitará o nome e a senha de rede do usuário que sempre que houver uma requisição HTTPS ao repositório da Basis, seja clone, Pull ou Push. Se o clone for feito usando SSH, não será necessário.

Podemos dizer que um Pull é semelhante a um Update no SVN. É importante reparar, porém, que ao contrário do SVN Update, um Git Pull mescla a versão mais recente do repositório remoto (online) com a versão local do mesmo. Ou seja, mudanças feitas no repositório local não serão automaticamente sobrescritas pelo Pull, nem mesmo arquivos excluídos. Para recuperar originais, faz-se necessário realizar um Revert antes do commit.

Após a conclusão das alterações desejadas aos arquivos do repositório, incialmente deve ser feito o commit, que vai validar as mudanças, ainda apenas no repositório local. Deve-se clicar com o botão direito na pasta do repositório em que foram realizadas as modificações (não necessariamente a pasta raiz, porém preferencialmente, para evitar erros em potencial relativos a mudanças em outras pastas) e selecionar a opção Git Commit.

tortoisegit commit menu
Figura 22. Menu de commit do Tortoise Git

Para que o commit seja feito, é necessário relatar, na caixa de mensagem, quais alterações foram feitas e informar com qual ocorrência do SGO elas se relacionam. Ex:

Atualizar x, y e z - BASIS-1234
OBSERVAÇÕES IMPORTANTES SOBRE O COMMIT
  • Não usar ocorrências não relacionadas ao repositório em si, ou específicas de usuário, pois podem comprometer o commit e a leitura de dados por outros.

  • Atenção às regras de commit acima estabelecidas! Se o commit tiver uma mensagem sem referência a ocorrências do SGO ou o e-mail de usuário estiver incorreto, haverá erro no envio ao repositório remoto. Favor atentar aos detalhes do próprio commit.

  • Atenção aos arquivos listados! O que será enviado ao repositório pode não ser simplesmente o arquivo selecionado por clique, pois o commit do Git é feito sempre em cima do repositório inteiro. Se houver movido arquivos, ou separado pastas, por exemplo, é possível que o Git interprete que foram todos excluídos, e se estiverem marcados como tal na janela do commit, serão realmente apagados do repositório! Certifique-se sempre, na janela, de marcar apenas os arquivos que deseja alterar.

tortoisegit commit message
Figura 23. Inserindo mensagem de commit no Tortoise Git

Após a conclusão do commit, as mudanças estarão efetivadas, mas apenas no repositório local. Para enviá-las ao repositório remoto online, a opção Push deve ser selecionada logo em seguida.

tortoisegit push
Figura 24. Fazendo o push no Tortoise Git
tortoisegit push confirm
Figura 25. Confirmando o push no Tortoise Git

Após o usuário digitar seu nome e senha, se necessário, o Push será executado. Uma vez finalizado sem erro, as mudanças podem ser conferidas no site do Repositório Gitlab Basis.

Gerando Tags

Ao finalizar uma versão de código-fonte, ou finalizar um requisito específico, faz-se necessária a criação de tags nos repositórios para representar a baseline relativa àquela versão. É bastante simples fazer isso utilizando TortoiseGit.

Levando em conta que o commit que será marcado como tag já foi realizado, clicar com o botão direito na pasta do repositório em questão e selecionar TortoiseGit > Show log.

tortoisegit tag menu
Figura 26. Abrindo o log de commits no Tortoise Git

A janela que segue lista todos os commits realizados naquele repositório. A tag deve ser criada no commit específico que finalizou o requisito ou versão em questão. Clicar nele com o botão direito e selecionar "Create Tag at this version".

tortoisegit select commit
Figura 27. Selecionando o commit para geração de Tags

Na janela que se abre, entrar com o nome da versão/baseline em questão, seguindo os padrões estabelecidos no Guia de Gerência de Configuração, que estabelecem nomes diferentes para código-fonte e documentação, e atentando às versões já existentes no repositório, que podem ser verificadas na combo Tag do item Base On, ou no próprio repositório online no Gitlab. Atentar à marcação original, que deve ser o commit em questão.

tortoisegit create tag
Figura 28. Criando tag no Tortoise Git

Uma vez que a tag esteja criada, aparecendo em amarelo na janela do Git Log, deve ser feito um novo push, dessa vez especificando que as tags devem ser incluídas.

tortoisegit push tags
Figura 29. Fazendo o push das tags no Tortoise Git

Trabalhando com Forks

Certos usuários do Gitlab têm o acesso direto aos repositórios dos sistemas limitado a apenas leitura. Para que possam fazer suas próprias alterações no código, é necessário que façam um fork, que vai gerar uma cópia do repositório em questão, para que eventualmente seja mesclado por um representante da equipe (revisor técnico), seguindo o ciclo da imagem:

image
Figura 30. Ciclo Fork

Criando Fork

Dentro da página no Gitlab do repositório que se deseja copiar, clicar em Fork, no canto superior direito.

gitlab fork criar
Figura 31. Fork Gitlab

Selecionar como namespace o próprio nome de usuário, apresentado por padrão na página.

gitlab fork criacao
Figura 32. Criação do Fork

O repositório será criado e toda a estrutura de commits passará por uma importação. Uma vez finalizada, o repositório apresentará a mesma exata estrutura que o original. Desse ponto em diante, as ações de clone e push seguirão os mesmos princípios já apresentados.

Merge do Fork

Para que o código atualizado no fork seja replicado no repositório original, é necessário que seja aberto um merge request a partir do fork, apontando para a branch do repositório original. Esse merge request precisa ser aberto por um usuário que tenha acesso de escrita no repositório original, e é necessário que haja mais de um commit para o merge, pois será realizado um git squash. Caso seja aberto pelo próprio dono do Fork, que possui acesso somente leitura ao original, ou caso possua apenas um único commit, será fechado imediatamente pelo próprio sistema.

Na tela do repositório fork, no menu esquerdo, clicar em "Merge Requests".

gitlab merge request
Figura 33. Merge Requests

Dentro da tela, haverá um botão "Novo Merge Request". Selecionando o mesmo, será aberta uma nova tela para seleção de quais branches e repositórios servirão como origem e destino. Para origem ("Source Branch"), selecionar o seu fork e a branch onde se trabalhou. Para destino, selecionar o repositório original, e a branch do mesmo onde o merge deverá ser feito. Clicar em "Compare branches and continue".

gitlab merge novo
Figura 34. Novo Merge Request

Na tela que se segue, escrever um título para o seu merge request, preferencialmente incluindo a ocorrência relativa aos commits em questão para que esteja na mensagem de squash. Adicionar também uma descrição, que será unida ao template de MR da Basis, quando aplicável. No campo Assignee, apontar um usuário responsável pela aprovação do MR, caso necessário. A opção "Delete source branch when merge request is accepted" apagará a branch original do fork assim que houver o merge de fato. E a opção "Squash commits when merge request is accepted" será marcada automaticamente, mesmo que seja desmarcada nesta tela.

gitlab merge criando
Figura 35. Tela de criação do Merge Request

Uma vez criado, o merge request será listado no menu de Merge Requests do repositório original.

gitlab merge criado
Figura 36. Merge Request criado

Também será criado um link para acessar o merge request na ocorrência do SGO mencionada pelo mesmo.

gitlab merge sgo
Figura 37. Merge Request no SGO

Quando aprovado e selecionada a opção Merge, será realizado um commit de squash combinando os commits do repositório de fork, mais um commit de merge mesclando os dois repositórios. O código então será disponibilizado na branch do repositório original. Se houver algum problema no merge ou na criação do próprio merge request, o próprio sistema informará em mensagem.

Atualizando o Fork

Quando o fork se encontra atrasado em relação ao repositório original, é possível atualizá-lo em seu repositório fork clonado localmente. Para isso, é necessário inicialmente adicionar o repositório original como um novo remote caso não exista, executando no seu repositório local o seguinte comando:

git remote add upstream endereco_repositorio_original.git

Atualiza-se então esse remote "upstream" usando um fetch:

git fetch upstream

Para sincronizar de fato seus arquivos locais com os do repositório original, realiza-se um merge do seu repositório local, usando como base a branch requisitada do original (por padrão, "master"; alterar de acordo):

git merge upstream/master

Por fim, para atualizar o repositório no Gitlab, realiza-se o push padrão:

git push origin sua_branch

Lidando com Problemas

Push retorna erro

Verifique, antes de tudo, se seu repositório local está atualizado. Diferente do SVN, não basta que apenas a pasta específica em que se está editando esteja devidamente atualizada; o repositório inteiro deve estar em dia. Realize sempre um Pull antes de fazer quaisquer modificações.

Se o repositório não estava atualizado, mas o commit foi feito ainda assim, realize um Pull de todo modo. Pode ser que não haja conflitos de arquivos modificados. Se for o caso, o Pull não retornará erros, não haverá ícones de conflito nas pastas, e o seu Push pode ser realizado diretamente em seguida (sem o commit, nesse caso, pois este já havia sido feito).

Entretanto, se houver conflitos, cabe verificar com a sua equipe se os arquivos em questão foram modificados. O próprio Log do Git deve retornar informações sobre quais foram as últimas modificações sobre o determinado arquivo, o que pode ser verificado clicando sobre o mesmo com o botão direito e selecionando, sob o menu do TortoiseGit, Show Log.

tortoisegit showlog menu
Figura 38. Menu Show Log do Tortoise Git

A janela seguinte terá informações de quais foram os últimos commits, e quem os realizou, para devida informação e discussão.

tortoisegit log messages
Figura 39. Log Messages no Tortoise Git

Uma vez que se tenha certeza que o arquivo existente no seu repositório local é o mais atualizado, deve-se selecionar, no menu do TortoiseGit na pasta, a opção "Resolve".

tortoisegit resolve menu
Figura 40. Resolvendo conflitos no Tortoise Git

Marca-se então os arquivos atualizados, confirma, e então o Commit/Push pode ser realizado novamente com maior segurança.

Se ainda houver erro, experimente executar um Clean up, opção logo acima também representada. Execute também um novo Pull em seguida, para poder realizar o commit depois com segurança, e certifique-se de que todos os arquivos estão presentes no repositório local.

É importante também lembrar que é obrigatório incluir um número de ocorrência em todo e qualquer commit. Se este estiver faltando, o servidor retornará erro no Push
tortoisegit push error
Figura 41. Erro no push

Para corrigir essa situação, é necessário emendar à mensagem do commit uma ocorrência válida do SGO. Se apenas um commit errôneo foi realizado, basta selecionar Git Commit novamente no repositório em questão e selecionar a opção Ammend Last Commit na caixa logo abaixo da entrada de mensagem:

tortoisegit ammend commit
Figura 42. Ammend Commit no Tortoise Git

Em seguida, clicar em Ok e seguir com o mesmo modelo de Commit/Push apresentado mais acima.

Se houver mais de um commit na fila, no entanto, e até mesmo em outros casos de erro recorrente, será necessário fazer um Rebase, ou refazer os commits do zero antes de realizar o Push.

Quando um commit é feito no Git, ele se mantém na fila para subir ao repositório remoto num Push. Outros commits em cima do mesmo apenas se acumulam na fila. Ou seja, se o primeiro commit está errado, ele permanecerá sem enviar para o sistema até que seja removido ou editado na fila. Nesse caso, como existem vários commits errados na fila, a procedência possível seria editar ou eliminar a mesma.

Para o primeiro caso, o chamado Rebase, clicar com o botão direito na pasta do repositório com os commits problemáticos, e dentro do menu do TortoiseGit, selecionar a opção Rebase.

tortoisegit rebase menu
Figura 43. Menu Rebase no TortoiseGit

Na janela que segue, marcar inicialmente a opção Force Rebase, para que o sistema leve em conta todos os commits diferentes entre o repositório local e o remoto. Em seguida, clicar com o botão direito no commit que está com problemas (pode ser mais de um), e selecionar a opção Edit. Feito isso, iniciar o Rebase através do botão Start Rebase no rodapé da janela.

tortoisegit rebase window
Figura 44. Janela de rebase do TortoiseGit

Uma vez iniciado, se configurado corretamente, ele vai parar para edição da mensagem do(s) commit(s) em questão. Adicionar a ocorrência faltante, e clicar em Ammend, e em seguida em Done.

tortoisegit confirm rebase
Figura 45. Confirmando o rebase no TortoiseGit

Terminado o processo de Rebase, o Push já pode ser feito sem a necessidade de fazer um novo commit.

Para o caso de refazer a fila de commits do zero, primeiramente, é interessante fazer um backup dos arquivos alterados em tais commits, pois serão apagados ou substituídos pelas versões atualmente presentes no repositório remoto. Com o backup feito, selecionar na pasta raiz do repositório: TortoiseGit > Switch/Checkout. Na janela aberta, deixar exatamente como está na imagem abaixo, com todas as marcações (ênfase na branch remote/origin/master do primeiro menu, não é a master originalmente selecionada).

tortoisegit switch checkout
Figura 46. Switch/Checkout no TortoiseGit

Após clicar em OK, o repositório retornará ao seu estado anterior aos commits errôneos, exatamente igual ao repositório online. Com isso, os arquivos no backup podem ser copiados de volta para a pasta do repositório, e o commit pode ser refeito.

Se houver mais erros, entre em contato com a gerência de configuração.

Pull ou Clone retorna erro

É possível que o repositório em questão tenha nomes de arquivos ou caminhos muito grandes e, quando se realiza um Clone do mesmo num sistema Windows, ele não consiga abranger todo o caminho, retornando erros de Filename too long. Se for esse o caso, experimente realizar o Clone em outra pasta do seu sistema, preferencialmente alguma num caminho bem curto, como C:\git.

Outro erro possível teria a seguinte mensagem: error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure. Nesse caso, é necessário atualizar os protocolos de conexão SSL na configuração do Git para uma versão mais segura. Execute o seguinte comando no Git Bash (para seu uso, consultar a seção de SSH):

git config --global http.sslVersion tlsv1.2

Após essa alteração, o Clone/Pull deve funcionar corretamente. Caso contrário, ou se o comando retornar algum erro, é recomendável reinstalar o Git numa versão mais recente.

Se tais soluções não funcionarem, ou se o erro for diferente, entre em contato com a gerência de configuração.

Histórico de Revisão

Tabela 1. Histórico de Revisões
Data Versão Autor Revisor Observação

02/01/2025

4.0

Layanne Leite

Cédric Lamalle

Adequações para processo de serviço.