🔶 Meu estudo de Git #1 - Utilitários Básicos
Tags: git, braziliandevs
Published: 2022-03-13 00:04:48

Estou Registrando o meu estudo de git. 

Para este primeiro post, utilizei o seguinte vídeo:

[Git #1 - Conceitos e principais comandos de versionamento](https://www.youtube.com/watch?v=GIEquFr3jcg&list=PLDqnSpzNKDvkfF_ZMfukmOG3MtGKfXlfJ)]

## Utilitários Básicos do Git

- [git config](#git-config)
- [git help](#git-help)
- [git init](#git-init)
- [git status](#git-status)
- [git add](#git-add)
- [git add .](#git-add-all)
- [git commit -m "mensagem curta"](#git-commit-m)
- [git commit](#git-commit)
- [gitignore](#gitignore)
- [git diff](#git-diff)
- [git log](#git-log)
- [git log --oneline](#git-log-oneline)
- [git commit -m "mensagem" --amend](#git-commit-amend)
- [git reset HEAD~1 --soft](#git-reset-soft)
- [git reset HEAD~1 --hard](#git-reset-hard)
- [git checkout](#git-checkout)
- [git rm](#git-rm)
- [git tag](#git-tag)
- [git show](#git-show)

[![A Jornada do Autodidata em Inglês](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pkoqkmh9hic17tnddjf6.png)](https://go.hotmart.com/R93865620U)

#### Primeiros Passos: Config <a name="git-config"></a>

```bash
$ git --version

$ git config --global user.name "Seu Nome"

$ git config --global user.email "seu_email@email.com"

$ git config --list
```

#### Usando a documentação: Help <a name="git-help"></a>

```bash
$ git help

$ git help add

$ git help commit
```

#### Criando um diretório e iniciando o Git <a name="git-init"></a>

```bash
$ mkdir -p ~/git/es2

$ cd ~/git/es2 

$ git init
```

#### Criando um arquivo e verificando o status dele <a name="git-status"></a>

```bash
$ touch file.txt
```

```bash
$ git status
On branch master

No commits yet

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

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

#### Adicionando o arquivo na `Staging Area` (Trackeando/Monitorando o arquivo) <a name="git-add"></a>

```bash
$ git add file.txt
```

```bash
$ git status      
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   file.txt
```

#### Trackeando vários arquivos ao mesmo tempo <a name="git-add-all"></a>

De forma interativa:
```bash
$ git add -i
```

Ou adicionando tudo sem perguntar:
```bash
$ git add .
```


#### Enviando para o repositório local usando o `git commit -m` para mensagem curta. <a name="git-commit-m"></a>


```bash
$ git commit -m "cria arquivo vazio de testes"
```


#### Enviando para o repositório local usando o `git commit` para mensagem longa. <a name="git-commit"></a>


```bash
$ touch file2.txt

$ touch file3.txt
```

```bash
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	file2.txt
	file3.txt

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

```bash
$ git add .
```

```bash
$ git status
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	new file:   file2.txt
	new file:   file3.txt
```

```bash
$ git commit
```

```bash
adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Changes to be committed:
#       new file:   file2.txt
#       new file:   file3.txt
#
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
~                                                                               
-- INSERT --
```

Após escrever a mensagem, pressionar `ESC` e digitar `:wq!` e pressionar `ENTER`.


#### Arquivo .gitignore <a name="gitignore"></a>


```bash
$ touch .gitignore
```

```bash
$ touch dep.out
```

```bash
$ ls -la
total 8
drwxr-xr-x   8 maiquipirollitome  staff  256 Mar 12 11:55 .
drwxr-xr-x   3 maiquipirollitome  staff   96 Mar 12 10:26 ..
drwxr-xr-x  12 maiquipirollitome  staff  384 Mar 12 11:56 .git
-rw-r--r--   1 maiquipirollitome  staff   14 Mar 12 11:56 .gitignore
-rw-r--r--   1 maiquipirollitome  staff    0 Mar 12 11:55 dep.out
-rw-r--r--   1 maiquipirollitome  staff    0 Mar 12 10:35 file.txt
-rw-r--r--   1 maiquipirollitome  staff    0 Mar 12 11:27 file2.txt
-rw-r--r--   1 maiquipirollitome  staff    0 Mar 12 11:27 file3.txt
```
Escrevendo no arquivo .gitignore:
```bash
$ echo "dep.out" > .gitignore
```
ou todos os arquivos com final `.out`
```bash
$ echo "*.out" >> .gitignore
```

```bash
$ cat .gitignore                  
dep.out
*.out
```

```bash
$ git status    
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.gitignore

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

```bash
$ git add .

$ git commit -m "adiciona gitignore"
```


#### Observando as alterações dos arquivos <a name="git-diff"></a>


```bash
$ echo "file content" > file4.txt

$ git add .

$ git commit -m "adiciona o arquivo file4 para teste de diff"
```

Adicionando uma nova linha no arquivo:
```bash
$ echo "New content" >> file4.txt
```

```bash
$ cat file4.txt 
file content
New content
```


```bash
$ git diff  
```
Após o comando acima, o conteúdo abaixo é mostrado:
```bash
diff --git a/file4.txt b/file4.txt
index dd59d09..91aea86 100644
--- a/file4.txt
+++ b/file4.txt
@@ -1 +1,2 @@
 file content
+New content
(END)
```

OBS: pressione a tecla `q` para sair.


#### Histórico dos commits realizados <a name="git-log"></a>


```bash
$ git log
```
Após o comando acima, o conteúdo abaixo é mostrado:
```bash
commit be2c14b0e37a455b6eb689f956949af33aef2068 (HEAD -> master)
Author: Maiqui Pirolli Tomé <maiquitome@gmail.com>
Date:   Sat Mar 12 13:12:39 2022 -0300

    adiciona o arquivo file4

commit 79091dabdcdfc48d860c796ee1d003755c78e76d
Author: Maiqui Pirolli Tomé <maiquitome@gmail.com>
Date:   Sat Mar 12 13:02:14 2022 -0300

    adiciona gitignore

commit 443f35bbccda20cb8fd52681e027f52a2e8c7eb5
Author: Maiqui Pirolli Tomé <maiquitome@gmail.com>
Date:   Sat Mar 12 11:33:22 2022 -0300

    adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.

commit 051e33bae593fde6c9b9e45ee4d2c0e1f8d19ace
Author: Maiqui Pirolli Tomé <maiquitome@gmail.com>
Date:   Sat Mar 12 11:03:27 2022 -0300

:
```


#### Histórico de commits de forma resumida <a name="git-log-oneline"></a>


```bash
$ git log --oneline
```
Após o comando acima, o conteúdo abaixo é mostrado:
```bash
be2c14b (HEAD -> master) adiciona o arquivo file4
79091da adiciona gitignore
443f35b adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.
051e33b cria arquivo vazio de testes
(END)
```

#### Editando commits <a name="git-commit-amend"></a>

Verificando qual arquivo não foi efetuado o commit:
```bash
$ git status       
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   file4.txt

no changes added to commit (use "git add" and/or "git commit -a")
```

Olhando o conteúdo do arquivo:
```bash
$ cat file4.txt
file content
New content
```

Adicionando uma linha pra arrumar depois:
```bash
$ echo "New linne" >> file4.txt 
```

```bash
$ cat file4.txt                
file content
New content
New linne
```

Efetuando commit:
```bash
$ git add . 

$ git commit -m "adiciona nova linha"  
```

Arrumando `New linne`
```bash
$ nano file4.txt    
```
Trocando `New linne` para `New line`
```bash
  GNU nano 2.0.6              File: file4.txt                         Modified  

file content
New content
New line

                                [ Read 3 lines ]
^G Get Help  ^O WriteOut  ^R Read File ^Y Prev Page ^K Cut Text  ^C Cur Pos
^X Exit      ^J Justify   ^W Where Is  ^V Next Page ^U UnCut Text^T To Spell
```

`CRTL O` pra salvar
`ENTER` pra confirmar
`CTRL X` pra sair


```bash
$ cat file4.txt                
file content
New content
New line
```

Subscrevendo o commit anterior:
```bash
$ git add .

$ git commit -m "adiciona nova linha" --amend
```

```bash
$ git log --oneline
```
Após o comando acima, conseguimos ver que existe apenas um commit com a mensagem `adiciona nova linha`:
```bash
a80b808 (HEAD -> master) adiciona nova linha
be2c14b adiciona o arquivo file4
79091da adiciona gitignore
443f35b adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.
051e33b cria arquivo vazio de testes
(END)
```

#### Desfazendo o último commit (--soft) <a name="git-reset-soft"></a>


```bash
$ git log
```
Podemos ver que o último commit foi o `adiciona nova linha` e antes o commit `adiciona o arquivo file4`
```bash
commit a80b808bd012d16a4a9fc426207e201b7ac4987e (HEAD -> master)
Author: Maiqui Pirolli Tomé <maiquitome@gmail.com>
Date:   Sat Mar 12 13:56:10 2022 -0300

    adiciona nova linha

commit be2c14b0e37a455b6eb689f956949af33aef2068
Author: Maiqui Pirolli Tomé <maiquitome@gmail.com>
Date:   Sat Mar 12 13:12:39 2022 -0300

    adiciona o arquivo file4

commit 79091dabdcdfc48d860c796ee1d003755c78e76d
Author: Maiqui Pirolli Tomé <maiquitome@gmail.com>
Date:   Sat Mar 12 13:02:14 2022 -0300

    adiciona gitignore

commit 443f35bbccda20cb8fd52681e027f52a2e8c7eb5
Author: Maiqui Pirolli Tomé <maiquitome@gmail.com>
Date:   Sat Mar 12 11:33:22 2022 -0300

    adiciona file2.txt e file3.txt vazios para testes de commit com mensagem lon:
```

Não temos nenhum arquivo para ser feito o commit.
```bash
$ git status
On branch master
nothing to commit, working tree clean
```

Para desfazer o último commit:
```bash
$ git reset HEAD~1 --soft
```

Após o `~` eu posso informar o número de commits que eu quero desfazer.

O comando `--soft` informa pra voltar o arquivo pra `Staging Area` pois eu ainda quero utilizá-lo.

Podemos ver que o commit mais recente foi desfeito, e o arquivo voltou para a `Staging Area`.

```bash
$ git log --oneline
```
```bash
be2c14b (HEAD -> master) adiciona o arquivo file4
79091da adiciona gitignore
443f35b adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.
051e33b cria arquivo vazio de testes
(END)
```

```bash
$ git status             
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   file4.txt
```



#### Desfazendo o último commit (--hard) <a name="git-reset-hard"></a>



Fazendo o commit novamente do `file4.txt`:
```bash
$ git commit -m "aprimora file4"       
```
```bash
$ git log --oneline
```
```bash
f30b8c4 (HEAD -> master) aprimora file4
be2c14b adiciona o arquivo file4
79091da adiciona gitignore
443f35b adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.
051e33b cria arquivo vazio de testes
(END)
```

```bash
$ git reset HEAD~1 --hard
```

```bash
$ git log --oneline
```
```bash
be2c14b (HEAD -> master) adiciona o arquivo file4
79091da adiciona gitignore
443f35b adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.
051e33b cria arquivo vazio de testes
(END)
```

A opção `--hard` desfaz as mudanças.
```bash
$ cat file4.txt
file content
```

O arquivo não volta para a `Staging Area`:
```bash
$ git status       
On branch master
nothing to commit, working tree clean
```


#### Descartando alterações <a name="git-checkout"></a>


```bash
$ echo "content" >> file4.txt
```
```bash
$ git status                 
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   file4.txt

no changes added to commit (use "git add" and/or "git commit -a")
```

```bash
$ cat file4.txt
file content
content
```

Descartar essa alteração (removendo a linha 2):
```bash
$ git checkout file4.txt
```

```bash
$ cat file4.txt         
file content
```

```bash
$ git status            
On branch master
nothing to commit, working tree clean
```

Para descartar alterações de todos os arquivos modificados:
```bash
$ git checkout .
```



#### Adicionando arquivo deletado na `Staging Area` <a name="git-rm"></a>



Deletando o arquivo `file.txt`
```bash
$ rm -rf file.txt
```

```bash
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	deleted:    file.txt

no changes added to commit (use "git add" and/or "git commit -a")
```

```bash
$ git rm file.txt    
```

```bash
$ git status     
On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	deleted:    file.txt
```

```bash
$ git commit -m "remove arquivo file"
```

```bash
$ git status                         
On branch master
nothing to commit, working tree clean
```



#### Tag <a name="git-tag"></a>



Criando um rótulo:
```bash
$ git tag v1.0.0
```

```bash
$ git log --oneline
```
```bash
$ bd318ba (HEAD -> master, tag: v1.0.0) remove arquivo file
be2c14b adiciona o arquivo file4
79091da adiciona gitignore
443f35b adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.
051e33b cria arquivo vazio de testes
(END)
```

Criando mais arquivos:

```bash
$ touch file5.txt 

$ git add .

$ git commit -m "adiciona file5.txt"
```

```bash
$ touch file6.txt 

$ git add .

$ git commit -m "adiciona file6.txt"
```

```bash
$ git log --oneline
```
```bash
1f353ef (HEAD -> master) adiciona file6.txt
eaf4c1a adiciona file5.txt
bd318ba (tag: v1.0.0) remove arquivo file
be2c14b adiciona o arquivo file4
79091da adiciona gitignore
443f35b adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.
051e33b cria arquivo vazio de testes
(END)
```

Voltando para a tag v1.0.0
```bash
$ git checkout v1.0.0
```

```bash
$ git log --oneline
```
```bash
bd318ba (HEAD, tag: v1.0.0) remove arquivo file
be2c14b adiciona o arquivo file4
79091da adiciona gitignore
443f35b adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.
051e33b cria arquivo vazio de testes
(END)
```

Voltando para a `master`:
```bash
$ git checkout master
```

```bash
$ git log --oneline
```
```bash
1f353ef (HEAD -> master) adiciona file6.txt
eaf4c1a adiciona file5.txt
bd318ba (tag: v1.0.0) remove arquivo file
be2c14b adiciona o arquivo file4
79091da adiciona gitignore
443f35b adiciona file2.txt e file3.txt vazios para testes de commit com mensagem longa.
051e33b cria arquivo vazio de testes
(END)
```




#### Detalhando um commit: Show <a name="git-show"></a>




Detalhando o primeiro commit:
```bash
$ git show 051e33b
```

```bash
commit 051e33bae593fde6c9b9e45ee4d2c0e1f8d19ace
Author: Maiqui Pirolli Tomé <maiquitome@gmail.com>
Date:   Sat Mar 12 11:03:27 2022 -0300

    cria arquivo vazio de testes

diff --git a/file.txt b/file.txt
new file mode 100644
index 0000000..e69de29
(END)
```