Git 완벽 마스터
Git의 핵심 개념과 실전 활용법
학습 항목
이미지 로딩 중...
Git 고급 테크닉 완벽 가이드
Git의 고급 기능들을 마스터하여 효율적인 버전 관리와 협업 워크플로우를 구축하세요. Interactive Rebase, Cherry-pick, Reflog 등 실무에서 바로 활용할 수 있는 고급 명령어들을 다룹니다.
들어가며
이 글에서는 Git 고급 테크닉 완벽 가이드에 대해 상세히 알아보겠습니다. 총 12가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- Interactive_Rebase로_커밋_히스토리_정리
- Cherry-pick으로_특정_커밋만_가져오기
- Reflog로_삭제된_커밋_복구하기
- Bisect로_버그_발생_커밋_찾기
- Stash로_작업_임시_저장_활용
- Worktree로_여러_브랜치_동시_작업
- Filter-branch로_전체_히스토리_수정
- Submodule로_외부_저장소_관리
- Blame과_Log로_코드_변경_추적
- Hooks로_자동화_워크플로우_구축
- Sparse-checkout으로_부분_체크아웃
- Advanced_Merge_전략_활용
1. Interactive_Rebase로_커밋_히스토리_정리
개요
Interactive Rebase를 사용하여 여러 커밋을 하나로 합치거나(squash), 순서를 변경하거나, 메시지를 수정할 수 있습니다.
코드 예제
# 최근 3개의 커밋을 대화형으로 수정
git rebase -i HEAD~3
# 에디터에서 pick을 squash로 변경하여 커밋 합치기
# pick abc123 첫 번째 커밋
# squash def456 두 번째 커밋
# squash ghi789 세 번째 커밋
설명
HEAD~3은 최근 3개 커밋을 의미하며, squash를 사용하면 여러 커밋을 하나로 깔끔하게 합칠 수 있습니다.
2. Cherry-pick으로_특정_커밋만_가져오기
개요
다른 브랜치의 특정 커밋만 선택적으로 현재 브랜치에 적용할 수 있습니다.
코드 예제
# 특정 커밋 하나만 가져오기
git cherry-pick abc123
# 여러 커밋을 순서대로 가져오기
git cherry-pick abc123 def456 ghi789
# 커밋만 적용하고 자동 커밋하지 않기
git cherry-pick -n abc123
설명
다른 브랜치의 버그 수정이나 특정 기능만 선택적으로 가져올 때 매우 유용합니다.
3. Reflog로_삭제된_커밋_복구하기
개요
Reflog는 모든 HEAD 이동 기록을 보관하므로, 실수로 삭제한 커밋이나 브랜치를 복구할 수 있습니다.
코드 예제
# HEAD 이동 기록 확인
git reflog
# 특정 시점으로 복구
git reset --hard HEAD@{2}
# 삭제된 브랜치 복구
git checkout -b recovered-branch HEAD@{5}
설명
reflog는 30일간 보관되므로 실수로 삭제한 커밋도 복구 가능합니다. 강력한 안전망입니다.
4. Bisect로_버그_발생_커밋_찾기
개요
이진 탐색 알고리즘으로 버그가 처음 발생한 커밋을 자동으로 찾아줍니다.
코드 예제
# Bisect 시작
git bisect start
# 현재는 버그 있음
git bisect bad
# 특정 과거 커밋은 정상
git bisect good abc123
# 테스트 후 good/bad 반복
# 버그 커밋 찾으면 종료
git bisect reset
설명
수백 개의 커밋 중에서 버그가 처음 발생한 시점을 빠르게 찾을 수 있는 강력한 디버깅 도구입니다.
5. Stash로_작업_임시_저장_활용
개요
커밋하지 않은 변경사항을 임시로 저장하고 나중에 다시 적용할 수 있습니다.
코드 예제
# 현재 작업 임시 저장
git stash save "작업 중인 기능"
# Stash 목록 확인
git stash list
# 특정 Stash 적용 (유지)
git stash apply stash@{0}
# Stash 적용 후 삭제
git stash pop
설명
브랜치 전환이 필요한데 커밋하기 애매한 상황에서 작업을 안전하게 보관할 수 있습니다.
6. Worktree로_여러_브랜치_동시_작업
개요
하나의 저장소에서 여러 브랜치를 서로 다른 디렉토리에서 동시에 작업할 수 있습니다.
코드 예제
# 새 워크트리 생성
git worktree add ../feature-branch feature
# 워크트리 목록 확인
git worktree list
# 워크트리 제거
git worktree remove ../feature-branch
설명
핫픽스를 긴급하게 작업하면서도 현재 개발 브랜치의 상태를 유지할 수 있습니다.
7. Filter-branch로_전체_히스토리_수정
개요
전체 커밋 히스토리에서 특정 파일을 제거하거나 이메일을 일괄 변경할 수 있습니다.
코드 예제
# 특정 파일을 모든 히스토리에서 제거
git filter-branch --tree-filter \
'rm -f passwords.txt' HEAD
# 작성자 이메일 일괄 변경
git filter-branch --env-filter '
if [ "$GIT_AUTHOR_EMAIL" = "old@email.com" ]
then
export GIT_AUTHOR_EMAIL="new@email.com"
fi' HEAD
설명
민감한 정보가 실수로 커밋된 경우 전체 히스토리에서 완전히 제거할 수 있습니다.
8. Submodule로_외부_저장소_관리
개요
다른 Git 저장소를 현재 프로젝트의 하위 디렉토리로 포함시켜 관리할 수 있습니다.
코드 예제
# Submodule 추가
git submodule add https://github.com/user/lib.git libs/lib
# Submodule 초기화 및 업데이트
git submodule init
git submodule update
# 모든 Submodule을 최신으로 업데이트
git submodule update --remote --recursive
설명
공유 라이브러리나 공통 모듈을 별도 저장소로 관리하면서 프로젝트에 통합할 수 있습니다.
9. Blame과_Log로_코드_변경_추적
개요
특정 코드 라인이 언제, 누가, 왜 변경했는지 상세하게 추적할 수 있습니다.
코드 예제
# 각 라인의 마지막 수정자 확인
git blame src/index.js
# 특정 라인 범위만 확인
git blame -L 10,20 src/index.js
# 파일의 변경 히스토리와 diff 확인
git log -p src/index.js
설명
버그의 원인을 찾거나 코드 변경 의도를 파악할 때 매우 유용한 명령어입니다.
10. Hooks로_자동화_워크플로우_구축
개요
Git 이벤트 발생 시 자동으로 실행되는 스크립트를 작성하여 워크플로우를 자동화할 수 있습니다.
코드 예제
# .git/hooks/pre-commit 파일 생성
#!/bin/sh
npm run lint
npm test
if [ $? -ne 0 ]; then
echo "Tests failed, commit aborted"
exit 1
fi
chmod +x .git/hooks/pre-commit
설명
커밋 전에 자동으로 테스트와 린트를 실행하여 코드 품질을 보장할 수 있습니다.
11. Sparse-checkout으로_부분_체크아웃
개요
대용량 저장소에서 필요한 디렉토리만 선택적으로 체크아웃하여 작업 효율을 높일 수 있습니다.
코드 예제
# Sparse checkout 활성화
git sparse-checkout init --cone
# 특정 디렉토리만 체크아웃
git sparse-checkout set src/components
# 여러 디렉토리 추가
git sparse-checkout add src/utils src/hooks
설명
모노레포처럼 거대한 저장소에서 필요한 부분만 가져와 디스크 공간과 시간을 절약할 수 있습니다.
12. Advanced_Merge_전략_활용
개요
병합 충돌 해결 전략을 세밀하게 제어하여 원하는 방식으로 브랜치를 병합할 수 있습니다.
코드 예제
# 현재 브랜치 변경사항을 우선
git merge -X ours feature-branch
# 병합할 브랜치 변경사항을 우선
git merge -X theirs feature-branch
# 충돌 시 병합 전 상태로 되돌리기
git merge --abort
설명
대규모 병합에서 특정 전략을 사용하면 충돌 해결 시간을 크게 단축할 수 있습니다.
마치며
이번 글에서는 Git 고급 테크닉 완벽 가이드에 대해 알아보았습니다. 총 12가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#Git #Rebase #Cherry-pick #Reflog #Bisect