본문 바로가기
목차
utils/git and github

Relative Reference-Git-caret and tilde + Reflog Reference

by ds31x 2025. 7. 24.
728x90
반응형

Git에서 commit을 가리킬 때 Absolute reference와 Relative reference, Reflog Reference 의 세가지 방식이 있음.

  • Absolute reference: commit id를 사용함.
  • Relative reference: tilde(~)와 caret(^)
  • Reflog reference: at(@) 을 사용함.

SHA1 으로 작성된 commit id로 지정하는게 가장 확실하지만,

현재 HEAD로부터 이전 몇 단계를 되돌리는 등의 task에선 Relative reference가 보다 편리함.

Reflog Reference는 reset등으로 사고(?) 발생시 없어진 commit을 찾기 위한 방법.

 

이 문서는 Relatrive Reference와 Reflog Reference 간략히 다룸.

https://lukeit.tistory.com/23

 


~ (Tilde): Ancestor Reference

~ (Tilde)는 int와 함께 쓰여져서 "몇 번째 조상"에 해당하는 commit을 가리킴.

  • 주의할 점은 항상 첫번째 parent (merge 가 수행될 때의 branch의 parent를 첫번째 parent라고 부름)을 따라 올라감.
  • 조선 시대의 족보로 생각하면... 친가쪽을 애기한다고 보면 됨.
  • linear history에서 주로 이용됨.

^ (Caret): Parent Reference

^ (Caret)도 int와 함께 쓰여지지만, "몇 번째 부모"에 해당하는 commit을 가리킴.

  • HEAD^ 또는 HEAD^1HEAD~1 과 같이 첫번째 부모를 가리킴.
  • 일반적으로 merge가 일어난 commit 등을 제외하면 parent commit은 1개인 점을 주의할 것.
  • merge결과로 만들어진 commit (=merge commit)의 경우는 부모가 2개임: ^이 필요한 부분임.
  • HEAD^2 는 merge 명령어에서 인자로 넘겨진 브랜치에 존재하는 직전 commit을 가리킴.
  • merge가 이루어진 history에서 주로 이용됨.

Example for Relative Reference

다음 그림은 ATLASSIAN의 git 튜토리얼에서 가져온 그림으로 이를 이해하는 것이 목적임.

https://www.atlassian.com/ko/git/tutorials/refs-and-the-reflog: hypen으로 보이는 것이 사실은 tilde임.

 

A commit을 기준으로 기재된 것으로 Ancstor와 Parent의 차이를 쉽게 이해할 수 있음.


@ (at)의 사용법

크게 보면 Relative Reference 이지만,
이는 HEAD의 과거 이력을 나타내는 Reflog를 이용하는 Reflog Reference 라고 명칭하는게 보다 정확함.

이름 그대로 Reflog (=Reference Log)를 참조하는 방식으로 HEAD와 같은 참조가 과거에 가리키던 commit의 이력을 이용함.
결국 개발자가 최근에 한 작업 HEAD의 순서대로 commit을 찾아감.

  • @{0} 또는 그냥 @: HEAD가 현재 가리키는 위치 (즉, HEAD와 동일).
  • @{1}: HEAD가 한 단계 전에 있었던 위치.
  • @{n}: HEAD가 n 단계 전에 있었던 위치.
  • main@{yesterday}: main 브랜치가 어제 가리켰던 커밋. (시간 기반 참조도 가능)

Reflog의 강점은 git reset으로 branch에서 제거된 commit도 가리킬 수 있다는 점임.
다음 example을 참고할 것.


Example for Reflog Reference

  1. commit을 수행. (commit 이후, HEAD의 commit id는 A 라고 가정)
  2. 실수로 git reset --hard HEAD~1을 실행. (HEAD는 A의 부모로 이동)
  3. A는 branch에서 사라지게 됨. 하지만 Reflog에는 남아있음.
  4. git reflog를 보면 HEAD@{1}이 A를 가리킴을 확인 가능.
  5. git reset --hard @{1} 명령을 사용하면 A를 복구 가능.
    • reset은 공동작업에선 쓰기 어려운 경우가 많음: branch를 되돌리기 때문에 다른 개발자들의 기록과 충돌나기 쉬움.
    • 개인적으로git switch -c recovered_branch @{1}을 선호함.

같이 보면 좋은 자료들

https://www.atlassian.com/ko/git/tutorials/refs-and-the-reflog

 

Git Refs: 알아야 할 사항 | Atlassian Git Tutorial

git ref는 커밋을 간접적으로 참조하는 방식이며 커밋 해시에 대한 사용자 친화적인 별칭입니다. Git의 reflog를 사용하여 겉보기에 “손실된” 커밋을 되살려보겠습니다.

www.atlassian.com

 

https://lukeit.tistory.com/23

 

Git 파일 관리

Git 명령어 정리파일 관리git add : 변경된 파일 하나만 Staging Area로 추가합니다.git add .: 모든 파일 변경 사항을 한번에 Staging Area로 추가합니다.git add -p: 파일을 세부적으로 hunk 단위로 나눠서 Staging

lukeit.tistory.com

 

728x90