커밋을 비교하고, 오래된 브랜치를 삭제하고, alias를 작성하여 시간을 절약하는 방법에 대해 알아봅니다. 이제 세련된 커맨드 사용법으로 Git 활용을 극대화할 시간입니다!
GitLab은 올해 Git은 15주년을 기념하며, Git Merge 2020에서 그동안의 경험을 공유하고, Git의 플로우 관련 문제에 대한 논의와 Git의 최신 기능인 Partial Clone에 대한 소개를 포함하여, Git의 탄생과 업계에 끼친 영향에 대해 기쁜 마음으로 포스팅을 이어오고 있습니다.
Git을 처음 시작했거나, 혹은 커맨드 라인에 대해 이미 잘 알고 있는지에 상관없이, 기술을 연마한다는 것은 항상 좋은 일입니다. Git 기반의 워크플로우를 개선하기 위한 15가지 방법을 아래와 같이 소개합니다.
1. Git aliases
매일 반복되는 워크플로우를 개선하는 가장 효과적인 방법 중 하나는, 일상적으로 사용하는 명령어들에 대해 alias(별칭)를 만들어 터미널에서의 작업 시간을 절약하는 것입니다.
가장 많이 사용되는 Git 다음 명령어들에 대해 alias를 사용할 수 있습니다: checkout
, commit
과 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 # 다른 파일로의 텍스트 이동 무시하기