[Git] stash clear 복구

이지연·2025년 3월 20일

웹 CS (web CS)

목록 보기
7/19
post-thumbnail

🚀 개요

회사 프로젝트를 하다 보면 기획팀, QA팀과의 일정 조율 등 여러 이슈로 인해 변경한 소스코드를 원격 저장소에 바로 올리지 못하는 경우가 종종 있다. 이럴 때 임시로 stash에 저장해두곤 하는데, 나처럼 디자이너팀 요청으로 급하게 작업을 진행해야 하는 경우가 많다면 오래된 stash가 쌓이기 마련이다.

문제는, 프로젝트 소스는 계속해서 변경되기 때문에 오랫동안 묵혀둔 stash는 병합 과정이 필요하다는 점이다. 그래서 가끔 정리를 해줘야 하는데…

"이렇게 선택된 것만 지우면 되겠지?"
어느 날 문득 저장된 stash가 너무 많다고 느껴져 일부를 삭제하던 중, 갑자기 이런 생각이 들었다.

"선택된 stash만 한 번에 지울 수 있으면 편하겠는데?"

그렇게 과감하게 지우기 버튼을 눌렀고, 다음과 같은 경고 메시지가 나타났다.

"설마… 다 지워지겠어?"

약 5초 정도 고민하다가 무심코 예(Y) 를 눌렀다. 그리고 바로…

2년 1개월 치 stash, 흔적도 없이 사라지다
순간적인 실수로 인해 내가 그동안 쌓아온 수많은 stash가 한순간에 증발했다.
2년 넘게 보관해온 소중한 코드들이 단 한 번의 클릭으로 사라지는 모습을 그저 멍할뿐이였지만 어떻게든 복구를 해보겠다는 마음으로 이것저것 시도해본 방법들을 적어보겠다..




🚀 개선

방법1️⃣ git reflog stash로 기록 확인


1. reflog satsh 확인

git reflog stash
저장되어있는 stash 확인

2. reflog에 저장된 stash 적용

git stash apply stash@{0}

reflog에 남아있는 0번 스태시를 복구하고싶다면 위 명령어를 입력하여 복구 가능!
n번째라면 stash@{n}으로 입력하면 된다 끝!!

하지만 나의 경우 위에 출력된 stash는 전체삭제 이후 새롭게 저장한 Stash라 이미 intelliJ에서 확인되고 있음😭
따라서 위 방법은 패스!!

나의 경우 reflog에 뜬 Stashs는 이미 잘 저장되어있는 Stash.. 전체삭제된 내역들 복구 낸놔...

방법2️⃣ git reflog에서 Stash 관련 커밋 찾기

1. reflog 확인

git reflog

1. 저장된 reflog 중 Stash와 관련된 항목 확인 후 recover

git checkout -b recover-branch 해당 커밋 해시값

stash와 관련된 항목의 말머리는 stash: WIP on ... 이런식으로 시작되므로 발견되면 위 명령어 입력하면 끝!
( *hash 값은 작업환경마다 다르겠지만 나의 예시 화면에서 노란색 텍스트가 hash값이다. )

참조이미지를 보면 내 reflog에는 commit이며, merge며 다 있지만 stash와 관련된 reflog는 남아있지 않았기 때문에
이 방법 역시 패스😭😭😭



방법3️⃣ 유실된 커밋(dangling commit)을 찾고 가장 최근의 커밋을 확인


✅ a. 리눅스

1. dangling commit을 시간순으로 정렬하여 확인

git fsck --no-reflog | awk '/dangling commit/ {print $3}' | xargs -L 1 git --no-pager show -s --format="%ci %H" | sort

명령어 상세 설명

  • git fsck (file system check): Git 저장소의 무결성을 검사하는 명령어
  • --no-reflog : reflog에서 추적할 수 없는 객체도 포함하여 검사
  • awk : 텍스트를 필터링하고 가공하는 유틸리티
  • '/dangling commit/ {print $3}' :"dangling commit"이 포함된 줄에서 세 번째 열(해시 값) 만 출력
  • xargs -L 1: 앞 단계에서 추출한 각 해시를 한 줄씩 git show에 전달
  • git show -s: 특정 커밋의 메타데이터만 출력
  • --format="%ci %H" : 형식
    %ci: 커밋 날짜와 시간
    %H: 커밋 해시

2. 날짜를 보고 내가 추적하고 있는 stash가 무엇인지 추측하여 apply

git stash apply 해당 커밋 해시값

이후 자세한 방법은 아래의 출처를 확인해보도록!

출처: https://starkying.tistory.com/entry/restoring-git-stash [Random Access Memories:티스토리]

나의 개발환경에서는 위 명령어가 동작하지 X

해당 블로그를 참조해봤는데 awk 라는 명령어가 실행이 되지 않아 검색해보니 리눅스 명령어 같았다.
나는 window 환경이기때문에 다른 명령어를 찾아봐야했음


✅ b. window

1. dangling commit을 시간순으로 정렬하여 확인

git fsck --no-reflog | Select-String "dangling commit" | ForEach-Object { ($_ -split " ")[2] } | ForEach-Object { git show -s --format="%ci %H" $_ } | Sort-Object

명령어 상세 설명
git fsck --no-reflog: 삭제된 dangling commit 찾기
Select-String "dangling commit": "dangling commit"이 포함된 줄만 필터링
($_ -split " ")[2]: 해시 값을 추출
git show -s --format="%ci %H": 해당 커밋의 날짜와 해시 출력
Sort-Object: 날짜순 정렬

dangling commit이 날짜 순으로 정렬되어 출력!

(참고로 명령프롬프트에서 위 명령어가 실행되지 않아 IntelliJ의 터미널에서 실행하였다)

2. 날짜를 보고 내가 추적하고 있는 stash가 무엇인지 추측

git stash apply 해당 커밋 해시값

a방식과 마찬가지로 날짜를 보고 내가 추적하고자하는 stash가 무엇인지 추측해가며 적용 후 충돌 해결하는 과정을 거쳐가며 해결 완료 ㅎ..




  • 2년 1개월간의 회사 프로젝트의 모든 스태시가 확인되었고 날짜로 유츄해가며 충돌해결하고 작업화면 확인하는 노가다 과정을 거쳤다... NotePad에서 복붙 노가다를 하는데 무려 109개 ㅎ

🚀 마치며

"삭제 관련 경고 메시지 앞에서는, 5초가 아니라 5분이라도 고민하자."

profile
Eazy하게

0개의 댓글