Git, o básico que vai fazer você parecer um mestre
Recomendo copiar esse conteudo e usar ele como consulta
Gerenciamento de Versão :
Major.Minor.Patch
Incremento | Descrição |
---|---|
Major | Quebra de funcionalidade |
Minor | Nova Feature |
Patch | Concerto+Qualquer outra coisa |
Comandos Basicos
Iniciar Repositorio
git init
Checa o status do projeto, o que foi e não foi modificado e o status dos arquivos que estão sendo observados
git status
Para ver as mensagens de commits
git log
Mostra um registro de todas as mudanças feitas para o cabeçalho repositorio local
git reflog
Operações com Arquivos
Adicionar uma Arquivo
git add "nome_do_arquivo"
Adicionar todos os Arquivos
git add .
Para mover ou renomear arquivo
git mv <old_file> <new_file>
Para recuperar alterações de um arquivo, ou versões passadas dele, use: você pode conseguir esse número usando "git log"
git checkout "numero_da_modificação" -- "nome_do_arquivo"
Commit
Adicionar uma mensagem ao commit
git commit -m "mensagem"
Para modificar a mensagem do ultimo commit, ele cria um novo commit que subistitui o antigo commit (Fique atento pra não aplicar em commit que já foram dado push):
git commit "mensagem" --amend
Para modificar o conteudo do ultimo commit, adicionando novo conteudo, mas ele cria um novo commit que subistitui o antigo commit (Fique atento pra não aplicar em commit que já foram dado push):
git commit --amend --no-edit
Criar um commit que desfaz um commit anterior
git revert "commit_id"
Diff
Para mostrar as diferenças
git diff
Para mostrar a diferenã entre dois commits
git diff <commit_id1>..<commit_id2>
Show
E para só ver a ultima modificação use:
git show
Para ver as modificações feitas em um arquivo, use:
git show "numero_da_modificaçãos"
Remover
Para remover o arquivo da arvore de trabalho
git rm "nome_do_arq"
Para remover um arquivo que foi removido mas ainda está operando
git rm --cached <file_name>
Remover pasta do projeto git
git rm -rf --cached folder1/
Clean
Serve para limpar o repositorio dos varios arquivos que um build ou coisa do tipo podem criar:
O paretro -n irá mostrar os arquivos que vão ser apagados O paretro -f irá de fato apagar os arquivos
git clean -n
git clean -f
Observar arquivo
Para assumir que um arquivo não é modificado
git update-index --assume-unchanged "arquivo"
Para voltar a monitorar modificações
git update-index --no-assume-unchanged "arquivo"
Reset
Para remover uma arquivo que sem querer foi dado
add
nele
git reset -- Nome_do_arquivo
Discartar todas as alterações já feitas e mover o cabeçalho para um commit especifico
git reset --hard <commit_id>
Move o cabeçalho para um commit especifico mas preserva as mudanças feitas
git reset --soft <commit_id>
Move o cabeçalho para um numero de commits atras, mas preservando as mudanças feitas
git reset --soft <commit_id> HEAD~int
Tag
Lista todas as tags do projeto
git tag
Cria uma tag apontando pro ultimo commit feito
git tag nome_tag
git tag nome_tag -m "mensagem que acompanha a tag"
Lista todas as tags e suas descrições
git tag -n
Pra mandar um tag pro repositorio usa:
git push origin nome_tag
# manga todas as tags
git push origin --tag
Branchs
Para ver todas as branch que existem no projeto, use:
git branch
Para criar ramificações(branchs) do código, use:
git branch "nome_da_branch_nova"
Para deletar uma branch, use:
git branch -D "nome_da_branch"
Para deletar branch remoto
git push origin -d "nome_da_branch"
Para listar todas as branchs remotas
git branch -r
Para mudar da branch principal para outra, use:
git checkout "nome_da_branch"
Para unir o conteudo das branch, use:
git merge "nome_da_branch"
Cancelar o marge em caso de conflito
git merge --abort
Operações de Repositorios Remotos
Para listar os repositorios remotos
git remote
Para adicionar um repositorio remoto
git remote add "nome" "url"
Para mandar o repositório para o github, use:
git push
Caso seja a primeira vez que manda algo para o repositório, use:
git push -u origin master
Para clonar um projeto já iniciado, use:
git clone "url_do_repositório"
Para trazer as alterações do repositório para o projeto, use:
git pull
para trazer as alterações do repositorio, mas os commits que form pegos do repositorio vão estar sendo colocados na fila, atras dos meu no repo local
git pull --rebase
Para poder fazer um rebase, mas sem a necessidade de comitar o que você fez até o momento, você pode fazer o stash, que guarda em separado suas auteraçoes, para que você possa depois de fazer o rebase, aplicar elas denovo
# Remove e guarda as alterações já feitas
git stash
# Lista as alterações armazenadas
git stash list
# Reaplica as ultimas alterações guardas no stash
git stash pop
Para trazer as alterações do repositório para o projeto, use:
git pull <remote_name> <remote_branch>
Contribuição, Gitflow
-
pra resolver problemas é criado uma branch
-
Pode se separar o git flow em 2 tipos de branchs
- Branches principais
- Master
- Developer
- Branches de Suporte
- Feature
- Release
- Hotfix
Aplicação
-
Master: é usada para mandar os commit dos release para produção
-
Develop: é criada apartir da Maste e conterá as fetures estaveis que seram mergeadas em uma branche de release
-
Features: É criada através da Develop
-
Nomeação de branch
feature/nova-feature
Ciclo de vida
Feature
Master[1.0] -> Develop -> Feature -> Develop -> Release -> Master[2.0]
Hotfix
Master[2.0] -> Hotfix -> Master[2.1]
Uso
Para iniciar o uso de gitflow
git flow init
Depois você nomeia as branches Para adicionar feature
git flow feature start nova-funcao
Para fazer o merge na develop
git flow feature finish sum
Para fazer uma release
git flow release start 0.1.0
Para mandar a release para a master
git flow release finish 0.1.0
EDIT
Me chamaram a atenção pra uma parada que eu acabei deixando passa quando tava escreverndo esse arquigo, os comando relacionados a commit
em especial os que modificam commits previos, só recomento usar se os commits em questão não foram mandados pro remoto, pos se for o caso, na hora de enviar o commit modificado, ocorrerá um problema visto que o commit foi sobre escrito pelo novo com as modificações.
Uma solução pra isso, é na hora do push, usar a flag -f
, mas não recomendo, a não ser que você seja a unica pessoa mexendo na branch em questão e isso não vá afetar outros membros do seu time (Mas não recomento). Ou você tenha plena confiança que é o certo a se fazer
Para modificar o conteudo do ultimo commit, adicionando novo conteudo, mas sem ter que criar um novo commit:
git commit --amend --no-edit
Só um detalhe importante: git commit --amend
sempre cria um novo commit (ok, quase sempre, mais detalhes abaixo).
Inclusive, isso está descrito na documentação oficial:
--amend
Replace the tip of the current branch by creating a new commit.
Dá pra confirmar com um teste rápido. Suponha que meu commit mais recente é esse:
$ git log --format=fuller -1
commit cc5079bdfbefa1e465caaeeb3ea4cec79922afba (HEAD -> test)
Author: Fulano <fulano@mail.com>
AuthorDate: 2024-10-21 14:10:58
Commit: Fulano <fulano@mail.com>
CommitDate: 2024-10-21 14:10:58
teste
Usei o formato fuller
para que ele mostre o CommitDate
, em breve entenderemos o motivo.
Em seguida rodei git commit --amend --no-edit
, e podemos ver que ele criou outro commit:
$ git log --format=fuller -1
commit 9f4cc75088848b36783b8affd7cb02324dc4d77d (HEAD -> test)
Author: Fulano <fulano@mail.com>
AuthorDate: 2024-10-21 14:10:58
Commit: Fulano <fulano@mail.com>
CommitDate: 2024-10-21 14:12:01
teste
Repare que o hash mudou de cc5079bdfbefa1e465caaeeb3ea4cec79922afba
para 9f4cc75088848b36783b8affd7cb02324dc4d77d
, ou seja, é outro commit. Isso porque, se qualquer informação do commit mudar, então o hash também muda, e portanto é outro commit. E neste caso a informação que mudou é o CommitDate
(embora o AuthorDate
continue igual - entenda a diferença aqui).
Ou seja, embora tenha o mesmo comentário, mesmo autor, mesmo conteúdo, etc; como uma das informações mudou, então foi criado outro commit. Portanto fique atento caso vc vá fazer amend
em um commit que já foi enviado para o repositório remoto (ou seja, ele já foi enviado em um git push
). Isso é inclusive citado no livro oficial:
You need to be careful with this technique because amending changes the SHA-1 of the commit. It’s like a very small rebase — don’t amend your last commit if you’ve already pushed it.
Eu disse anteriormente que --amend
quase sempre cria um novo commit. O único caso em que ele não criaria um novo commit é se todas as informações forem iguais.
E tecnicamente é possível fazer o amend
usando as mesmas datas.
Por exemplo, se eu tiver este commit:
$ git log --format=fuller -1
commit 430b1d3a14b8b80aaeadabbd2e645c0699f38f71 (HEAD -> test)
Author: Fulano <fulano@mail.com>
AuthorDate: 2024-10-21 14:22:05
Commit: Fulano <fulano@mail.com>
CommitDate: 2024-10-21 14:22:05
teste
E rodar o comando usando as mesmas datas (assumindo que não fiz nenhuma outra alteração):
GIT_COMMITTER_DATE="2024-10-21 14:22:05" git commit --amend --no-edit --date="2024-10-21 14:22:05"
No fim terei "o mesmo commit", ou seja, git log --format=fuller -1
mostrará exatamente o mesmo commit com as mesmas datas.
Lembrando que isso só valerá se eu não mudar nenhuma das outras informações (como a mensagem de commit, author, alterações feitas, etc). Mas como na prática é raro as pessoas se preocuparem em manter a mesma data (e o git log
por padrão só mostra o AuthorDate
, que não é alterado com o amend
, ou seja, dará a impressão que "é o mesmo commit, já que tem a mesma data"), então faz sentido trabalhar com a premissa de que sempre será gerado um novo commit.
Mas se ele cria um novo commit, o que acontece com o anterior? Bem, ele fica "perdido" (o nome técnico é "dangling commit"). Mas vc não precisa se preocupar com ele, pois uma hora o Git irá limpá-lo automaticamente.
Usar o Rebase
Ali do Rebase quando você que juntar 2 commits ou mais:
pode fazer assim git rebase i- HEAD~2
Vai abrir no seu terminal assim:
pick 4d57c88 commit 1 pick a9d9034 commit 2
Você usa o s significa squash:
pick 4d57c88 commit 1 s a9d9034 commit 2
Depois você so renomeia a mensagem do commit This is a combination of 2 commits.
juntar commit 1 + commit 2
Depois você faz o fluxo normal do push
Excelente guia meu colega! Realmente achei muito últil todas essas operações do git, principalmente a de reverter mensagens de commits e até mesmo o conteúdo do mesmo. Parabéns pela iniciativa e pelo valor agregado a comunidade!
Só tenho uma resposta pra essa publicação: git show! 😊 Parabéns! Muito relevante e útil!
Git log
Gosto muito de usar o git log -S :string:
para procurar um nome de variável e descobrir quantos commits fizeram uma alteração nessa string.
Git reset
Também acho útil o git reset --
para tirar todas as alterações que estão em stage.
Título do artigo enganou, tem nada de básico isso aí. Curti o lance de observar ou parar de observar arquivos, achei que dava de fazer só com gitignore.
SALVANDO JÁ nos favoritos <3