Antilog의 개발로 쓰다
article thumbnail
반응형

서론

SOPT 30th 앱잼을 진행하며 Git 에 대해 많은 이슈를 겪는 경우를 보았습니다.

주로 SOPT 에서는 많은 분들이 GitKraken 혹은 GUI 툴을 많이 사용하시는 것을 보았습니다. GUI 툴도 많은 기능을 제공하지만 쉽게 사용할 수 있다는 것에서 특히 reset 의 경우 이를 되돌릴 수 있다는 점을 모르시는 경우도 많다고 생각되어 포스팅을 하게 되었습니다.

Git Reset --hard 는 복구할 수 없다?

결론을 먼저 말하면 그렇지 않다 입니다.

git 에서 저장되는 commit 의 경우는 쉽게 삭제되거나 사라지지 않습니다.
우리가 보는 git log 의 경우는 해당 브랜치에서 그래프 형태로 참조중인 변경사항의 연속을 보는 것과 같습니다.
만약 우리가 commit 을 한다면 그래프에 새로운 참조를 연결하는 느낌이며 reset을 사용하면 지정한 커밋 이후의 참조를 끊어버리는 형식이므로 커밋 자체는 남아있다고 볼 수 있습니다.

reflog?

git 에서 사라진 참조의 commit 을 찾기 위해서는 git reflog 라는 명령어를 사용합니다.

reflog의 ref 는 reference 를 뜻합니다.
즉, 지금까지 커밋을 참조한 기록을 본다는 명령어로 해석할 수 있습니다.
실제로 명령어를 사용하면 아래와 같은 화면을 보실 수 있습니다.

로그 정보를 보시면 어떤 시점에 커밋의 참조를 변경했었는지, reset 을 통해 어떤 커밋으로 참조를 변경했는지, 언제 새로운 커밋의 참조를 하는지 등을 확인 하실 수 있습니다.

git reset --hard 복구하기

예를 들어 다음과 같은 커밋 id 로 여러번의 커밋을 진행했다 생각해봅시다.

c1c2c31 -> d1d2d31 -> e1e2e31

이때 다음과 같은 명령어로 d1d2d31 으로 reset hard 를 진행한 상황이라고 가정합니다.

$ git reset --hard d1d2d31

다음과 같은 상황에 이미 진행한 reset hard 를 복구하고 싶다면 reflog 명령어를 이용하면 쉽게 해결 할 수 있습니다.

$ git reflog

-> 출력
d1d2d3d1 HEAD@{0}: reset: moving to d1d2d31
e1e2e31 HEAD@{1}: commit: message3
d1d2d3d1 HEAD@{2}: commit : message2
c1c2c31 HEAD@{3}: commit: message1

reflog 명령어를 사용하면 위와 같은 로그를 보실 수 있습니다.
이때 자세히 읽어보시면 reset 을 진행한 참조 로그와 2번째 커밋을 한 참조 로그의 커밋 id 가 같은 것을 확인하실 수 있습니다.
이를 이용하여 commit id 를 이용하거나 commit 참조 값을 이용하여 reset hard 를 되돌릴 수 있습니다.

$ git reset --hard e1e2e31
or
$ git reset --hard HEAD@{1}

위 명령어인 reset hard 를 통해 reset hard 를 복구하실 수 있습니다.

반응형
profile

Antilog의 개발로 쓰다

@Parker_J_S

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...