실수로 날린 커밋, reflog로 되살리기

2025. 5. 30. 19:45·🖋️ TIL Journal
-->

 

너무 졸렸다..


이번주 내내 붙잡고 있던 개인 과제를 드디어 마무리했다. 아침 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
'🖋️ TIL Journal' 카테고리의 다른 글
  • 열거형(Enum)과 compactMap, flatMap
  • Closure.. 난 너가 밉다..
  • 꽤나 자주 보이던 키워드들 간단 정리
  • Convenience init과 프로퍼티
MoriOS
MoriOS
기억하기 위해 기록하는 공간 🖋️
  • MoriOS
    MoriOS
    MoriOS
  • 전체
    오늘
    어제
    • 분류 전체보기 (67)
      • 📌 Swift (12)
      • 📱 iOS (11)
      • 💡 Algorithm (1)
      • ❕Data structure (4)
      • 🪙 Python (0)
      • ⚙️ Git (3)
      • 🖋️ TIL Journal (33)
      • 📝 Etc (3)
  • 블로그 메뉴

    • GitHub
  • 인기 글

  • 태그

    updateconstraints
    스크롤 길이
    weak
    makeconstraint
    SnapKit
    Optional
    Codable
    cow 쓰기 복사
    커밋 아이콘
    remakeconstraints
    커밋 이모지
    swift optional
    static
    Split
    uikit
    prepareconstraints
    cow 값 타입
    프로그래머스
    git moji
    cow 참조 타입
    ios
    Components
    GitHub
    TiL
    셀 높이
    후행클로저
    제약조건 수정
    swift
    제약조건 변경
    swift cow
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
MoriOS
실수로 날린 커밋, reflog로 되살리기
상단으로

티스토리툴바