Git Commands

Published: 2019-08-04, Updated: 2023-03-04

Links

Tags

Deletar no remote, todas as tags que estão no remote (nao no git local)

git ls-remote --tags origin | awk '{ print $2}' | awk -F "/" '{print $3}' | sort -r | xargs -n 1 git push --delete origin

pegar ultima tag criada

TAG=$(git describe --abbrev=0 --tags)

Listar tags por data decrescente

git log --tags --simplify-by-decoration --pretty="format:%ai %d"

Prune

Deletar arquivos grandes do repo

$ curl -L https://repo1.maven.org/maven2/com/madgag/bfg/1.14.0/bfg-1.14.0.jar > /opt/bfg.jar
$ java -jar /opt/bfg.jar --strip-blobs-bigger-than 100M ./
$ git reflog expire --expire=now --all && git gc --prune=now --aggressive

Ignorando arquivos no repo local sem .gitignore

Ignorar arquivo para commit

git update-index --skip-worktree

Deixar de ignorar arquivo ( not uptodate. Cannot merge.)

git update-index --no-skip-worktree

Tipos de bases do git

git checkout refs/
		refs/tags
		refs/remotes
		refs/heads(branches)

Como deletar uma tag no repositório

git push origin :refs/tags/release01

Pegar lista de arquivos do repositório

git ls-tree --full-tree -r HEAD

Lembrar a senha do https

git config --global credential.helper store

Deletar todas as tags

git tag | xargs git tag -d

Mudar tamanho do tab (tabsize)

set ?ts=2 or ?ts=4 on end of url file

Isolar alterações locais

Você alterou um ou mais arquivos e não quer que eles apareçam no status para serem commitados

Salvar alterações para não serem subidas

$ git stash save "configuracoes locais para eclipse"
HEAD is now at d670af6 voltando ao properties original do andrey

Listando os stashs feitos

$ git stash list
stash@{0}: On FKF-31: configuracoes locais para eclipse
$ git status
On branch FKF-31
nothing to commit, working directory clean

Voltando a alteração para o versionamento

$ git stash pop stash@{0}

subir passar apenas um commit para a branch

git branch onecommit
git checkout onecommit
git cherry-pick 7300a6130d9447e18a931e898b64eefedea19544 #### From the other branch
git push origin {branch}

matar tudo que está na branch e pegar do remoto

git fetch --all
git reset --hard origin/master

Git diff

Merge em three-way

Desabilitar backups

git config --global mergetool.keepBackup false

Alterar um comentário no histórico

git rebase --interactive -p um-commit-antes-do-desejado
#### depois só ir dando `git rebase --skip`
#### algumas coisas vai ter que fazer merge mas o -p minimiza isso

Remover arquivo do stage

Apenas para tirar da lista para ser comitado

git reset HEAD nomeArquivo

Desfazendo as alteracoes de uma arquivo

git checkout -- filename #### ou
git checkout HEAD^ filename

criar branch vazia

git checkout --orphan <branchname>

senhas HTTPS

Setar tempo da cache da senha

git config --global credential.helper 'cache --timeout=3600' #### uma hora

Onde ficam os passwords salvos do HTTPS

~/.git-credentials

Mudar o autor do commit

Rode o script (tem que ser feito em cada branch)

sh git-author-rewrite.sh 

Se precisar rodar denovo (para outra branch por exemplo) apague a pasta de backup

rm -rf .git/refs/original/

Faça push de cada branch

git push -f

Faça push das tags (só precisa ser feito uma vez, diferente das branchs que devem ser feitas uma cada)

git push --tags -f

Outro script que parece que funcionou melhor

$ git filter-branch -f --env-filter '
    if [ "$GIT_AUTHOR_EMAIL" = "elvisefs@br.ibm.com" ]; then \
        export GIT_AUTHOR_NAME="Elvis de Freitas" GIT_AUTHOR_EMAIL="edigitalb@gmail.com"; \
    fi
    '

enviar todas as branches de um remote para o outro

