문제 해결
3. 코드 예제
예제 1: detached HEAD 에서 커밋하고 브랜치로 구해내기 — 01_troubleshoot.sh 발췌
git checkout -q "$BASE"
git status
printf 'x=2\n' > a.txt
git add a.txt
git commit -q -m "detached: 긴급 수정"
git log --oneline --all
git switch -c rescue
git log --oneline
git branchHEAD detached at 271d29c
nothing to commit, working tree clean
--- log --oneline --all (브랜치 없이 뜬 커밋) ---
e9d92ba detached: 긴급 수정
271d29c C1: 기본값
--- switch -c 로 지금 위치에 브랜치를 만들어 구해내기 ---
Switched to a new branch 'rescue'
e9d92ba detached: 긴급 수정
271d29c C1: 기본값
main
* rescue해시로 checkout 하면 HEAD detached at ... 로 뜹니다. 그 상태로 만든 커밋은 switch -c 로 즉시 브랜치를 만들어야 안전합니다.
예제 2: 잘못된 브랜치의 커밋 2개를 cherry-pick 으로 옮기기 — 01_troubleshoot.sh 발췌
git switch -q feature/login
git cherry-pick "$M1" "$M2"
git log --oneline
git switch -q main
git reset --hard HEAD~2
git log --oneline--- main 로그 (옮겨야 할 커밋 2개) ---
29002e6 M2: 로그인 검증 버그 수정(실수로 main)
224fced M1: 로그인 검증 추가(실수로 main)
64be868 C1: 기본 화면
[feature/login 5447b8c] M1: 로그인 검증 추가(실수로 main)
[feature/login 16f0759] M2: 로그인 검증 버그 수정(실수로 main)
--- feature/login 로그 (커밋 도착) ---
16f0759 M2: 로그인 검증 버그 수정(실수로 main)
5447b8c M1: 로그인 검증 추가(실수로 main)
286e6d7 F1: 로그인 화면 뼈대(다른 파일)
64be868 C1: 기본 화면
HEAD is now at 64be868 C1: 기본 화면
--- main 로그 (원래대로 복구) ---
64be868 C1: 기본 화면main 에 실수로 쌓인 M1·M2 를 feature/login 으로 cherry-pick 한 뒤, main 에서는 reset --hard 로 두 커밋을 지워 원래 상태로 돌립니다. git cherry-pick 은 -q(조용히) 옵션을 지원하지 않아 항상 결과를 출력합니다.
예제 3: bisect run 으로 버그 커밋 자동 탐색 — 01_troubleshoot.sh 발췌
git bisect start
git bisect bad HEAD
git bisect good HEAD~7
git bisect run ./check.sh
git bisect resetrunning './check.sh'
running './check.sh'
running './check.sh'
fad493f59c6553c36e79d5e1d4d3300c6aa59a34 is the first bad commit
bisect found first bad commitcheck.sh 는 calc.txt 의 값이 90 미만이면 정상(종료 코드 0), 아니면 버그(1)로 판정합니다. 8개 커밋 중 값을 직접 비교하지 않고도 bisect run 이 세 번 만에 첫 버그 커밋 C5 를 정확히 찾았습니다.
예제 4: blame·log -S 로 특정 줄이 언제 왜 바뀌었는지 추적하기 — 01_troubleshoot.sh 발췌
git blame -L 1,3 price.txt
git log -S"tax_rate=0.1" --oneline -- price.txt
git log -G'tax_rate=0\.[0-9]+' --oneline -- price.txt
git log --follow --oneline -- pricing.txt--- blame -L 1,3 (각 줄을 마지막으로 바꾼 커밋) ---
^a8fe8c4 (kim 2026-01-05 09:16:00 +0900 1) base=1000
3ecfd118 (kim 2026-01-05 09:19:00 +0900 2) tax_rate=0.08
b6bd3a8d (kim 2026-01-05 09:18:00 +0900 3) discount=0.05
--- log -S 로 tax_rate=0.1 문자열이 나타나거나 사라진 커밋 ---
3ecfd11 C4: 세율 변경 0.1 -> 0.08
5ab17b5 C2: 세율 추가
--- log --follow (이름이 바뀐 뒤에도 이력 추적) ---
c8b16e8 C5: 파일명을 pricing.txt 로 변경
3ecfd11 C4: 세율 변경 0.1 -> 0.08
b6bd3a8 C3: 할인율 추가
5ab17b5 C2: 세율 추가
a8fe8c4 C1: 기본 가격blame 은 2번째 줄을 마지막으로 바꾼 커밋이 세율을 0.1 에서 0.08 로 고친 C4 임을 보여줍니다. -S·-G 는 같은 문자열을 다르게 찾지만 이 예제에서는 결과가 같습니다. --follow 는 price.txt 가 pricing.txt 로 이름이 바뀐 뒤에도 이전 이력(C1~C4)까지 이어서 보여줍니다.