# Git 코어 개발자는 Git을 어떻게 설정하고 사용할까?

> Clean Markdown view of GeekNews topic #19441. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=19441](https://news.hada.io/topic?id=19441)
- GeekNews Markdown: [https://news.hada.io/topic/19441.md](https://news.hada.io/topic/19441.md)
- Type: news
- Author: [xguru](https://news.hada.io/@xguru)
- Published: 2025-02-26T10:46:01+09:00
- Updated: 2025-02-26T10:46:01+09:00
- Original source: [blog.gitbutler.com](https://blog.gitbutler.com/how-git-core-devs-configure-git/)
- Points: 95
- Comments: 7

## Summary

Scott Chacon은 Git을 더 효율적으로 사용하기 위한 다양한 설정을 소개합니다. 주요 설정으로는 브랜치와 태그의 정렬 방식 변경, 향상된 diff 및 push 설정, 자동 수정 프롬프트, 커밋 시 diff 표시, 충돌 해결 재사용, 리베이스 설정 등이 있으며, 이러한 설정들은 Git 사용을 보다 편리하게 만들어 주고 Git 작업 흐름을 개선할 수 있습니다.

## Topic Body

- "Pro Git" 저자인 Scott Chacon이 글로벌로 활성화한 몇 가지 Git 설정과 그 이유를 설명  
- 설정 중 다수는 실제로 Git 코어 코드베이스를 작업하는 개발자들로부터 배운 것임  
- 아래는 Git을 더 좋게 만드는 `~/.gitconfig` 설정  
  ```ini  
  [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개의 별칭이 새로운 기본값으로 제안되었음  
  ```ini  
  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 설정을 최적화함으로써 작업 흐름을 개선하고 보다 효율적으로 사용할 수 있음

## Comments



### Comment 35248

- Author: brainypooh
- Created: 2025-02-28T15:32:36+09:00
- Points: 1

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

### Comment 35192

- Author: tested
- Created: 2025-02-27T11:02:53+09:00
- Points: 3

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

### Comment 35198

- Author: xguru
- Created: 2025-02-27T13:33:30+09:00
- Points: 2
- Parent comment: 35192
- Depth: 1

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

### Comment 35146

- Author: kyc1682
- Created: 2025-02-26T11:59:15+09:00
- Points: 2

[인기 있는 Git 설정 옵션들](https://news.hada.io/topic?id=13405)

### Comment 35139

- Author: ilikeall
- Created: 2025-02-26T11:20:29+09:00
- Points: 1

충돌 해결 재사용이 좋네요

### Comment 35137

- Author: tujuc
- Created: 2025-02-26T11:14:50+09:00
- Points: 1

전 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를.... ㅎㅎㅎㅎ  
더 좋은 뭔가가 있을까요...?

### Comment 35134

- Author: neo
- Created: 2025-02-26T10:47:01+09:00
- Points: 1

##### [Hacker News 의견](https://news.ycombinator.com/item?id=43169435)   
* 내가 가장 좋아하는 alias는 `git out`임. 이는 푸시되지 않은 커밋을 모두 나열함. 항상 사용함  
  ```ini  
  [alias]   
    out = "log @{u}.."   
  ```  
* 많은 사람들이 자신의 ~/.gitconfig를 고민하는 동안, git CLI의 동반자로 [delta](https://dandavison.github.io/delta/)를 강력히 추천함  
* 나의 ~/.gitconfig는 다음과 같음  
  ```ini  
  [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 키로 쉽게 할 수 있음  
  ```ini  
  [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 설정 옵션](https://news.hada.io/topic?id=13405)  
* 내가 좋아하는 추가 옵션들  
  ```ini  
  [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  
  ```  
* [내 설정은 여기 있음](https://github.com/Julian/dotfiles/blob/main/.config/git/config). 기본적으로 이미 설정되어 있었음 (column UI 제외). 아마도 Scott 등의 좋은 글을 읽었기 때문일 것임  
* (z)diff3 사용 추천에 동의함. 기사는 그 중요성을 과소평가함. 세 방향 diff는 기본 스타일로는 불가능한 충돌 해결을 가능하게 함  
  * 기본 스타일에서는 같은 위치에 충돌하는 내용을 추가하는 것이 같은 위치에서 제거하는 것과 구분되지 않음. 이를 구분하기 위해서는 기본을 볼 수 있어야 함  
  * 더 많은 내용을 여기에 작성함: [diff3 should be the default](https://stackoverflow.com/a/63739655/997606)  
  * [diff3 스타일을 사용하여 리베이스(또는 병합) 충돌을 기계적으로 해결하는 방법](https://h2.jaguarpaw.co.uk/posts/git-rebase-conflicts/)  
* git이 좋아하는 pager를 사용하도록 설정할 수 있음을 발견함. 그래서 bat로 설정함  
  * ```git config --global core.pager bat```  
  * https://github.com/sharkdp/bat/ [bat - Syntax Highlighting 되는 cat](https://news.hada.io/topic?id=1985)