git push novoRemote refs/remotes/antigoRemote/*:refs/heads/*

Listar remotes

git remote -v

Submodules

adicionando um submodule

git submodule add git@mygithost:billboard lib/billboard

ou mexa no .gitmodules

[submodule "lib/billboard"]
path = lib/billboard
url = git@mygithost:billboard

Clonar um repositório que tem submodules já baixando todos os módules

Cloning repo

$ git clone https://github.com/mageddo/my-project.git
$ cd my-project/

Initializing and download all submodules setup at .gitmodules

$ git submodule init
$ git submodule update # ou git submodule update --init --recursive

Mudar a url de um modulo

Mude no .gitmodules e rode git submodule sync para atualizar as URLs

Fazer pull do repositório root já forçando que os submodules peguem a versão setada no root

git pull
git submodule update

mesmo que o submodule esteja com codigo modificado esse ultimo comando vai fazer checkout no commit setado no projeto root deixando asssim no mesmo estado, mas os arquivos editados ainda ficam alterados aguardando para serem comitados

para saber de dentro do projeto root se os submodules estão com modificacoes sem commit basta rodar git status como no exemplo abaixo:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
  (commit or discard the untracked or modified content in submodules)

	modified:   my-project-module-1 (modified content, untracked content)

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

Outros

Exemplo de como configurar git com duas contas no mesmo host

$ cat ~/.ssh/config 
Host github.com
	HostName github.com
	Port 22
	User mageddo
	IdentityFile ~/.ssh/github


Host bitbucket-mageddo
	HostName bitbucket.org
	User git
	IdentityFile ~/.ssh/bitbucket-mageddo

Host bitbucket.org
	HostName bitbucket.org
	User git
	IdentityFile ~/.ssh/bitbucket

Git diff

$ git diff feature master --name-status 
Mostra as diferencas do master para o meu

Pegar as configurações do repositório

$ git config --list

Reescrever arquivos no histórico

$ git filter-branch --tree-filter "find . -name '*.php' -exec sed -i -e \
's/originalpassword/newpassword/g' {} \;"

Para buscar e substituir em qualquer arquivo (ignorando a extensão)

$ git filter-branch -f --tree-filter "find . -type f -exec sed -i -e
's/5172net/mypassword/g' {} ;"

Listar alterações em uma linha específica

git blame -L250,265 fileName

logar com data autor mensagem e commit hash

git log --abbrev-commit --oneline --pretty="%h %ci %an %s\n"  
/repo/xpto/WithdrawBatchServiceImpl.java

Desfazer um commit mantendo o histórico

Descartar mudanças no arquivo

git checkout filename

Deletar todos os commits e criar uma branch sem nenhum commit

$ git checkout --orphan latest_branch
$ git add -A
$ git commit -am "commit message"
$ git branch -D master
$ git branch -m master

Remover arquivos em que nao foi dado git add

remover untracked files

$ git clean -f -n
$ git clean -f

Log das alteracoes que fazem match

git log -p -G '^Minha Regex$' x.java

Recuperar Um arquivo do git

git show HEAD~4:index.html > local_file

Mergiar ignorando o meu

git merge -X theirs origin/master

Mostrar apenas o texto que foi alterado

git diff --word-diff=color

Checar se a tag ainda existe

APP_VERSION=1.0.0
if git rev-parse "$APP_VERSION^{}" >/dev/null 2>&1; then
	echo "> Version already exists $APP_VERSION"
	exit 3
fi

Configurar a quebra de linha corretamente / linebreak

.gitattributes

* text eol=lf
*.bat text eol=crlf

*.so binary
*.dll binary
*.exe binary

*.png binary
*.jpg binary
*.gif binary

*.jar binary
*.7z binary
*.tar binary
*.tar.gz binary
*.tgz binary
*.zip binary

Contar commits

git rev-list HEAD --count

Github no modo 2FA

Nesse modo quando voce for fazer push via terminal vai precisar passar o personal token gerado nessa url

Como fazer revert

Revertendo um commit

Isso vai desfazer exatamente o que foi feito nesse commit, ou seja tirar a segunda linha do arquivo que tinha sido adicionada, não vai reverter os commits seguidos

$ git revert 765321fdff6a5d6829d86f67bef3a2d9c7c5846f

Revertendo todos os commits num range

Isso vai reverter tudo que foi feito do commit a até o B de forma inclusiva

$ git revert -n 765321fdff6a5d6829d86f67bef3a2d9c7c5846f^..627fd0df953689bbde98024be30851152ea54ed5

git status
On branch master
You are currently reverting commit 765321f.
  (all conflicts fixed: run "git revert --continue")
  (use "git revert --abort" to cancel the revert operation)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   v1.txt
	deleted:    v3.txt

Histórico

commit 627fd0df953689bbde98024be30851152ea54ed5
Author: Elvis de Freitas <edigitalb@gmail.com>
Date:   Thu Oct 21 10:25:48 2021 -0300

    third commit

diff --git a/v3.txt b/v3.txt
new file mode 100644
index 0000000..29ef827
--- /dev/null
+++ b/v3.txt
@@ -0,0 +1 @@
+v3

commit 765321fdff6a5d6829d86f67bef3a2d9c7c5846f
Author: Elvis de Freitas <edigitalb@gmail.com>
Date:   Thu Oct 21 10:25:24 2021 -0300

    second commit

diff --git a/v1.txt b/v1.txt
index 626799f..8d3ac76 100644
--- a/v1.txt
+++ b/v1.txt
@@ -1 +1,2 @@
 v1
+commit 2

commit 203465d02e0228dfd9317d997cf418f33863c211
Author: Elvis de Freitas <edigitalb@gmail.com>
Date:   Thu Oct 21 10:25:08 2021 -0300

    creating v1 file

diff --git a/v1.txt b/v1.txt
new file mode 100644
index 0000000..626799f
--- /dev/null
+++ b/v1.txt
@@ -0,0 +1 @@
+v1

Exportar zip

git archive master  --format=zip -o cnab-itau.zip

Comparar Branch com Tag

git diff refs/heads/feat/fruit refs/tags/feat/fruit

Linkar o push de uma branch com um remote

git push --set-upstream origin xpto

Configurar o storage no git-credentials no windows

$ git config --global credential.helper "store --file=$HOME/.git-credentials"


Lubuntu Commands Remover todas as propriedades das tags

Comments