Git/GitHub

O Git é um sistema de controle de versão criado por Linus Torvalds em 2005 para desenvolvimento do Kernel, foi inicialmente usado para o desenvolvimento de software. Atualmente é mantido por Junio Hamano. Como a maioria dos sistemas de controle de versão distribuídos, e diferente do modelo cliente-servidor, todo diretório Git e todo computador é um completo repositório com o histórico completo de todas as versões independente de acesso a rede ou um servidor central.

O Git é uma ferramenta de linha de comando, e o GitHub.com, é o repositório, o local aonde os desenvolvedores armazenam seus projetos. A grande maioria das distribuições Linux hoje já vem por default com o pacote Git instalado. Para trabalharmos com o Git e termos acesso aos repositórios precisamos ter uma conta no GitHub: https://github.com/

Após criarmos uma conta no GitHub vamos configurar o git para ele gerenciar nossos projetos e enviá-lo para o GitHub. Para este exemplo vou utilizar o repo do Chef para ser versionado pelo Git:

tadeu@lwayslearning ~ $ chef generate repo chef-repo
tadeu@lwayslearning ~ $ cd chef-repo/
tadeu@lwayslearning chef-repo $ git init 
Reinitialized existing Git repository in /home/tadeu/chef-repo/.git/

Vamos setar nosso usuário e e-mail configurados no GitHub.

tadeu@lwayslearning chef-repo $ git config --global user.name tbernacchi
tadeu@lwayslearning chef-repo $ git config --global user.email tbernacchi@gmail.com

Também podemos setar o nosso editor de texto padrão para edição do Git.

tadeu@lwayslearning chef-repo $ git config --global core.editor "vim"

Para verificar a configuração atual:

tadeu@lwayslearning chef-repo $ git config --list 
user.name=tbernacchi
user.email=tbernacchi@gmail.com
core.editor=vim
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true

Feito isso vamos verificar o status do nosso repositório:

tadeu@lwayslearning chef-repo $ git status 
On branch master

No commits yet

Untracked files:
  (use "git add ..." to include in what will be committed)

	.chef-repo.txt
	.gitignore
	LICENSE
	README.md
	chefignore
	cookbooks/
	data_bags/
	environments/
	roles/

nothing added to commit but untracked files present (use "git add" to track)

Vamos adicionar o diretório para ser monitorado pelo git:

tadeu@lwayslearning chef-repo $ git add *
tadeu@lwayslearning chef-repo $ git status 
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached ..." to unstage)

	new file:   LICENSE
	new file:   README.md
	new file:   chefignore
	new file:   cookbooks/README.md
	new file:   cookbooks/example/README.md
	new file:   cookbooks/example/attributes/default.rb
	new file:   cookbooks/example/metadata.rb
	new file:   cookbooks/example/recipes/default.rb
	new file:   data_bags/README.md
	new file:   data_bags/example/example_item.json
	new file:   environments/README.md
	new file:   environments/example.json
	new file:   roles/README.md
	new file:   roles/example.json

Untracked files:
  (use "git add ..." to include in what will be committed)

	.chef-repo.txt
	.gitignore

Dois arquivos ocultos não foram incluídos.

tadeu@lwayslearning chef-repo $ git add .chef-repo.txt .gitignore 
tadeu@lwayslearning chef-repo $ git rm .chef-repo.txt .gitignore -f 
rm '.chef-repo.txt'
rm '.gitignore'

Verificamos novamente:

tadeu@lwayslearning chef-repo $ git status 
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached ..." to unstage)

	new file:   LICENSE
	new file:   README.md
	new file:   chefignore
	new file:   cookbooks/README.md
	new file:   cookbooks/example/README.md
	new file:   cookbooks/example/attributes/default.rb
	new file:   cookbooks/example/metadata.rb
	new file:   cookbooks/example/recipes/default.rb
	new file:   data_bags/README.md
	new file:   data_bags/example/example_item.json
	new file:   environments/README.md
	new file:   environments/example.json
	new file:   roles/README.md
	new file:   roles/example.json

Agora vamos adicionar a URL do nosso repositório do GitHub:

tadeu@lwayslearning chef-repo $ git remote add origin https://github.com/tbernacchi/chef-repo.git

Vamos fazer o pull do nosso repo:

tadeu@lwayslearning chef-repo $ git pull origin master 
From https://github.com/tbernacchi/chef-repo
 * branch            master     -> FETCH_HEAD
