95 pontos por xguru 2025-02-26 | 7 comentários | Compartilhar no WhatsApp
  • Scott Chacon, autor de "Pro Git", explica algumas configurações de Git que ele ativou globalmente e por quê
  • Muitas dessas configurações foram aprendidas, na prática, com desenvolvedores que trabalham no próprio código-fonte core do Git
  • Abaixo estão configurações do ~/.gitconfig que tornam o Git melhor
    [column]  
    ui = auto  
    [branch]  
    sort = -committerdate  
    [tag]  
    sort = version:refname  
    [init]  
    defaultBranch = main  
    [diff]  
    algorithm = histogram  
    colorMoved = plain  
    mnemonicPrefix = true  
    renames = true  
    [push]  
    default = simple  
    autoSetupRemote = true  
    followTags = true  
    [fetch]  
    prune = true  
    pruneTags = true  
    all = true  
    
    # Por que não usar?  
    
    [help]  
    autocorrect = prompt  
    [commit]  
    verbose = true  
    [rerere]  
    enabled = true  
    autoupdate = true  
    [core]  
    excludesfile = ~/.gitignore  
    [rebase]  
    autoSquash = true  
    autoStash = true  
    updateRefs = true  
    
    # Configurações por preferência pessoal (descomente e use se necessário)  
    
    [core]  
    # fsmonitor = true  
    # untrackedCache = true  
    [merge]  
    # (se a versão do Git for anterior à 2.3, use `diff3`)  
    # conflictstyle = zdiff3  
    [pull]  
    # rebase = true  
    

Como os desenvolvedores core do Git configuram o Git?

  • Na mailing list do Git, Felipe Contreras chegou a sugerir que a equipe core removesse todas as configurações e aliases e tentasse usar o Git padrão
  • Como resultado desse experimento, 9 configurações e 3 aliases foram propostos como novos padrões
    merge.conflictstyle = zdiff3  
    rebase.autosquash = true  
    rebase.autostash = true   
    commit.verbose = true  
    diff.colorMoved = true  
    diff.algorithm = histogram  
    grep.patternType = perl  
    feature.experimental = true  
    branch.sort = committerdate  
    
  • Essas configurações ainda não foram adotadas como padrão
  • Ainda assim, é interessante que muitos desenvolvedores do Git tenham dificuldade para usá-lo sem ativar algumas delas
  • Mais interessante ainda é que a maioria de vocês provavelmente não faz ideia do que isso significa
  • A explicação será dividida em três categorias
    • O que claramente deixa o Git melhor (Clearly Makes Git Better)
    • Por que diabos não? (Why the Hell Not?)
    • Uma questão de gosto (A Matter of Taste)

# O que claramente deixa o Git melhor

Ordenação da lista de branches

  • Por padrão, o Git ordena as branches em ordem alfabética, mas pode ser mais útil ordená-las pela data do commit mais recente
  • Com as configurações abaixo, as branches são ordenadas pelos commits mais recentes e exibidas em formato de colunas
    git config --global column.ui auto  
    git config --global branch.sort -committerdate  
    

Ordenação da lista de tags

  • Para ordenar tags por versão em vez de ordem alfabética, use a configuração abaixo
    git config --global tag.sort version:refname  
    

Definição do nome da branch padrão

  • Para definir o nome da branch padrão ao inicializar um novo repositório, configure assim
    git config --global init.defaultBranch main  
    

Configurações de diff aprimoradas

  • Altera o algoritmo de diff padrão para histogram, permitindo comparações mais precisas
  • Para detectar trechos de código movidos e destacá-los com cor, adicione estas configurações
    git config --global diff.algorithm histogram  
    git config --global diff.colorMoved plain  
    git config --global diff.mnemonicPrefix true  
    git config --global diff.renames true  
    

Configurações de push aprimoradas

  • As configurações abaixo melhoram o comportamento do push
    git config --global push.default simple  
    git config --global push.autoSetupRemote true  
    git config --global push.followTags true  
    

Configurações de fetch aprimoradas

  • Para remover automaticamente branches e tags desnecessárias ao fazer fetch, use as configurações abaixo
    git config --global fetch.prune true  
    git config --global fetch.pruneTags true  
    git config --global fetch.all true  
    

# Por que diabos não?

Prompt de correção automática

  • Para detectar erros de digitação ao inserir comandos e sugerir correções, use
    git config --global help.autocorrect prompt  
    

Diff ao fazer commit

  • Para exibir junto as mudanças ao escrever a mensagem de commit, adicione esta configuração
    git config --global commit.verbose true  
    

Reutilização da resolução de conflitos

  • Para reutilizar automaticamente resoluções de conflitos anteriores, use as configurações abaixo
    git config --global rerere.enabled true  
    git config --global rerere.autoupdate true  
    

Configuração de arquivo .gitignore global

  • Para definir arquivos ignorados globalmente, configure assim
    git config --global core.excludesfile ~/.gitignore  
    

