Git은 신기하게도 다들 똑같은 실수를 해요. 커밋하자마자 메시지 오타를 발견하고, 엉뚱한 파일을 add 해버리고, 이미 팀에 공유된 커밋을 reset으로 지우려다 사고를 키우죠. 저도 신입 때 빌드 폴더를 통째로 커밋해서 저장소를 몇백 메가로 부풀려 놓고 선배한테 혼난 적 있어요. 오늘은 제가 직접 겪고 옆에서도 숱하게 본 흔한 실수들을 삽질담과 함께 하나씩 풀어볼게요. 한 번씩 읽어두면 나중에 똑같은 상황에서 "아, 그거"하고 바로 손이 나가요. 실수 자체보다 실수하고 나서 어떻게 수습하느냐가 실력이거든요.

88.1 방금 커밋 메시지에 오타가 났어요?

커밋하고 엔터 치는 순간 눈에 딱 들어오는 오타. 진짜 흔해요. "로그인 기능 추가"를 "로긴 기능 추가"라고 쳤다든가요. 다행히 아직 push 안 했다면 아주 쉽게 고쳐요. git commit --amend를 쓰면 방금 한 커밋을 새로 갈아끼울 수 있어요.


$ git commit --amend -m "제대로 된 커밋 메시지"
[main 687d6de] 제대로 된 커밋 메시지
1 file changed, 1 deletion(-)


--amend(수정하다)는 메시지만 바꾸는 게 아니에요. 방금 커밋에서 파일 하나를 깜빡했을 때도 그 파일을 git add 한 다음 --amend 하면 지난 커밋에 슬쩍 끼워 넣을 수 있어요. 단, 딱 하나만 기억하세요. 이미 push한 커밋은 amend 하지 마세요. amend는 커밋을 통째로 새것으로 바꾸는(해시가 달라지는) 거라서, 남들이 이미 받아간 커밋을 바꾸면 히스토리가 어긋나서 팀원들이 골치 아파져요.

88.2 git add를 잘못했는데 되돌리는 법이 있나요?

이것도 하루에도 몇 번씩 하는 실수예요. 급하게 git add .로 전부 담았는데, 알고 보니 커밋하면 안 되는 임시 로그 파일까지 딸려 들어간 거죠. 지금 상태를 보면 이래요.


$ git status --short
A temp.log


맨 앞의 A스테이징(staging, 커밋 대기 줄에 올라간 상태)됐다는 뜻이에요. 이 파일만 대기 줄에서 빼려면 git restore --staged를 써요.


$ git restore --staged temp.log
$ git status --short
?? temp.log


A??(깃이 추적 안 하는 파일)로 바뀌었죠. 파일 내용은 그대로 두고 대기 줄에서만 뺀 거예요. 참고로 스테이징이 아니라 파일 편집 자체를 통째로 되돌리고 싶으면 git restore 파일명(--staged 없이)을 쓰면 마지막 커밋 상태로 되돌아가요. 이건 편집한 내용이 사라지니 정말 버려도 될 때만 쓰세요.


제가 실제로 많이 본 사고는 데이터베이스 접속 정보가 든 .env 파일을 git add .로 같이 담아버리는 거예요. 커밋하기 전에 항상 git status로 대기 줄에 뭐가 올라갔는지 한 번 훑어보는 습관, 이거 하나가 사고를 정말 많이 막아줘요. 눈에 낯선 파일이 보이면 커밋 전에 restore --staged로 빼면 되니까요.

88.3 이미 push한 커밋은 reset으로 지우면 되죠?

아니요, 여기가 초보들이 가장 크게 사고 치는 지점이에요. 혼자 쓸 때 커밋 되돌리던 습관대로, 팀에 공유된 커밋을 git reset --hard로 지우고 강제 push 하면 그 사이 다른 사람 작업까지 날아가거나 히스토리가 엉켜요. 공유된 역사는 지우는 게 아니라 덧칠하는 거예요. 그 도구가 git revert예요.


