
여러분은 Git을 얼마나 자주 사용하시나요? 요즘 개발자들에게 Git은 필수 도구인 것 같습니다(혹시 아직도 SVN이나 공유 드라이브를 쓰면서 "몇번 파일 수정합니다!"라고 외치시는 분은 없겠죠?). 자주 사용하는 도구인 만큼, 본인 스타일에 맞게 커스텀해두면 작업 효율도 올라가고, "힙한 나"에 취하는 느낌도 들어서 좋습니다. 이번 아티클에서는 제가 Git을 어떻게 설정하고 사용하는지 소개하려고 합니다.
.gitconfig: Git 설정 파일글로벌 Git 설정 파일은 일반적으로 ~/.gitconfig에 위치합니다.
이 파일이 이미 존재한다면, 이미 이전에 설정된 내용이 있을 수도 있습니다. 예를 들어, 과거에 커밋하다가 에러가 발생해 구글링 하다가 git config --global email <your_email> 같은 명령어를 실행한 적이 있을 수도 있습니다(제가 그랬습니다). 이 명령어는 글로벌 Git 설정에 유저 이메일을 추가하는 역할을 합니다.
[user]: 사용자 정보 설정[user]
name = <your_name>
email = <your_email>
[user] 설정에서는 커밋(git commit)에 사용될 사용자 정보를 지정합니다.
[core]: 코어 설정[core]
editor = nvim # 원하는 편집기로 변경하세요
fsmonitor = true # 성능 향상을 위해 활성화
[core] 설정에서는 Git의 기본 동작 방식을 지정할 수 있습니다.
editor는 커밋, 리베이스 작업 등에서 사용할 편집기를 지정합니다. 저는 터미널 환경에서 Git 명령어를 자주 다루기에 Neovim으로 설정해두었습니다.
fsmonitor는 Git이 파일 변경 여부를 감지할 때, File System Monitor 기능 사용 여부를 지정합니다. 이 기능을 활성화하면 git status, git diff 등의 명령어가 더 빠르게 동작할 수도 있습니다!
[init]: 초기화 설정[init]
defaultBranch = master
[init] 설정에서는 새 Git 저장소를 초기화(git init) 시의 기본 설정을 지정합니다.
defaultBranch는 초기화 시 생성되는 기본 브랜치의 이름을 지정합니다. 저는 전통적인 master로 설정해두었습니다. 왠지 main이면 develop 브랜치도 dev로 바꿔야 할 것 같은 느낌이 듭니다.
[push], [fetch]. [pull]: 푸시, 페치, 풀 설정[push]
default = simple
autoSetupRemote = true
followTags = true
[push] 설정에서는 Git 푸시(git push)의 기본 동작 방식을 지정할 수 있습니다.
default는 푸시할 때 기본적으로 어떤 브랜치를 원격 저장소에 푸시할지 지정합니다. simple로 설정하면 현재 브랜치와 동일한 이름의 원격 브랜치에 푸시합니다.autoSetupRemote를 true로 설정하면, 로컬의 새 브랜치를 푸시할 때 자동으로 --set-upstream 옵션을 적용해줍니다.(굉장히 편리합니다!)followTags를 true로 설정하면, 해당 브랜치가 참조하는 tag도 함께 푸시합니다.[fetch]
all = true
prune = true
pruneTags = true
[fetch] 설정에서는 Git 페치(git fetch)의 기본 동작 방식을 지정할 수 있습니다.
all을 true로 설정하면, 모든 원격 저장소에서 변경 사항을 가져옵니다.prune을 true로 설정하면, 원격 저장소에서 삭제된 브랜치를 로컬에서도 삭제합니다.pruneTags를 true로 설정하면, 원격 저장소에서 삭제된 브랜치를 로컬에서도 삭제합니다.[pull]
rebase = true
[pull] 설정에서는 Git 풀(git pull)의 기본 동작 방식을 지정할 수 있습니다.
rebase를 true로 설정하면, 풀할 때, 병합 대신 리베이스를 사용합니다. 저는 깔끔한 커밋 히스토리를 위해 이 옵션을 선호합니다.[branch], [tag]: 브랜치, 태그 설정[branch]
sort = -committerdate
[tag]
sort = version:refname
[branch]의 sort 옵션은 git branch -l 명령어로 브랜치 목록을 표시할 때, 브랜치 정렬 방식을 지정합니다.
[tag]의 sort 옵션은 git tag -l 명령어로 태그 목록을 표시할 때, 태그 정렬 방식을 지정합니다.
[alias]: 명령어 별칭 설정[alias]
st = add
stage = add
unst = restore --staged
unstage = restore --staged
cm = commit
cmend = commit --amend
cmcnt = shortlog -sn # commit count
mg = merge
rb = rebase
br = branch
sw = switch
fuck = reset --hard HEAD
# log, log with graph
lg = log --oneline --graph --date=relative --pretty=format:'%C(bold cyan)%h%C(reset)%C(yellow)%d%C(reset) %s %C(cyan)(%cr)%C(bold italic blue) [%an]'
lgg = log --all --oneline --graph --date=relative --pretty=format:'%C(bold cyan)%h%C(reset)%C(yellow)%d%C(reset) %s %C(cyan)(%cr)%C(bold italic blue) [%an]'
changelog = log --oneline --pretty=format:'%C(bold cyan)%h%C(reset) %s'
[alias] 설정은 .gitconfig의 꽃이라고 생각합니다. 당신만의 명령어/약어들로 Git이 힙해질 가능성이 높은 설정입니다. 저는 다음과 같이 설정했습니다.
git st = git stage = git add (add는 스테이징하는 역할이라 생각해 제 개인적인 약어로 사용하고 있습니다. 덕분에 stash는 힘들게 쳐야합니다.)git unst = git unstage = git restore --stagedgit cm = git commitgit cmend = git commit --amend (마지막 커밋 수정)git cmcnt = git shortlog -sn (커밋 수 카운트)git mg = git mergegit rb = git rebasegit br = git branchgit sw = git switchgit fuck = git reset --hard HEAD (이걸 자주 쓰게 될 줄은 몰랐습니다)git lg = 그래프 형태의 커밋 로그 보기git lgg = 모든 브랜치의 그래프 형태 커밋 로그 보기git changelog = 간단한 커밋 로그 보기 (PR 작성 시 유용합니다)[user]
...
signingkey = <your_signingkey_path>
[commit]
gpgsign = true
[gpg]
format = ssh
커밋 서명은 옵션이지만, 당신이 "이 커밋은 내가 작성했다!"라고 증명하고 싶다면 사용해보세요. 덤으로 GitHub에서는 자랑스러운 Verified 뱃지를 달아줍니다!
gpg 키로도 서명할 수 있지만, ssh 키를 통한 서명이 더 단순하고 현대적이므로 저는 ssh 키 서명 기준으로 설명드리겠습니다.
먼저 기존에 사용하던 ssh 키가 존재한다면 그대로 사용해도 되지만, 없는 경우 ssh-keygen 명령어를 통해 새로운 키를 생성해줍니다(ed25519 알고리즘은 힙합니다).
user.signingkey에는 서명에 사용할 ssh public 키의 파일 경로로 설정합니다.
commit.gpgsign은 true로 설정해서 모든 커밋을 자동 서명하도록 설정합니다.
gpg.format은 gpg 대신 ssh 기반 서명 방식을 사용할 것이기에, ssh로 설정합니다.
읽어 주셔서 감사합니다. 제 .gitconfig는 앞으로도 변화할 것이며, 그게 기대되기도 합니다. 혹시 여러분만의 .gitconfig 꿀팁이나 힙한 alias가 있다면 공유해주세요. 저도 뺐어 먹겠습니다.
참고
로그인 후 댓글을 작성할 수 있습니다.