Reflog와 clean은 비상시에 꺼내는 도구야
날마다 쓸 일은 없어야 하지만 필요한 날에는 정확히 알아야 하는 명령이 둘 있어. git reflog는 commit, reset, rebase, switch를 포함해 HEAD가 움직인 자리를 기본 90일 동안 기억하는 로컬 기록이야. 잃었다고 생각한 작업을 찾는 데 써. git clean은 작업 트리의 untracked file을 없애. 둘 다 로컬에만 작용하고, 부주의하면 재앙을 만들지만 신중하게 쓰면 재앙을 수습해.
흔한 상황은 이래. git reset --hard 뒤 하루치 작업을 잃었다고 느껴. 이때 더 움직이지 말고 git reflog부터 실행해. 최근 HEAD 이동이 번호와 함께 나타나며 HEAD@{0}은 현재, HEAD@{1}은 바로 전 자리야. 잃은 commit이 있는 entry를 찾아 git switch -c rescue HEAD@{3}로 branch를 만들거나 git reset --hard HEAD@{3}로 돌아갈 수 있어.
Reflog는 HEAD뿐 아니라 ref마다 따로 있어. git reflog show feature/x는 그 branch의 이동을 추적하고, git reflog --date=relative는 '몇 시간 전' 같은 상대 시간을 보여줘. 기본 90일은 설정할 수 있지만 보통 충분해. entry가 만료되면 해당 commit이 GC 대상이 되어 복구할 수 없게 될 수 있어.
git clean은 untracked file을 삭제해. 기본으로는 아무것도 하지 않고 -n(dry run)이나 -f(force)가 필요해. directory용 -d, ignored file까지 포함하는 -x를 조합하면 작업 트리를 git ls-files에 맞는 상태로 쓸어낼 수 있어. 반드시 git clean -ndx로 삭제 대상을 먼저 읽어. git clean -fdx는 그 목록을 확인하고 정말 원할 때만 실행해. Git이 추적하지 않은 파일에는 Git 쪽 복구 수단이 없어.