95 puntos por xguru 2025-02-26 | 7 comentarios | Compartir por WhatsApp
  • Scott Chacon, autor de "Pro Git", explica varias configuraciones de Git que tiene activadas globalmente y por qué las usa
  • Muchas de esas configuraciones las aprendió de desarrolladores que realmente trabajan en el codebase central de Git
  • A continuación, una configuración de ~/.gitconfig que hace que Git sea mejor
    [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 qué no usarlo?  
    
    [help]  
    autocorrect = prompt  
    [commit]  
    verbose = true  
    [rerere]  
    enabled = true  
    autoupdate = true  
    [core]  
    excludesfile = ~/.gitignore  
    [rebase]  
    autoSquash = true  
    autoStash = true  
    updateRefs = true  
    
    # Configuraciones según preferencia personal (descoméntalas y úsalas si las necesitas)  
    
    [core]  
    # fsmonitor = true  
    # untrackedCache = true  
    [merge]  
    # (si tu versión de Git es anterior a la 2.3, usa 'diff3')  
    # conflictstyle = zdiff3  
    [pull]  
    # rebase = true  
    

¿Cómo configuran Git los desarrolladores del núcleo de Git?

  • En la lista de correo de Git, Felipe Contreras alguna vez propuso al equipo central eliminar todas sus configuraciones y alias y probar Git en su estado base
  • Como resultado de ese experimento, se propusieron 9 configuraciones y 3 alias como nuevos valores predeterminados
    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  
    
  • Estas configuraciones aún no se han adoptado como valores predeterminados
  • Pero es interesante que muchos desarrolladores de Git tienen dificultades para usar Git sin activar algunas de ellas
  • Aún más interesante es que probablemente la mayoría de ustedes no tiene idea de qué significa todo esto
  • Se explicará en tres categorías
    • Lo que claramente mejora Git (Clearly Makes Git Better)
    • ¿Por qué demonios no? (Why the Hell Not?)
    • Cuestión de gusto (A Matter of Taste)

# Lo que claramente mejora Git

Ordenar la lista de ramas

  • Por defecto, Git ordena las ramas alfabéticamente, pero puede ser más útil ordenarlas por fecha del commit más reciente
  • Con la siguiente configuración puedes ordenar las ramas por el commit más reciente y mostrarlas en formato de columnas
    git config --global column.ui auto  
    git config --global branch.sort -committerdate  
    

Ordenar la lista de tags

  • Si quieres ordenar los tags por versión en lugar de alfabéticamente, usa esta configuración
    git config --global tag.sort version:refname  
    

Configurar el nombre de la rama predeterminada

  • Para establecer el nombre de la rama predeterminada al inicializar un nuevo repositorio, configura lo siguiente
    git config --global init.defaultBranch main  
    

Mejorar la configuración de diff

  • Cambia el algoritmo de diff predeterminado a histogram para obtener comparaciones más precisas
  • Para detectar movimientos de código y mostrarlos con color, agrega esta configuración
    git config --global diff.algorithm histogram  
    git config --global diff.colorMoved plain  
    git config --global diff.mnemonicPrefix true  
    git config --global diff.renames true  
    

Mejorar la configuración de push

  • Puedes mejorar el comportamiento de push con la siguiente configuración
    git config --global push.default simple  
    git config --global push.autoSetupRemote true  
    git config --global push.followTags true  
    

Mejorar la configuración de fetch

  • Para eliminar automáticamente ramas y tags innecesarios durante fetch, usa esta configuración
    git config --global fetch.prune true  
    git config --global fetch.pruneTags true  
    git config --global fetch.all true  
    

# ¿Por qué no usarlo?

Sugerencia de autocorrección

  • Si quieres que detecte errores tipográficos al escribir comandos y sugiera correcciones, usa esto
    git config --global help.autocorrect prompt  
    

Ver diff al hacer commit

  • Para mostrar también los cambios al escribir el mensaje del commit, agrega esta configuración
    git config --global commit.verbose true  
    

Reutilizar resolución de conflictos

  • Para reutilizar automáticamente resoluciones de conflictos anteriores, usa esta configuración
    git config --global rerere.enabled true  
    git config --global rerere.autoupdate true  
    

Configurar un archivo .gitignore global

  • Si quieres indicar archivos que se ignorarán globalmente, configúralo así
    git config --global core.excludesfile ~/.gitignore  
    

Mejorar la configuración de rebase

  • Para hacer automáticamente squash y stash durante rebase, usa esta configuración
    git config --global rebase.autoSquash true  
    git config --global rebase.autoStash true  
    git config --global rebase.updateRefs true  
    

# Cuestión de gusto

Mejor visualización de conflictos de merge

  • Si quieres mostrar también la versión base durante un conflicto de merge, considera esta configuración
    git config --global merge.conflictstyle zdiff3  
    

Usar rebase durante pull

  • Si quieres que git pull haga rebase automáticamente, configúralo así
    git config --global pull.rebase true  
    

Acelerar la detección de cambios en archivos

  • Para mejorar el rendimiento de comandos como git status, puedes usar esta configuración
    git config --global core.fsmonitor true  
    git config --global core.untrackedCache true  
    

# Cierre

  • Con estas configuraciones, puedes usar Git de forma más cómoda, y varias de ellas son usadas activamente incluso por desarrolladores del núcleo
  • Al optimizar la configuración de Git, puedes mejorar tu flujo de trabajo y usarlo de manera más eficiente

7 comentarios

 
brainypooh 2025-02-28

"Lo más interesante es que la mayoría de ustedes no tiene ni idea de lo que esto significa"; da justo en el clavo. 😨

 
tested 2025-02-27

¿Es -global y no --global?

 
xguru 2025-02-27

Es --global. Hubo un error al copiar y pegar. Ya fue corregido.

 
ilikeall 2025-02-26

Qué bueno poder reutilizar la resolución de conflictos.

 
tujuc 2025-02-26

Yo uso git-delta cuando hago diff para verlo en 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  

Si me da flojera complicarme con esto o con aquello, entonces tig... jajaja. ¿Habrá algo mejor?

 
GN⁺ 2025-02-26

Opiniones de Hacker News

  • Mi alias favorito es git out. Lista todos los commits que no se han hecho push. Lo uso todo el tiempo
    [alias]   
      out = "log @{u}.."   
    
  • Mientras mucha gente piensa en su propio ~/.gitconfig, recomiendo muchísimo delta como compañero del CLI de git
  • Mi ~/.gitconfig es este
    [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  
    
  • Me pregunto por qué la firma de commits no está incluida en esta configuración. Se puede hacer fácilmente con claves 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  
    
    • En GitHub puedes agregar una clave SSH tanto para autenticación como para firma. Hay que agregarla dos veces, pero una vez hecho eso puedes quitar la etiqueta "unverified" de los commits
  • Opciones populares de configuración de Git de Julia Evans
  • Algunas opciones adicionales que me gustan
    [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  
    
  • Mi configuración está aquí. Básicamente ya tenía casi todo configurado así (excepto la UI de columnas). Probablemente porque he leído buenos textos de Scott y otros
  • Coincido con la recomendación de usar (z)diff3. El artículo subestima su importancia. Un diff de tres vías permite resolver conflictos que no se pueden resolver con el estilo predeterminado
  • Descubrí que puedes configurar git para que use el pager que prefieras. Así que lo puse en bat