본문 바로가기
프로그래밍/etc. (Language)

[GIT] git reset 또는 여러 명령어 취소하는 방법 (git reflog)

by _BlankSpace 2018. 4. 24.

상황


[1]

오늘도 git에 코드를 업데이트하기 위해서 로컬에서 작업을 하고 있는데..

로컬에만 commit을 해놓고, git push를 하지 않은 상태에서 reset으로 작업한 commit을 날릴 경우..


[2]

이전 커밋에서는 잘 동작하던 코드가 추가 작업을 하다 보니, 빌드가 안되기 시작..

git reset으로 이전 상태로 돌아가서 확인하고, 다시 돌아오려니, 커밋이 사라져버리는 경우..

(물론, 이런 경우는 git checkout을 이용하거나, git show를 이용하는 게 훨씬 안전할 듯..)


이미 일은 저질러버린 경우인데.. 로컬 commit들을 다시 살릴 수 있을까..


git reflog를 이용하자.


다행히, 친철하신 git 님은 이러한 문제를 해결하기 위한 방법을 만들어 놓으셨다.


바로 reflog라는 명령이이다.

먼저, git reflog로 뭘 하는 지 확인해보자.

1
git reflog
cs


1
2
3
4
bs@ubuntu:test$ git reflog
2f6a6e0 HEAD@{0}: commit: test2
1fa8098 HEAD@{1}: commit: test1
d955248 HEAD@{2}: commit (initial): first commit
cs


위처럼, git 명령어 내용들이 전부 나온다.

history 명령어와 같다고 생각하면 된다.


이제, git을 reset 으로 날려버리는 상황을 만들어 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
bs@ubuntu:test$ git reset --hard HEAD~
HEAD의 현재 위치는 1fa8098입니다 test1
bs@ubuntu:test$ git pl
* 1fa8098 - (HEAD -> master) test1 (2분 전) <bs>
* d955248 - (origin/master) first commit (13분 전) <bs>
 
bs@ubuntu:test$ git reflog
1fa8098 HEAD@{0}: reset: moving to HEAD~
2f6a6e0 HEAD@{1}: commit: test2
1fa8098 HEAD@{2}: commit: test1
d955248 HEAD@{3}: commit (initial): first commit
bs@ubuntu:test$ git reset --hard HEAD@{1}
HEAD의 현재 위치는 2f6a6e0입니다 test2
cs

위의 예제를 보면, git을 reset 한 후에, reflog로 다시 확인한 경우이다.


이제 reset 했던 명령어를 되돌려보자.

이때도 마찬가지로 git reset을 이용한다.

다시 돌아가야할 위치는 HEAD@{1}이므로, git reset --hard HEAD@{1} 을 입력하자.


이후, 다시 로그를 확인하면, 원래대로 돌아오는 것을 확인할 수 있을 것이다.

1
2
3
* 2f6a6e0 - (HEAD -> master) test2 (26분 전) <bs>
* 1fa8098 - test1 (27분 전) <bs>
* d955248 - (origin/master) first commit (38분 전) <bs>
cs


자주 일어나는 상황이므로, 처음부터 작업하지 않고 해당 방법을 이용해서 갱생(?)의 기회를 얻어보자..

댓글