Git 워크플로우를 향상시키는 15가지 팁

Jake Shin
Jake Shin | Full-Stack Engineer

커밋을 비교하고, 오래된 브랜치를 삭제하고, alias를 작성하여 시간을 절약하는 방법에 대해 알아봅니다. 이제 세련된 커맨드 사용법으로 Git 활용을 극대화할 시간입니다!

GitLab은 올해 Git은 15주년을 기념하며, Git Merge 2020에서 그동안의 경험을 공유하고, Git의 플로우 관련 문제에 대한 논의와 Git의 최신 기능인 Partial Clone에 대한 소개를 포함하여, Git의 탄생과 업계에 끼친 영향에 대해 기쁜 마음으로 포스팅을 이어오고 있습니다.

Git을 처음 시작했거나, 혹은 커맨드 라인에 대해 이미 잘 알고 있는지에 상관없이, 기술을 연마한다는 것은 항상 좋은 일입니다. Git 기반의 워크플로우를 개선하기 위한 15가지 방법을 아래와 같이 소개합니다.

1. Git aliases

매일 반복되는 워크플로우를 개선하는 가장 효과적인 방법 중 하나는, 일상적으로 사용하는 명령어들에 대해 alias(별칭)를 만들어 터미널에서의 작업 시간을 절약하는 것입니다.

가장 많이 사용되는 Git 다음 명령어들에 대해 alias를 사용할 수 있습니다: checkoutcommit과 branch.

$ git config --global alias.co checkout
$ git config --global alias.ci commit
$ git config --global alias.br branch

git checkout master라고 전체를 타이핑하는 대신에, 간단하게 co master라고만 입력할 수 있습니다.

~/.gitconfig 파일을 직접 수정하여 이러한 명령어들을 편집하거나 추가할 수도 있습니다.

[alias]
co = checkout
ci = commit
br = branch

2. 명령 프롬프트에서 저장소 상태 확인하기

저장소의 상태를 눈으로 보고자 한다면 git-prompt.sh를 실행해 보세요 (다운로드 후 제공되는 가이드에 따라 시스템에 적용). Linux를 사용 중이고, 패키지 관리자와 함께 Git을 설치한 경우 이미 /etc/bash_completion.d/ 디렉토리에 존재할 수 있습니다.

여러분의 기본 쉘 명령 프롬프트를 좀 더 흥미로운 방식으로 바꿔볼 수 있습니다.

themes wiki에서 가져온 예제임.

3. 커맨드라인에서 커밋 비교하기

동일한 파일의 버전 간 혹은 커밋 간의 차이점을 비교하는 간단한 방법은 git diff 명령을 사용하는 것입니다.

동일한 파일의 서로 다른 커밋끼리 비교하려면 다음을 실행합니다.

$ git diff $start_commit..$end_commit -- path/to/file

두 개의 커밋 사이의 변경점을 비교하려면 다음을 실행합니다.

$ git diff $start_commit..$end_commit

이러한 명령어들은 터미널 내부에서 diff 화면을 열지만, 더욱 시각적인 도구를 사용하여 diff를 비교하려면 git difftool을 사용할 수 있습니다. Meld는 diff를 시각적으로 비교하는 데 유용한 뷰어/편집기입니다.

Meld를 설정하려면:

$ git config --global diff.tool git-meld

위와 동일한 방식으로 diff 명령어를 실행합니다.

$ git difftool $start_commit..$end_commit -- path/to/file
# 혹은
$ git difftool $start_commit..$end_commit

4. 커밋되지 않은 변경사항 stash 하기

특정 기능에 대해 작업하던 도중에, 프로젝트에 긴급 수정사항이 발생하는 경우 문제가 될 수 있습니다. 완료되지 않은 기능은 아직 커밋하고 싶지 않기 때문에, 현재 변경 내용을 그대로 보관해야 할 필요가 있습니다. 해결책은 Git stash 명령을 사용하여 이러한 변경사항을 임시로 제거하는 것입니다.

