잘못된 pull, rebase, reset에서 회복하기
언젠가는 Git 명령 뒤 빨간 문장이 쏟아져 가슴이 철렁할 거야. 좋은 소식은 작업을 잃었다고 느끼는 상황 대부분이 복구 가능하다는 거야. 절차는 늘 같아. 파괴적인 명령을 더 실행하지 말고 git reflog에서 잃은 tip을 찾아 branch로 붙잡은 뒤 상태를 평가하고 통합 방법을 골라.
첫 동작은 git reflog --date=relative -n 50야. 지난 90일의 HEAD 이동과 시간이 보이고, 대개 파괴적인 명령 바로 전 entry가 원하는 상태야. 각 entry의 hash는 실제로 돌아갈 수 있는 commit이야. rescue할 target을 확인하기 전에는 상황을 더 바꾸는 명령을 실행하지 마.
다음은 git switch -c rescue HEAD@{N}으로 잃은 tip에 branch를 붙이는 일이야. git log rescue --oneline에서 찾던 작업이 맞고 commit이 빠지지 않았는지 확인해. 여기까지 왔다면 재앙은 끝났어. 원래 branch를 git reset --hard rescue로 되돌리거나, 필요한 commit만 git cherry-pick하거나, rescue branch를 나란히 보존할 수 있어.
흔한 경우는 셋이야. 원치 않은 merge commit을 만든 pull은 git reset --hard ORIG_HEAD로 pull 전으로 돌아가 git pull --rebase로 다시 할 수 있어. rebase 중 해결하기 어려운 conflict에 빠졌다면 git rebase --abort하고, 이미 잘못된 결과까지 만들었다면 git reflog와 git reset --hard HEAD@{N}을 써. force-push로 동료 작업을 덮었다면 그들의 reflog나 네가 마지막 fetch 때 본 reflog entry에서 tip을 찾아 조율한 뒤 git push --force-with-lease로 HEAD@{N}의 작업을 복구해.