삭제한 옛날 branch 살리기
모르고 삭제해버린 옛날 브랜치 되살리기
issue 작업을 끝내고 PR날리고 dev브랜치와 issue737브랜치를 master로 병합 후 깔끔하게 삭제했다. 그 뒤로 수많은 커밋을 master로 날리고 새로운 issue641브랜치 생성하여 커밋을 날렸다. 날렸는데
앞으로 일어날 일에 대해서는 전혀 알지못한채… 깔끔 IS THE BEST라고 생각하며…
하지만 PR날린게 conflicts 나면서 다시 그 브랜치가 필요해졌다!!!
망함.
심장부여잡고 폭풍검색한 끝에 reflog
란 명령어가 있다는 사실을 알았다.
현재 내 상황
- master브랜치에서 dev브랜치를 생성
- dev브랜치 커밋날리고 master브랜치로 병합
- dev브랜치 삭제
- master브랜치에서 issue737브랜치 생성
- issue737브랜치 커밋날리고 master브랜치로 병합
- issue737브랜치 삭제
- master브랜치에서 issue641브랜치 생성
- issue641브랜치 커밋날림. (병합안함)
이 상황에서 나는 dev브랜치와 issue737브랜치를 살려야 한다.
그것도 각 브랜치의 커밋과 함께!!
할 수 있을까?
reflog란?
브랜치나 태그의 모든 변경사항을 기록한다.
참고링크 : reflog기초
내 상황을 reflog를 통해 들여다보자.
1 | $ git reflog |
- HEAD@{12} : 레포 클론해옴
- HEAD@{10}과 HEAD@{11}은 그냥 무시해도 됨.dev에서 커밋해야하는데 master에서 커밋해버려서 커밋삭제한 로그임ㅋㅋㅋ
- HEAD@{9} : dev브랜치생성후 dev브랜치로 체크아웃
- HEAD@{8} : dev브랜치에서 커밋날림
- HEAD@{7} : dev브랜치에서 master브랜치로 체크아웃
- HEAD@{6} : master브랜치로 dev브랜치 병합 후 삭제
- HEAD@{5} : master브랜치에서 issue737브랜치 생성 후 체크아웃
- HEAD@{4} : issue737브랜치에서 커밋날림
- HEAD@{3} : master브랜치로 체크아웃
- HEAD@{2} : master브랜치로 issue737브랜치 병합 후 삭제
- HEAD@{1} : master브랜치에서 issue641브랜치 생성 후 체크아웃
- HEAD@{0} : issue641브랜치에서 커밋날림
여기서 dev와 issue737을 각각 커밋과 함께 살려야한다.
해결순서
git branch
: 현재 내가 가지고 있는 브랜치 확인하기git reflog
: HEAD가 가리키는 커밋이 바뀔 때마다 Git은 자동으로 그 커밋이 무엇인지 기록한다. 새로 커밋하거나 브랜치를 바꾸면 Reflog도 늘어난다. 참고링크- 삭제한 브랜치 찾기
git checkout -b [deleted-branchName] HEAD@{number}
: 삭제한 브랜치 커밋 되돌리기- 그런데 삭제한 브랜치에 대해 수많은 로그가 있는데 그 중 어떤 로그를 되돌려야할까??
- 실험결과 ** merge 브랜치명: Fast-forward ** 로그를 되돌려야 해당 브랜치의 커밋까지 살아난다!!
1 | //기본값 |
실험 : 수많은 로그중에 어떤 로그를 써야 내가 원하는대로 각 브랜치의 커밋까지 그대로 살아날까?
- 첫번째 시도 :
HEAD@{8}: checkout: moving from dev to master
1 | $ git checkout -b dev HEAD@{8} |
- 첫번째 시도 결과 :
- dev브랜치에서
code .
로 열였을때 내가 작성한 커밋이 반영되어있지않았다. - master브랜치
code .
로 열였을때 내가 작성한 issue737까지 포함된 커밋이 그대로 보존되어있었다. - 결론 : master브랜치의 상태에 변화를 주지않고 dev브랜치만 살아나는 데 dev에서 커밋한 내용은 없음.
- dev브랜치에서
- 두번째 시도 :
HEAD@{3}: merge issue737: Fast-forward
1 | $ git checkout -b issue737 HEAD@{3} |
두번째 시도 결과 :
- issue737브랜치에서
code .
로 열였을때 내가 작성한 커밋이 그대로 보존되어있었다. - master브랜치
code .
로 열였을때 내가 작성한 issue737까지 포함된 커밋이 그대로 보존되어있었다. - 결론 : master브랜치의 상태에 변화를 주지않고 issue737브랜치만 살아난다! 되살리기 성공!
- issue737브랜치에서
실험 결론 : ** merge 브랜치명: Fast-forward **를 되돌려야 해당 브랜치의 커밋까지 살아난다!!
실무에선 추가로 생성한 branch는 보통 언제 삭제할까?
깔끔한게 좋다며 괜히 브랜치 삭제해서 진짜 큰일 날뻔했다.
도대체 새로 생성한 브랜치는 언제 삭제하는 지 궁금해져서 보라님께 물어봤다.
아래 두가지 경우에서 삭제한다고 한다.
- PR날려서 머지되면 삭제함.
- 어차피 회사가면 jenkins라는 툴로 브랜치관리함.