Git? Sistema de Versionamento? O que é isso?
Published: 2019-02-14 00:33:11

---
title: Git? Sistema de Versionamento? O que é isso?
published: true
description: Introdução ao Git e Github
tags: 
---

# Introdução


Git é um sistema de versionamento que te possibilita controlar as versões de arquivos. Esqueça de criar diretórios nomeando arquivos como: projeto-versão1, projeto-versão2, projeto-versão-final. Com git você não precisa mais controlar manualmente a versão de seus arquivos, ou seja, você terá no diretório a versão que você deseja. 

Com pequenos comandos é possível fazer esse versionamento, apresentarei os principais. Para os mais curiosos a [documentação](https://git-scm.com/docs) é excepcional e explica tanto em português quanto inglês outras várias funcionalidades do sistema.

# Principais Comandos
*Antes de começar tenha certeza que tenha o git instalado em seu PC.*

Comando: `git init` - inicia o controle da versão na pasta desejada

## Stages
Temos vários estágios no git:
- Working Directory - Esse é o estágio inicial, quando modificamos o arquivo
- Staging - O arquivo passa para esse estágio quando o adicionamos ao controle
- History - O arquivo chega a esse estágio quando salvamos esse arquivo com o controle

> `git add .` 

*OBS: Existe esse ponto, é um comando que diz que todos os arquivos estão sendo adicionados ao estágio de staging.*

O `git add`, portanto é responsável por passar o arquivo do working directory para o staging. 

> `git add nome_do_arquivo`

*Passa somente um arquivo.*

> `git commit -m "Mensagem"`

*OBS:A flag -m é um comando para colocar uma mensagem no seu commit. Se você não usar a flag, abrirá um editor para colocar a mensagem desejada.*
Esse comando salva os arquivos que estão no staging no history, ou seja, se não existe nenhum arquivo no estágio de staging, o `git commit` não salvará nada.

> `git status`

*Se por acaso não souber os estágio dos arquivos o git status irá te informar sobre.*

# [Github](https://github.com/)

Agora imagina em uma empresa vários desenvolvedores trabalhando desse jeito: um precisa fazer atualização em um código e ao mesmo tempo um outro dev está desenvolvendo uma nova feature; e quando eles acabarem, como vão controlar as mudanças sem perder nenhuma linha de código?

## Só o Git resolve?

Sim só o git resolve, é um sistema completo. Utilizaremos um outro recurso chamado remote. O remote é um recurso para adicionar um servidor para servir o estágio de *history* de seu controle de versão. E esse servidor que vamos utilizar é o *github*. Existe, hoje, vários servidores como o BitBucket e Gitlab, porém o Github é o mais famoso e por isso é importante conhecê-lo para principalmente criar o seu portfólio, colaborar em projeto de código aberto para ser visto por empresas (Github vale como um cartão de apresentação). 

Crie o seu user no [github](github.com). Crie um novo repositório, este será o lugar onde estará o código que está sob versionamento.
*É necessário ressaltar que o github serve arquivos somente que estão no estágio de history*

> `git remote add "nome curto" "url"`

*Adicionando a url de seu repositório*

> `git push -u origin master`

*Copiando os recursos do estágio "History" para o repositório*

Mas até agora só mudamos o estágio de History para o Repositório, não solucionamos o problema. 

Onde a mágica acontece:
> `git pull`
Buscamos mudanças de nosso repositório para o nosso controle, ou seja, trazemos os arquivos do github e alteramos no nosso controle. 

Com isso conseguimos resolver o problema inicial: quando um desenvolvedor acabar com a alteração do código, o dev que está desenvolvendo a nova feature irá realizar o processo de *pull* e atualizará o código dele para uma versão mais nova sem problemas e sem preocupação de perder todo o trabalho que ele tinha feito. Não é bonito? 

Não perca tempo de usar esse sistema, use com sabedoria!

*Existem outros tipos de sistema de controle de versão que possui os mesmos princípios como, por exemplo: SVN e Mercurial.*

*Sharing is good, and with digital technology, sharing is easy!* - Richard Stallman