$ git stash

git stash 명령은 변경사항을 숨김으로써, 현재 상태를 저장하기 위해 의미 없는 스냅샷을 커밋 할 필요 없이 깔끔한 작업 디렉토리와 업데이트를 위해 새 브랜치로 전환 할 수 있는 기능을 제공합니다.

수정 작업을 완료하고 이전 변경사항으로 돌아오려면 다음을 실행합니다.

$ git stash pop

모든 변경사항이 복구되었습니다.

만약 이러한 변경사항이 더 이상 필요하지 않고 stash 스택을 지우려면 다음을 수행합니다.

$ git stash drop

5. 자주 pull 하기

GitLab Flow를 사용하는 경우, 기능 브랜치에서 새로운 작업을 수행하게 됩니다. 기능을 구현에 걸리는 시간에 따라, 마스터 브랜치에 여러 변경 사항이 발생했을 수 있습니다. 코드 충돌이 커지는 것을 피하려면, 가능한 한 빨리 충돌을 해결하고 브랜치를 마스터로 쉽게 병합할 수 있도록 마스터 브랜치에서 작업 브랜치로 변경 사항을 자주 가져와야(pull) 합니다.

6. 커맨드 자동완성

자동완성 스크립트를 사용하면 bash, tcsh 및 zsh에서 커맨드를 쉽고 빠르게 사용할 수 있습니다. git pull을 입력하려면 git p와 같이 첫 번째 문자만 입력하고 Tab을 누르면 다음과 같이 표시됩니다.

pack-objects -- create packed archive of objects
pack-redundant -- find redundant pack files
pack-refs -- pack heads and tags for efficient repository access
parse-remote -- routines to help parsing remote repository access parameters
patch-id -- compute unique ID for a patch
prune -- prune all unreachable objects from the object database
prune-packed -- remove extra objects that are already in pack files
pull -- fetch from and merge with another repository or local branch
push -- update remote refs along with associated objects

사용 가능한 모든 명령을 표시하려면, 터미널에 git을 입력한 다음 Tab+Tab을 누르면 됩니다.

7. 전역 .gitignore 설정하기

.DS_Store 또는 Vim swp과 같은 파일들을 커밋하지 않으려면 전역 .gitignore 파일에서 설정할 수 있습니다.

파일 만들기:

$ touch ~/.gitignore

실행하기:

$ git config --global core.excludesFile ~/.gitignore

아니면, 아래와 같이 ~/.gitconfig 파일에 추가합니다.

[core]
excludesFile = ~/.gitignore

원하는 Git ignore 파일 목록을 생성할 수 있습니다. 자세한 내용은 gitignore 문서를 참조하세요.

8. Git의 autosquash 기능을 기본설정으로 사용하기

Autosquash를 사용하면 대화식(interactive) rebase 중에 커밋을 보다 쉽게 스쿼시(squash) 할 수 있습니다. git rebase -i --autosquash와 같이 매번 rebase할 때마다 활성화할 수 있지만, 기본설정으로 켜 두는 것이 더 편리합니다.

$ git config --global rebase.autosquash true

아니면, 아래와 같이 ~/.gitconfig 파일에 추가합니다.

[rebase]
autosquash = true

9. fetch/pull시 리모트에서 제거된 내용을 로컬 브랜치에서 삭제하기

리모트 저장소에서 없어진 브랜치가 로컬 저장소에 그대로 남아있을 수 있습니다. fetch/pull할 때마다 지우려면 다음과 같이 실행합니다.

$ git config --global fetch.prune true

아니면, 아래와 같이 ~/.gitconfig 파일에 추가합니다.

[fetch]
prune = true

10. Git blame을 보다 효율적으로 사용하기

Git blame은 파일 내에서 누가 어떤 라인을 변경했는지 찾아내는 편리한 도구입니다. 여러 가지 옵션을 사용하여 다른 방식으로 확인할 수 있습니다.

