Git 실전 가이드
Git의 핵심 개념과 실무 활용
학습 항목
본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
이미지 로딩 중...
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