75P by xguru 2일전 | ★ favorite | 댓글 7개
  • "Pro Git" 저자인 Scott Chacon이 글로벌로 활성화한 몇 가지 Git 설정과 그 이유를 설명
  • 설정 중 다수는 실제로 Git 코어 코드베이스를 작업하는 개발자들로부터 배운 것임
  • 아래는 Git을 더 좋게 만드는 ~/.gitconfig 설정
    [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  
    
    # 쓰지 않을 이유가?  
    
    [help]  
    autocorrect = prompt  
    [commit]  
    verbose = true  
    [rerere]  
    enabled = true  
    autoupdate = true  
    [core]  
    excludesfile = ~/.gitignore  
    [rebase]  
    autoSquash = true  
    autoStash = true  
    updateRefs = true  
    
    # 개인 취향에 따른 설정 (필요 시 주석 해제하고 사용)  
    
    [core]  
    # fsmonitor = true  
    # untrackedCache = true  
    [merge]  
    # (Git 버전이 2.3 미만인 경우 ‘diff3’ 사용)  
    # conflictstyle = zdiff3  
    [pull]  
    # rebase = true  
    

Git 코어 개발자들은 Git을 어떻게 설정할까?

  • Git 메일링 리스트에서 Felipe Contreras가 코어 팀에게 모든 설정과 별칭을 제거하고 기본 Git을 사용해보라고 제안한 적이 있음
  • 이 실험의 결과로 9개의 설정과 3개의 별칭이 새로운 기본값으로 제안되었음
    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  
    
  • 이러한 설정은 아직 기본값으로 채택되지 않았음
  • 하지만, 많은 Git 개발자들이 이 중 몇가지를 켜지 않고서는 Git을 사용하는데 어려움을 겪고 있다는게 흥미로움
  • 더욱 흥미로운 것은 여러분 중 대부분이 이게 뭘 의미하는지 전혀 모른다는 것임
  • 세가지 카테고리로 나누어 설명하겠음
    • Git을 확실히 더 좋게 만드는 것(Clearly Makes Git Better)
    • 안 쓸 이유가?(Why the Hell Not?)
    • 취향의 문제(A Matter of Taste)

# Git을 확실히 더 좋게 만드는 것

브랜치 목록 정렬

  • 기본적으로 Git은 브랜치를 알파벳 순으로 정렬하지만, 최근 커밋 날짜 순으로 정렬하는 것이 더 유용할 수 있음
  • 다음 설정을 통해 브랜치를 최근 커밋 순으로 정렬하고, 열 형식으로 표시할 수 있음
    git config --global column.ui auto  
    git config --global branch.sort -committerdate  
    

태그 목록 정렬

  • 태그를 알파벳 순이 아닌 버전 순으로 정렬하려면 다음 설정을 사용
    git config --global tag.sort version:refname  
    

기본 브랜치 이름 설정

  • 새로운 저장소를 초기화할 때 기본 브랜치 이름을 설정하려면 다음과 같이 설정
    git config --global init.defaultBranch main  
    

향상된 diff 설정

  • 기본 diff 알고리즘을 'histogram'으로 변경하여 더 정확한 비교를 수행
  • 코드 이동을 감지하고 색상으로 표시하려면 다음 설정을 추가
    git config --global diff.algorithm histogram  
    git config --global diff.colorMoved plain  
    git config --global diff.mnemonicPrefix true  
    git config --global diff.renames true  
    

향상된 push 설정

  • 다음 설정을 통해 push 동작을 개선할 수 있음
    git config --global push.default simple  
    git config --global push.autoSetupRemote true  
    git config --global push.followTags true  
    

향상된 fetch 설정

  • fetch 시 불필요한 브랜치와 태그를 자동으로 제거하려면 다음 설정을 사용
    git config --global fetch.prune true  
    git config --global fetch.pruneTags true  
    git config --global fetch.all true  
    

# 안 쓸 이유가?

자동 수정 프롬프트

  • 명령어 입력 시 오타를 감지하고 제안하도록 설정하려면 다음을 사용
    git config --global help.autocorrect prompt  
    

커밋 할 때 diff

  • 커밋 메시지 작성 시 변경된 내용을 함께 표시하려면 다음 설정을 추가
    git config --global commit.verbose true  
    

충돌 해결 재사용

  • 이전의 충돌 해결을 자동으로 재사용하려면 다음 설정을 사용
    git config --global rerere.enabled true  
    git config --global rerere.autoupdate true  
    

전역 .gitignore 파일 설정

  • 전역적으로 무시할 파일을 지정하려면 다음과 같이 설정
    git config --global core.excludesfile ~/.gitignore  
    

리베이스 설정 개선

  • 리베이스 시 자동으로 스쿼시 및 스태시를 수행하려면 다음 설정을 사용
    git config --global rebase.autoSquash true  
    git config --global rebase.autoStash true  
    git config --global rebase.updateRefs true  
    

# 취향의 문제

향상된 머지 충돌 표시

  • 병합 충돌 시 기본 버전도 함께 표시하려면 다음 설정을 고려
    git config --global merge.conflictstyle zdiff3  
    

pull 시 리베이스 사용

  • git pull 시 자동으로 리베이스를 수행하려면 다음과 같이 설정
    git config --global pull.rebase true  
    

파일 변경 감지 속도 향상

  • git status 등의 성능을 향상시키려면 다음 설정을 사용할 수 있음
    git config --global core.fsmonitor true  
    git config --global core.untrackedCache true  
    

# 마무리

  • 이 설정들을 통해 Git을 보다 편리하게 사용할 수 있으며, 일부는 코어 개발자들도 적극적으로 사용하는 설정임
  • Git 설정을 최적화함으로써 작업 흐름을 개선하고 보다 효율적으로 사용할 수 있음

"더욱 흥미로운 것은 여러분 중 대부분이 이게 뭘 의미하는지 전혀 모른다는 것임" 콕 찌르네요. ㄷㄷㄷ

"--global" 이 아니라 "-global" 인가요?

--global이 맞습니다. 복붙하면서 착오가 있었네요. 수정되었습니다.

충돌 해결 재사용이 좋네요

전 diff 할때 git-delta를 이용해서 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  

뭐 이도 저도 귀찮으면 tig를.... ㅎㅎㅎㅎ
더 좋은 뭔가가 있을까요...?

Hacker News 의견

  • 내가 가장 좋아하는 alias는 git out임. 이는 푸시되지 않은 커밋을 모두 나열함. 항상 사용함
    [alias]   
      out = "log @{u}.."   
    
  • 많은 사람들이 자신의 ~/.gitconfig를 고민하는 동안, git CLI의 동반자로 delta를 강력히 추천함
  • 나의 ~/.gitconfig는 다음과 같음
    [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  
    
  • 커밋 서명이 왜 이 설정에 포함되지 않았는지 궁금함. 현대적인 SSH 키로 쉽게 할 수 있음
    [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  
    
    • GitHub에서 SSH 키를 인증과 서명에 추가할 수 있음. 두 번 추가해야 하지만, 한 번 설정하면 커밋에서 'unverified' 레이블을 제거할 수 있음
  • Julia Evans의 인기 있는 Git 설정 옵션
  • 내가 좋아하는 추가 옵션들
    [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  
    
  • 내 설정은 여기 있음. 기본적으로 이미 설정되어 있었음 (column UI 제외). 아마도 Scott 등의 좋은 글을 읽었기 때문일 것임
  • (z)diff3 사용 추천에 동의함. 기사는 그 중요성을 과소평가함. 세 방향 diff는 기본 스타일로는 불가능한 충돌 해결을 가능하게 함
  • git이 좋아하는 pager를 사용하도록 설정할 수 있음을 발견함. 그래서 bat로 설정함