Git, 아직도 기본 설정으로 쓰십니까? 전문가의 비밀 설정 팁 대방출

우리는 매일 Git을 사용합니다.
마치 공기처럼 당연하게 우리 개발 과정의 일부가 되었는데요.
하지만 솔직하게 한번 자문해볼까요.
"나는 Git을 사용하는 것이 즐거운가?", "Git은 사용하기 쉬운 도구인가?"
아마 많은 분들이 선뜻 "그렇다"고 답하기 어려울 것입니다.
오랜 기간 Git 라이브러리(libgit2)를 만들어 온 전문가 Edward Thompson은 말합니다.
Git은 원래부터 쉽고 친절한 도구가 아니라, 무한한 가능성을 지닌 '도구상자'에 가깝다고 말입니다.
그리고 그 도구상자를 어떻게 꾸미고 활용하는지는 전적으로 우리 개발자들에게 달려있습니다.
오늘은 그의 강연을 바탕으로, 딱딱하고 불편했던 Git을 나에게 꼭 맞는 강력하고 즐거운 도구로 만드는 구체적인 방법들을 하나씩 알아보겠습니다.
이 글을 다 읽고 나면, 여러분의 Git 경험은 완전히 달라질 것입니다.

1. 모든 것의 시작: 나만의 Git 환경 꾸미기

가장 먼저 해야 할 일은, Git의 기본 얼굴을 내가 원하는 모습으로 바꾸는 것입니다.
모든 커스터마이징은 git config 명령어를 통해 이루어지는데요.
그중에서도 가장 강력하고 먼저 시작해야 할 것은 바로 '별명(Alias)'을 만드는 것입니다.

별명(Alias)으로 마법 같은 단축키 만들기

Git에는 유용하지만 이름이 길거나 외우기 힘든 옵션들이 너무나도 많습니다.
이럴 때 별명을 사용하면, 복잡한 명령어를 나만의 짧고 기억하기 쉬운 단어로 바꿀 수 있습니다.
예를 들어, git log는 기본 출력이 너무 길고 정보 밀도가 낮습니다.
이것을 한 줄 요약 형태로 보기 좋게 바꿔주는 별명을 만들어 보겠습니다.

# git config --global alias.lol "log --oneline --decorate"
# git config --global alias.graph "log --oneline --graph --decorate"

이제 터미널에서 git lol 이라고만 입력해도, 각 커밋이 한 줄로 깔끔하게 정리되어 나옵니다.
git graph를 입력하면, 브랜치가 어떻게 갈라지고 합쳐졌는지 시각적인 그래프까지 보여줍니다.
더 이상 길고 복잡한 플래그를 외울 필요가 없습니다.

칙칙한 터미널에 색을 입히다

Git의 기본 색상 조합이 마음에 들지 않는다면, 이것 역시 모두 바꿀 수 있습니다.
Git 문서에는 16가지 기본 색상만 나와 있지만, 사실 숨겨진 기능으로 256가지 색상이나 16진수(HEX) 코드까지 사용할 수 있습니다.

# git config --global color.branch "cyan"
# git config --global color.decorate.head "#ff00ff" # 마젠타 색상

이처럼 간단한 설정만으로도 매일 보는 로그 화면을 내가 좋아하는 색상으로 꾸며, 개발의 소소한 즐거움을 더할 수 있습니다.

2. 숨겨진 보물찾기: Git으로 원하는 모든 것을 찾는 기술

Git은 단순히 코드를 저장하는 창고가 아닙니다.
과거의 기록과 변화를 추적할 수 있는 거대한 데이터베이스이기도 한데요.
이 데이터베이스에서 원하는 정보를 효과적으로 찾아내는 몇 가지 강력한 기술을 알아보겠습니다.

git grep: 그냥 grep이 아닙니다

git grep은 특정 텍스트를 찾아주는 명령어입니다.
시스템의 일반 grep과 다른 점은, git grep이 훨씬 똑똑하다는 것입니다.
컴파일된 바이너리 파일이나 빌드 결과물은 알아서 제외하고 순수 소스 코드 안에서만 검색합니다.
게다가 여러 CPU 코어를 활용해 병렬로 검색하므로 훨씬 빠릅니다.
여기에 몇 가지 설정을 더하면 더욱 강력해집니다.

# git config --global grep.lineNumber true
# git config --global grep.patternType perl

lineNumber를 활성화하면 검색 결과에 파일명과 함께 줄 번호까지 표시해주고, patternType을 perl로 설정하면 더 강력한 정규표현식을 사용할 수 있습니다.

git reflog: 나의 모든 발자취를 기록하다