error: Your local changes to the following files would be overwritten by merge:
	README.md
Please commit your changes or stash them before you merge.
Aborting

Opaaa!!! Fammm – Isso aconteceu porque ao criarmos o nosso repo no GitHub ele criou o arquivo README.md

Vamos fazer o commit:

tadeu@lwayslearning chef-repo $ git commit -m "First commit chef-repo" -a 
[master (root-commit) 1cd5da5] First commit chef-repo
 14 files changed, 343 insertions(+)
 create mode 100644 LICENSE
 create mode 100644 README.md
 create mode 100644 chefignore
 create mode 100644 cookbooks/README.md
 create mode 100644 cookbooks/example/README.md
 create mode 100644 cookbooks/example/attributes/default.rb
 create mode 100644 cookbooks/example/metadata.rb
 create mode 100644 cookbooks/example/recipes/default.rb
 create mode 100644 data_bags/README.md
 create mode 100644 data_bags/example/example_item.json
 create mode 100644 environments/README.md
 create mode 100644 environments/example.json
 create mode 100644 roles/README.md
 create mode 100644 roles/example.json
tadeu@lwayslearning chef-repo (master) $ git pull origin master --allow-unrelated-histories 
From https://github.com/tbernacchi/chef-repo
 * branch            master     -> FETCH_HEAD
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

Opaaa!!! – Fammm, precisamos adicionar o nosso README.md:

tadeu@lwayslearning chef-repo (master) $ git add README.md 

Commitamos:

tadeu@lwayslearning chef-repo (master) $ git commit -m "Second commit chef-repo" -a 
[master b5dfd9f] Second commit chef-repo

Verificamos nossa branch:

tadeu@lwayslearning chef-repo (master) $ git pull origin master --allow-unrelated-histories 
From https://github.com/tbernacchi/chef-repo
 * branch            master     -> FETCH_HEAD
Already up-to-date.

E finalmente enviamos nossos arquivos do projeto para o GitHub:

tadeu@lwayslearning chef-repo (master) $ git push --set-upstream origin master 
Username for 'https://github.com': tbernacchi
Password for 'https://tbernacchi@github.com': 
Counting objects: 27, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (23/23), done.
Writing objects: 100% (27/27), 6.20 KiB | 1.24 MiB/s, done.
Total 27 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
To https://github.com/tbernacchi/chef-repo.git
   938f8ca..b5dfd9f  master -> master
Branch master set up to track remote branch master from origin.

Lembrando que todo este procedimento fizemos da branch master para master!

GIT PUSH sem senha

Após o término deste tutorial reparei que havia configurado o Git com https, o que o faz pedir login e senha do GitHub toda vez que você efetuar o ‘push’. Para configurar o Git para efetuar o push sem precisar toda vez digitar o login e senha precisamos configurar o SSH na nossa conta.

Para isso:

tadeu@lwayslearning ~ $ ssh-keygen
tadeu@lwayslearning ~ $ ls -l ~tadeu/.ssh/
total 20
-rw------- 1 tadeu 1675 Dec 26 12:05 id_rsa
-rw-r--r-- 1 tadeu  401 Dec 26 12:05 id_rsa.pub

Adicionamos a chave pública no GitHub segundo o tutorial -> https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/

Feito isso voltamos ao terminal:

tadeu@lwayslearning ~ $ eval "$(ssh-agent -s)" 
Agent pid 7873
tadeu@lwayslearning chef-repo (master) $ ssh-add ~/.ssh/id_rsa
Identity added: /home/tadeu/.ssh/id_rsa (/home/tadeu/.ssh/id_rsa)

Removemos as conf ‘remote.origin.url’ e ‘remote.origin.fetch’:

tadeu@lwayslearning ~ $ git config --unset remote.origin.url
tadeu@lwayslearning ~ $ git config --unset remote.origin.fetch

E setamos o Git para usar o SSH:

tadeu@lwayslearning ~ $ git remote add origin ssh://git@github.com/tbernacchi/chef-repo.git

Referências:
https://en.wikipedia.org/wiki/Git
https://www.howtogeek.com/180167/htg-explains-what-is-github-and-what-do-geeks-use-it-for/
https://www.youtube.com/watch?v=_aj3hsEh9iw&t=159s
https://github.com/tbernacchi/chef-repo