Melhoria das configurações de rebase

  • Para executar squash e stash automaticamente durante o rebase, use as configurações abaixo
    git config --global rebase.autoSquash true  
    git config --global rebase.autoStash true  
    git config --global rebase.updateRefs true  
    

# Uma questão de gosto

Exibição aprimorada de conflitos de merge

  • Para mostrar também a versão base durante conflitos de merge, considere esta configuração
    git config --global merge.conflictstyle zdiff3  
    

Usar rebase no pull

  • Para executar rebase automaticamente ao usar git pull, configure assim
    git config --global pull.rebase true  
    

Melhorar a velocidade de detecção de alterações em arquivos

  • Para melhorar o desempenho de comandos como git status, você pode usar estas configurações
    git config --global core.fsmonitor true  
    git config --global core.untrackedCache true  
    

# Conclusão

  • Com essas configurações, é possível usar o Git de forma mais prática, e algumas delas são usadas ativamente até pelos desenvolvedores core
  • Ao otimizar a configuração do Git, você pode melhorar seu fluxo de trabalho e usá-lo com mais eficiência

7 comentários

 
brainypooh 2025-02-28

"O mais interessante é que a maioria de vocês não faz a menor ideia do que isso significa" foi bem certeiro. 😨😨😨

 
tested 2025-02-27

É -global e não --global?

 
xguru 2025-02-27

É --global. Houve um engano ao copiar e colar. Já foi corrigido.

 
ilikeall 2025-02-26

A reutilização da resolução de conflitos é ótima.

 
tujuc 2025-02-26

Quando vou ver diff, uso o git-delta para visualizar no formato TUI.

  10   │ [core]  
  11   │     pager = delta  
  12   │ [interactive]  
  13   │     diffFilter = delta --color-only  
  14   │ [delta]  
  15   │     line-numbers = true  
  16   │     side-by-side = true  
  17   │     navigate = true  
  18   │     diff-so-fancy = true  
  19   │     hyperlinks = true  

Se não quiser esquentar muito a cabeça, dá para usar o tig... hahaha
Será que existe algo melhor...?

 
GN⁺ 2025-02-26

Comentários do Hacker News

  • Meu alias favorito é git out. Ele lista todos os commits que ainda não foram enviados com push. Uso o tempo todo
    [alias]   
      out = "log @{u}.."   
    
  • Enquanto muita gente pensa no próprio ~/.gitconfig, recomendo fortemente o delta como companheiro para a CLI do git
  • Meu ~/.gitconfig é assim
    [alias]  
      co = checkout  
      ci = commit  
      st = status  
      br = branch  
      hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short  
      type = cat-file -t  
      dump = cat-file -p  
      dft = difftool  
    [tag]  
      sort = version:refname  
    [tar "tar.xz"]  
      command = xz -c  
    [tar "tar.zst"]  
      command = zstd -T0 -c  
    [log]  
      date = iso-local  
    [pull]  
      ff = only  
    [diff]  
      tool = difftastic  
    [safe]  
      directory = *  
    [advice]  
      detachedHead = false  
    [init]  
      defaultBranch = master  
    
  • Fico me perguntando por que assinatura de commit não foi incluída nessa configuração. Dá para fazer isso facilmente com chaves SSH modernas
    [user]  
      name = xyz  
      email = xyz@domain.com  
      signingkey = ~/.ssh/id_algorithm.pub  
    
    [commit]  
      gpgsign = true  
    [tag]  
      gpgsign = true  
    
    [gpg]  
      format = ssh  
    
    # restrict allowed signers  
    # echo "$(git config --get user.email) namespaces=\"git\" $(cat ~/.ssh/id_*.pub)" >> ~/.git_allowed_signers  
    [gpg "ssh"]  
      allowedSignersFile = ~/git_allowed_signers  
    
    • No GitHub, dá para adicionar a chave SSH tanto para autenticação quanto para assinatura. É preciso adicionar duas vezes, mas, depois de configurar uma vez, dá para remover o rótulo "unverified" dos commits
  • Opções de configuração populares do Git por Julia Evans
  • Algumas opções extras de que gosto
    [apply]  
      # Remove trailing whitespaces  
      whitespace = fix  
    [color "diff"]  
      whitespace = red reverse  
    [diff]  
      colorMovedWS = allow-indentation-change  
    [format]  
      pretty = fuller  
    [log]  
      date = iso  
    [pull]  
      ff = only  
    
  • Minhas configurações estão aqui. Basicamente já estava tudo configurado (tirando a UI em colunas). Provavelmente porque li bons textos do Scott e de outras pessoas
  • Concordo com a recomendação de usar (z)diff3. O artigo subestima a importância disso. Diff em três vias permite resolver conflitos que são impossíveis com o estilo padrão
  • Descobri que dá para configurar o git para usar o pager de sua preferência. Então configurei com bat