예를 들어 비밀번호가 담긴 파일을 실수로 커밋해서 이미 push까지 했다고 해봐요.


$ git log --oneline
cc393ea 실수로 비밀번호 커밋
0cd0e48 정상 작업
$ git revert --no-edit HEAD
[main 4a1a6bb] Revert "실수로 비밀번호 커밋"
1 file changed, 1 deletion(-)


revert는 문제의 커밋을 지우는 게 아니라, 그 커밋을 정반대로 되돌리는 새 커밋을 하나 더 얹어요. 로그를 보면 원래 커밋은 그대로 있고 그 위에 Revert 커밋이 생겼죠.


$ git log --oneline
4a1a6bb Revert "실수로 비밀번호 커밋"
cc393ea 실수로 비밀번호 커밋
0cd0e48 정상 작업


이러면 남의 작업을 건드리지 않고도 실수를 무를 수 있어요. --no-edit는 되돌림 커밋 메시지를 자동으로 채워달라는 옵션이에요. 붙이지 않으면 편집기가 열리는데, 당황하지 말고 그대로 저장하고 닫으면 돼요. 다만 한 가지, revert는 파일을 되돌릴 뿐 과거 커밋 안에 박힌 비밀번호 자체는 히스토리에 남아요. 진짜 유출된 비밀번호라면 revert로 끝내지 말고 반드시 그 비밀번호를 즉시 폐기하고 새로 발급하세요. 이건 팀에서 정말 중요한 원칙이에요.

88.4 큰 파일을 실수로 커밋해버렸어요?

제 신입 시절 그 사고예요. 빌드 산출물이나 수십 메가짜리 압축 파일을 무심코 git add .로 담아 커밋하는 거죠. 아직 push 전이라면 깔끔하게 정리할 수 있어요. 방금 커밋만 취소하되 파일은 남겨두는 git reset --soft HEAD~1를 써요.


$ git log --oneline
edea1df 빌드 산출물 실수로 포함
62e5816 코드
$ git reset --soft HEAD~1


87편에서 봤던 --soft죠. 커밋만 풀고 내용은 그대로 둬요. 이제 그 큰 파일이 다시는 안 따라오게 .gitignore(깃이 무시할 파일 목록)에 등록하고, 이미 대기 줄에 올라간 건 git rm --cached로 빼요.


$ echo "*.zip" > .gitignore
$ git rm --cached huge.zip
$ git add .gitignore
$ git commit -m "코드만 다시 커밋"


git rm --cached는 실제 파일은 디스크에 남기고 깃의 추적에서만 빼는 명령이에요. 이제 커밋에는 코드만 깔끔하게 들어가고, huge.zip은 .gitignore 덕분에 앞으로 git add .를 해도 안 딸려와요. 한 가지 주의할 점은, 이미 push까지 해서 다른 사람이 받아간 큰 파일은 이 방법으론 히스토리에서 못 지워요. 그건 전용 도구가 필요한 더 큰 일이라, 그렇게 되기 전에 .gitignore를 프로젝트 시작할 때 미리 만들어 두는 게 최고의 예방책이에요.

88.5 오늘 정리

흔한 실수 네 가지를 정리할게요. 커밋 메시지 오타는 push 전이면 git commit --amend로 고치고, 잘못 add 한 건 git restore --staged 파일명으로 대기 줄에서 빼세요. 이미 push한 커밋은 절대 reset으로 지우지 말고 git revert로 되돌리는 새 커밋을 얹으세요. 큰 파일을 잘못 담았으면 push 전에 git reset --soft로 커밋을 풀고 .gitignoregit rm --cached로 정리하면 돼요. 공통 교훈은 딱 하나예요. push 전이면 대부분 조용히 고칠 수 있고, push 후엔 덮어 지우지 말고 덧붙여 무른다. 이 감각만 있으면 실수해도 크게 안 다쳐요.