WEBBOOK CHAPTER

현장에서 살아남는 Git: 18장 현장에서 자주 만나는 12가지 고장

18장 현장에서 자주 만나는 12가지 고장

1. push가 non-fast-forward로 거절된다

원격에 내가 모르는 커밋이 있다는 뜻이다. git fetch origingit log --left-right --graph HEAD...origin/<branch>로 양쪽을 본다. 팀 정책에 따라 merge 또는 내 미공유 커밋 rebase를 한다. 무작정 force push하지 않는다.

2. detached HEAD에서 커밋했다

창을 닫지 말고 git switch -c rescue/my-work로 현재 커밋에 이름을 붙인다. 이후 올바른 브랜치로 합친다.

3. 잘못된 브랜치에서 작업했지만 아직 커밋 전이다

변경과 대상 브랜치의 충돌 가능성을 확인한다. 안전하면 git switch -c feature/right-place로 현재 위치에서 새 브랜치를 만든다. 기존 대상 브랜치가 있다면 임시 커밋 또는 stash 후 이동한다. 중요한 untracked 파일을 먼저 확인한다.

4. 잘못된 브랜치에 이미 커밋했다

올바른 브랜치에서 git cherry-pick <commit>으로 가져온다. 잘못된 브랜치가 공유됐으면 그곳은 revert, 로컬 전용이면 검토 후 reset으로 정리한다.

5. .gitignore에 넣었는데 계속 보인다

이미 tracked인 파일은 ignore가 추적을 취소하지 않는다. git check-ignore -v 파일로 규칙을 확인하고, 저장소에서만 제거하려면 git rm --cached 파일을 사용한다. 비밀이 이미 커밋됐다면 추적 취소만으로 비밀이 폐기되지 않는다. 키를 즉시 회전하고 이력 정리는 별도 사고 절차로 한다.

6. 인증이 갑자기 실패한다

git remote -v로 SSH/HTTPS 방식을 확인하고 git ls-remote origin으로 읽기 연결을 시험한다. 토큰 만료, 계정 권한, SSO 승인, SSH agent와 키 등록을 해당 호스팅의 최신 공식 문서로 확인한다. 자격 증명을 채팅이나 이슈에 붙이지 않는다.

7. 파일명 대소문자만 바꿨는데 반영되지 않는다

대소문자를 구분하지 않는 파일 시스템에서는 중간 이름을 거친다.


git mv Readme.md temp-name.md
git mv temp-name.md README.md

8. 파일 전체가 변경된 것처럼 보인다

줄바꿈, 포매터, 파일 권한을 의심한다. git diff --ignore-space-at-eol, git diff --summary, .gitattributes, core.filemode을 확인한다. 원인을 고친 뒤 의도한 변경과 기계적 변경을 분리한다.

9. 큰 파일을 실수로 커밋해 push가 막힌다

아직 공유 전이면 커밋에서 파일을 제거하고 적절한 저장소나 Git LFS 정책을 정한다. 이미 공유했으면 단순 삭제 커밋은 과거 객체 크기를 줄이지 않는다. 호스팅 서비스와 팀의 이력 정리 절차, 백업, 강제 갱신 공지를 갖춘 뒤 수행한다.

10. rebase가 계속 멈춘다

각 과거 커밋을 새 기반에 순서대로 적용하므로 충돌이 여러 번 날 수 있다. 매번 status, 해결, add, rebase --continue를 반복한다. 방향을 잃으면 rebase --abort로 시작 전 상태로 돌아간다.

11. stash를 만들었는데 사라진 것 같다

git stash list, git stash show -p stash@{0}로 내용을 확인한다. pop은 적용 뒤 성공하면 항목을 제거하고, apply는 남긴다. 충돌 가능성이 있으면 apply 후 확인하고 수동 drop한다. untracked 포함 여부는 만들 때 옵션에 좌우된다.

12. IDE와 터미널 상태가 다르다

프로젝트 경로, Git root mapping, 선택 브랜치, Git executable, submodule/worktree 여부를 비교한다. IDE 새로고침 전에 CLI rev-parse --show-toplevelstatus로 실제 저장소를 확정한다.