$ git blame -w # 공백 무시하기
$ git blame -M # 텍스트 이동 무시하기
$ git blame -C # 다른 파일로의 텍스트 이동 무시하기

11. alias를 추가하여 로컬로 머지 리퀘스트 체크아웃하기

머지 리퀘스트에는 저장소의 모든 이력과 MR과 연관된 브랜치에 추가된 커밋들이 포함됩니다. 소스 프로젝트가 타깃 프로젝트의 포크(fork)인 경우에(심지어 비공개 fork일 경우에도) 공개된 머지 리퀘스트를 로컬로 체크아웃할 수 있습니다.

머지 리퀘스트를 로컬로 체크아웃하려면 ~/.gitconfig에 다음 alias를 추가해야 합니다.

[alias]
mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' -

이제, 어느 저장소나 리모트로부터 머지 리퀘스트를 체크아웃할 수 있습니다. 예를 들어, GitLab 상의 업스트림(upstream) 리모트에서 ID가 5인 머지 리퀘스트를 체크아웃하기 위해서는 다음을 수행합니다.

$ git mr upstream 5

위 커맨드는 머지 리퀘스트가 로컬 mr-upstream-5 브랜치로 가져오고 체크아웃합니다. 위 예제에서, upstream은 GitLab을 가리키고 있는 리모트이며 git remote -v 명령을 실행하여 찾을 수 있습니다.

12. HEAD의 alias

속보: @는 HEAD와 동일합니다. rebase시 사용하면 작업이 훨씬 쉬워집니다.

$ git rebase -i @~2

13. 파일 되돌리기(reset)

코드를 수정하다 이미 변경한 내용에 문제가 있다는 것을 갑자기 깨달았을 때, 파일을 되돌릴 필요가 생깁니다. 수정한 모든 항목에서 실행 취소(undo)를 클릭할 필요 없이, 파일을 해당 브랜치의 HEAD로 되돌릴(reset) 수 있습니다.

$ git reset --hard HEAD

하나의 파일만 되돌리기를 원한다면 다음 명령어를 실행합니다.

$ git checkout HEAD -- path/to/file

변경 사항을 이미 커밋해버린 경우에도, 아래와 같이 여전히 이를 되돌리는 것이 가능합니다.

$ git reset --soft HEAD~1

14. git-open 플러그인

사용 중인 저장소를 호스팅해주는 웹 사이트를 빠르게 접속하려면 git-open을 사용할 수 있습니다.

GitLab에서 저장소를 복제하여 설치하고 사용해 보세요. 터미널에서 저장소로 이동하여 git open을 실행하면 GitLab의 프로젝트 홈페이지를 바로 열립니다.

GitLab에서 호스팅 되는 프로젝트에서 해당 플러그인을 기본적으로 사용할 수 있지만, 자체 GitLab 인스턴스와 함께 사용할 수도 있습니다. 이를 위해서, 다음과 같이 도메인 이름을 설정합니다.

$ git config gitopen.gitlab.domain git.example.com

다른 리모트와 브랜치가 설정하여 여는 것도 가능합니다. 다양한 사용법을 예제를 통해 확인해보세요.

15. git-extras 플러그인

더 많은 명령어를 통해 Git의 사용성을 높이려면, git-extras 플러그인을 사용해 보세요. git info(저장소에 대한 정보 표시) 및 git effort(파일당 커밋 수) 등이 제공됩니다.

Git에 대해 더 알아보기

시니어 개발자 에반젤리스트인 Brendan O'Leary가, 향후 몇 개월에 걸쳐 Git의 탄생 기념일을 축하하기 위해 15개의 비디오를 제작할 것이라는 소식을 전해드리게 되어 기쁘게 생각합니다. 리베이스, 머지에서 부터 체리 픽(cherry-pick) 및 브랜치에 이르기까지 다양한 주제에 중점을 두고 진행될 예정입니다0.

이 포스트는 GitLab의 동의를 받아 공식 블로그의 영문 포스트를 우리말로 번역한 글입니다.