Git 코어 개발자는 Git을 어떻게 설정하고 사용할까?
(blog.gitbutler.com)- "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 설정을 최적화함으로써 작업 흐름을 개선하고 보다 효율적으로 사용할 수 있음
전 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는 기본 스타일로는 불가능한 충돌 해결을 가능하게 함
- 기본 스타일에서는 같은 위치에 충돌하는 내용을 추가하는 것이 같은 위치에서 제거하는 것과 구분되지 않음. 이를 구분하기 위해서는 기본을 볼 수 있어야 함
- 더 많은 내용을 여기에 작성함: diff3 should be the default
- diff3 스타일을 사용하여 리베이스(또는 병합) 충돌을 기계적으로 해결하는 방법
- git이 좋아하는 pager를 사용하도록 설정할 수 있음을 발견함. 그래서 bat로 설정함
-
git config --global core.pager bat
- https://github.com/sharkdp/bat/ bat - Syntax Highlighting 되는 cat
-