너무 졸렸다..
이번주 내내 붙잡고 있던 개인 과제를 드디어 마무리했다. 아침 9시부터 밤 11시 넘게 작업해서 Lv6까지 완성했고, 이제는 push만 하면 되는 상태였다.
마지막 커밋도 다 마치고, 습관적으로 git push를 날렸다. 그런데… 응? PR(Pull Request) 버튼이 안 보이네..? 왜..?
알고 보니 같은 브랜치에서 동일한 주소로 보낸 PR이 아직 열려 있었던 것이다..
알고보니 같은 브랜치에 동일한 주소로 PR이 열려있으면, commit이 그 PR에 합쳐진다. 무의식중에는 알고 썼는데, 피곤하고 자고싶은 마음에 머릿속으로 생각을 못하고 push를 질러버린 나였다.. 하지만 진짜 문제는 이게 아니였다는게 함정.. 😂😂
😱 나는 왜 reset을 쳤는가...
PR이 이상하게 합쳐졌다는 사실에 당황한 나는, 졸린 상태에서 급하게 해결하려고 GPT에게 물어보고, 내용도 제대로 안 보고 명령어를 따라 쳤다. (진짜 왜 그랬을까..)
git reset --hard
- 이름만 보고 대충 원격 PR만 초기화될 줄 알고 실행했는데,
- 로컬 작업이 전부 날아갔다… (이때는 확인을 안해서 몰랐음…)
- 이어서
git push --force
- 원격도 통째로 날아감…
- 지금까지 쌓은 커밋 3개는 로컬에도, 원격에도 완전히 사라진 상태
새벽 12시 넘어서 작업물이 다 날아간 그 순간, 졸린게 문제가 아니라 진짜 멘붕이 왔다…
복구하자.. - git reflog
“지웠다고 생각한 커밋도, 사실은 로그 안에 남아있다.”
언넝 끝내고 자야한단 생각에 정신을 붙잡고 검색을 해보다가 git reflog
라는 명령어를 알게 되었다.
git reflog
를 실행하자, 내가 날렸던 과거 커밋의 해시값들이 그대로 남아있었다..!
바로 git reset --hard HEAD@{1}
(바로 직전의 커밋 지점)로 커밋을 이전 상태로 되돌렸고, 로컬 작업은 다시 살아났다! (커밋은 살아있고 push만 안 된 상태됨)
안전하게 다시 만들기
이제는 실수하지 않기 위해 아래처럼 새 브랜치를 생성해서 복구된 작업을 따로 관리했다.
git checkout -b Mori_feature/lv6
git push origin Mori_feature/lv6
이렇게 새 브랜치를 따서 무사히 새로운 PR을 올렸다. 👍
공부한 이후 생각한 안전한 방법
1. cherry-pick으로 새로운 브랜치 만들기
# 1. 현재 커밋 로그 확인
git checkout MoriOS
git log --oneline
# 결과 예시
f5f5f5f [커밋5] - 세 번째 기능 추가
d4d4d4d [커밋4] - 두 번째 기능 추가
c3c3c3c [커밋3] - 첫 번째 기능 추가
b2b2b2b [커밋2] - 초기 세팅 완료
a1a1a1a [커밋1] - 프로젝트 시작
# 2. 새 브랜치 생성
git checkout -b NewMoriOS
# 3. 3개 커밋만 cherry-pick
git cherry-pick c3c3c3c d4d4d4d f5f5f5f
# 4. 새 브랜치 원격에 push
git push origin NewMoriOS
2. 원래 브랜치(MoriOS)에서 3개 커밋 제거
# 1. MoriOS 브랜치로 이동
git checkout MoriOS
# 2. 초기 2개 커밋까지 reset (로컬)
git reset --hard b2b2b2b # 커밋2 기준
# 3. 원격도 강제로 덮어쓰기 (기존 PR 내용 정리됨)
git push origin MoriOS --force
→ 이제 원하는 대로 정리가 완성되었다.
📚 명령어
✅ git reset
어제 내 코드를 날려버린 원인… 어제는 급했지만 오늘은 정확히 정리해본다.
git reset
은 브랜치가 가리키는 커밋 위치(HEAD)로 돌아가는 명령어다.- → 일종의 버전 되돌리기 기능이다.
- 여기에
--hard
옵션을 붙이면→ 즉, 커밋도, 코드 파일도 그 시점으로 덮어써짐 - → 해당 커밋 시점의 코드 상태까지 작업 디렉토리에 반영됨
git reset --hard
✅ git reflog
진짜 나를 살린 명령어…!
HEAD
가 어떤 커밋을 가리켰었는지를 시간순으로 보여주는 로그reset
이나rebase
처럼 히스토리에서 사라진 커밋도 해시값으로 추적 가능- 이 해시를 이용해서 실수로 날린 커밋 복구 가능!
git reflog
git reset --hard <원하는 커밋 해시>
✅ git cherry-pick
이건 나중에 알게 된 대체 방법. 실수 없이 PR을 분리하려면 이렇게 했어야 했다.
- 특정 커밋 하나 또는 여러 개 골라서 가져오는 명령어
- 필요한 커밋만 선택적으로 가져오는 방식
git cherry-pick <커밋 해시>
💡 이번 경험에서 배운 점
- 같은 브랜치로는 PR을 하나만 보낼 수 있다
- → 새로운 PR을 생성하려면, 기존 PR을 닫거나, 새 브랜치에서 새 PR을 만들어야 한다
- reset –hard는 로컬 작업까지 삭제한다는 걸 반드시 ㅈ기억할 것
- → 무턱대고 쓰면 진짜 다 날아간다.. 진짜..
- reflog는 진짜 망했을때의 마지막 희망이다
- → 로컬 전용이다. 이미 clone을 다시 받았거나, 로컬 저장소 자체를 삭제했다면.. 유감이다..
마무리 후기
이 실수 덕분에 reset
, reflog
, cherry-pick
같은 명령어에 대해 공부하고 써볼 수 있었다.
중요한 프로젝트가 아니었기에 다행이었고, 실전에서 실수 안 하도록 기억에 남아서 오히려 좋았다.(저 새벽에는 아니었지만..)
이제부터는 GPT에게 물어보더라도 내가 직접 확인하고 실행하자… 😂
'🖋️ TIL Journal' 카테고리의 다른 글
열거형(Enum)과 compactMap, flatMap (0) | 2025.06.04 |
---|---|
Closure.. 난 너가 밉다.. (0) | 2025.06.02 |
꽤나 자주 보이던 키워드들 간단 정리 (0) | 2025.05.29 |
Convenience init과 프로퍼티 (0) | 2025.05.28 |
guard문과 Closure (0) | 2025.05.27 |