git log가 브랜치의 공식적인 역사라면, git reflog는 오직 나만 볼 수 있는 '개인 작업 일지'와 같습니다.
내가 어떤 브랜치로 이동했는지, 리베이스를 하다가 어떤 일이 있었는지 등 나의 모든 HEAD 이동 기록을 보여줍니다.
"어? 내가 아까 작업하던 브랜치가 뭐였지?" 하고 헷갈릴 때 git reflog는 최고의 가이드가 되어줍니다.
여기에 날짜 옵션을 더하면 언제 그 작업을 했는지까지 명확히 알 수 있습니다.

# git reflog --date=iso

3. 실수를 두려워하지 않게 만드는 마법들

Git을 사용하다 보면 누구나 실수를 합니다.
하지만 Git의 강력한 기능들을 알고 있다면, 대부분의 실수는 복구할 수 있습니다.

word-diff: 무엇이 바뀌었는지 정확히 보기

git diff로 코드 변경사항을 볼 때, 줄 전체가 빨갛고 초록색으로 표시되어 정확히 어떤 단어가 바뀌었는지 파악하기 어려울 때가 있습니다.
이때 --word-diff 옵션을 사용하면, 바뀐 단어만 정확히 강조해서 보여주어 변화를 훨씬 쉽게 이해할 수 있습니다.
이것 역시 별명으로 만들어두면 아주 유용합니다.

# git config --global alias.wdiff "diff --word-diff"

rerere: 지긋지긋한 반복 충돌 해결은 이제 그만

긴 브랜치를 리베이스하다 보면, 똑같은 충돌을 몇 번이고 반복해서 해결해야 하는 끔찍한 경험을 하기도 합니다.
rerere (Reuse Recorded Resolution)는 바로 이 문제를 해결해주는 마법 같은 기능입니다.
이 기능을 활성화하면, Git은 당신이 한번 해결한 충돌 내용을 기억해두었다가, 다음에 똑같은 충돌이 발생했을 때 자동으로 해결해줍니다.

# git config --global rerere.enabled true

단 한 줄의 설정으로, 리베이스의 고통을 절반으로 줄일 수 있습니다.

4. 모두를 위한 약속: 팀과 함께 쓰기 위한 필수 설정

마지막으로, 혼자가 아닌 팀으로 일할 때 반드시 알아야 할 중요한 설정 두 가지입니다.

전역 .gitignore 파일 설정하기

에디터 설정 파일(.vscode)이나 운영체제 파일(.DS_Store) 같은 것들이 프로젝트의 공식 .gitignore 파일에 들어가는 것을 막고 싶을 때가 있습니다.
이럴 때 '전역 .gitignore' 파일을 사용하면, 내 컴퓨터에서 발생하는 모든 Git 프로젝트에 공통적으로 무시할 파일들을 지정할 수 있습니다.

# git config --global core.excludesfile "~/.gitignore_global"

이제 ~/.gitignore_global 파일에 개인적으로 무시하고 싶은 파일 패턴을 마음껏 추가하면 됩니다.

라인 엔딩 문제, 완벽하게 해결하기

윈도우와 맥/리눅스는 줄바꿈을 처리하는 방식이 다릅니다.
이 차이 때문에, 코드를 전혀 수정하지 않았는데도 파일 전체가 수정된 것처럼 보이는 문제가 발생하곤 하는데요.
많은 사람들이 core.autocrlf 설정을 사용하라고 하지만, 이것은 팀원 모두가 똑같은 설정을 해야만 작동하는 불안정한 방식입니다.
가장 확실하고 견고한 해결책은 프로젝트 루트에 .gitattributes 파일을 만들고, 그 안에 단 한 줄을 추가하는 것입니다.

* text=auto

이 한 줄의 코드는, 팀원들이 어떤 운영체제에서 어떤 설정을 사용하든 상관없이 Git이 알아서 줄바꿈 문제를 처리하도록 만드는 '모두를 위한 약속'입니다.

Git, 당신의 가장 친한 친구가 될 수 있습니다

오늘 우리는 Git의 기본 기능을 넘어, 그것을 나만의 강력한 도구로 만드는 여러 가지 방법들을 알아보았습니다.
Git은 결코 우리를 괴롭히기 위해 만들어진 도구가 아닙니다.
오히려 너무나도 유연하고 강력해서, 우리가 직접 길들여야 하는 야생마에 가깝습니다.
오늘 소개된 팁 중에서 단 한두 개라도 여러분의 git config 파일에 추가해 보십시오.
작은 변화가 쌓여, 어느새 Git은 당신에게 가장 신뢰할 수 있고, 사용하기 즐거운 개발 동반자가 되어 있을 것입니다.