git reflog 기초

reflog란?

브랜치나 태그의 모든 변경사항을 기록한다.

The ‘reflog’ command keeps a Reference logs such as the commit snapshot of when the branch was created or cloned, checked-out, renamed, or any commits made on the branch are maintained by track of every single change made in the references (branches or tags) of a repository and keeps a log history of the branches and tags that were either created locally or checked out. Git and listed by the ‘reflog’ command. 참고링크 : Git Reflog — How To Recover A Deleted Branch That Was Not Merged




브랜치를 새로 만들면 git reflog에는 어떻게 기록될까?

현재 master에 체크아웃되어있는 상태에서 아래 명령어를 차례대로 입력했다.

1
2
3
4
5
6
7
8
9
git branch issue#654
$ git reflog
8bbfbb1b (HEAD -> master, origin/master, origin/HEAD, issue#654) HEAD@{0}: checkout: moving from issue#641 to master
(생략)

$ git branch
issue#641
issue#654
* master

위 출력값에서도 알 수 있듯이 아무런 기록이 되지 않는다.




새로 만든 브랜치에 체크아웃한다면 reflog에는 어떻게 기록될까?

현재 master브랜치에서 위에서 새로만든 issue#654로 체크아웃했다.

1
2
3
4
5
git checkout issue#654
$ git reflog
8bbfbb1b (HEAD -> issue#654, origin/master, origin/HEAD, master) HEAD@{0}: checkout: moving from master to issue#654
8bbfbb1b (HEAD -> issue#654, origin/master, origin/HEAD, master) HEAD@{1}: checkout: moving from issue#641 to master
(중략)

체크아웃을 하자마자 체크아웃이 reflog에 기록되었다.




브랜치를 삭제하면 reflog에는 어떻게 기록될까?

기껏 만든 issue#654 브랜치를 삭제해보자
issue#654브랜치를 삭제하기위해서는 다른 브랜치에 head가 있어야한다.
master브랜치로 체크아웃한 뒤 진행해보자.

1
2
3
4
5
6
7
8
9
10
git checkout master
$ git branch -d issue#654
$ git reflog
8bbfbb1b (HEAD -> master, origin/master, origin/HEAD) HEAD@{0}: checkout: moving from issue#654 to master
8bbfbb1b (HEAD -> master, origin/master, origin/HEAD) HEAD@{1}: checkout: moving from master to issue#654
8bbfbb1b (HEAD -> master, origin/master, origin/HEAD) HEAD@{2}: checkout: moving from issue#641 to master

$ git branch
issue#641
* master

브랜치 삭제하는 것은 로그가 찍히지 않는다.




브랜치를 되살려보자

삭제한 issue#654 브랜치를 되살려보자
HEAD@{0} 과 HEAD@{1}은 체크아웃상태밖에 없는데 어떤 걸로 체크아웃해야할까?
궁금해서 둘다 해봤다.

  1. HEAD@{0}: checkout: moving from issue#654 to master 을 되살리기

    1
    2
    3
    4
    5
    6
    git checkout -b issue#654 HEAD@{0}

    $ git branch
    issue#641
    * issue#654
    master
  2. HEAD@{1}: checkout: moving from issue#654 to master 을 되살리기

    1
    2
    3
    4
    5
    6
    git checkout -b issue#654 HEAD@{0}

    $ git branch
    issue#641
    * issue#654
    master

둘 다 브랜치를 살리는 동일한 결과를 가져왔고 head도 issue#654로 동일했다.




요약

  1. 브랜치 새로 생성은 로그가 찍히지않는다.
  2. HEAD@{1}은 issue#654브랜치를 새로만들고 체크아웃한 로그이다.
  3. HEAD@{0}은 issue#654브랜치에서 master브랜치로 체크아웃한 로그이다.
  4. 브랜치 삭제도 로그가 찍히지않는다.