[Git] git reset

업데이트:     Updated:

카테고리:

태그:

🎯git reset 명확히 알고 가기

3개의 트리

  • HEAD: HEAD는 현재 브랜치를 가리키는 포인터이며, 브랜치는 브랜치에 담긴 커밋 중 가장 마지막 커밋을 가리킨다.
  • Index:
    • Index는 바로 다음에 커밋할 것들이다. 이런 개념을 Staging Area라고도 한다.
    • Staging Area는 사용자가 git commit 명령을 실행했을 때 Git이 처리할 것들이 있는 곳이다.
    • Index는 엄밀히 말해 트리구조는 아니다. 여기서는 쉽게 이해할 수 있도록 그냥 트리라고 설명한다.
  • Working Directory: 위 두개의 트리는 .git 디렉토리에 저장되고 사람이 알아보기 어렵다 하지만 워킹 디렉토리는 바로 눈에 보이고 알아보기 쉽게 파일로 존재한다.

워크플로

image

1️⃣ file.txt-v1 파일이 있는 디렉토리로 이동하고 git init 명령을 실행한다.

image

  • master 브랜치는 아무런 커밋 객체도 가리키고 있지 않다.
  • 이 시점에서는 워킹 디렉토리 트리에만 데이터가 있다.

2️⃣ git add 명령으로 워킹 디렉토리의 내용을 Index로 복사한다.

image

3️⃣ git commit 명령을 실행한다.

image

  • Index의 내용을 스냅샷으로 영구히 저장하고 그 스냅샷을 가리키는 커밋 객체를 만든다.
  • 그리고는 master가 그 커밋 객체를 가리키도록 한다.
  • 이떄 git status 명령을 실행하면 아무런 변경 사항이 없다고 나온다. 세 트리 모두가 같기 때문이다.

4️⃣ 파일을 file.txt-v2 로 변경한다.

image

  • git status 명령을 실행하면 “Changes not staged for commit” 아래에 file.txt-v2 파일을 볼 수 있다.
  • Index와 워킹 디렉토리가 다른 내용을 담고 있기 때문에 그렇다.

5️⃣ git add 명령을 실행한다.

image

  • git status 명령을 실행하면 “Changes to be committed” 아래에 file.txt-v2 파일 이름이 녹색으로 변한다.
  • 다음 커밋할 것과 마지막 커밋이 다르다.

6️⃣ git commit 명령을 실행한다.

image

  • git status 명령을 실행하면 아무것도 출력되지 않는다. 세 개의 트리 내용이 모두 같기 때문이다.
  • 브랜치를 바꾸거나 Clone 명령도 내부에서는 비슷한 절차를 밟는다.
  • 브랜치를 Checkout 하면, HEAD가 새로운 브랜치를 가리키고 변경된 브랜치의 최신 커밋의 스냅샷을 Index에 놓는다. 그리고 Index의 내용은 워킹 디렉토리로 복사된다.

reset의 역할

image

  • file.txt 파일 하나를 수정하고 커밋하기를 세 번 반복하면 위와 같은 히스토리를 갖게 된다.
  • 이제 reset 명령이 정확히 어떤 일을 하는지 낱낱이 파헤쳐보자.

1️⃣ --soft

image

  • reset 명령이 하는 첫 번째 일은 현재 브랜치가 가리키는 커밋을 바꾼다. git reset 9e5e6a4 명령은 master 브랜치가 9e5e6a4 커밋 객체를 가리키게 한다.
  • reset --soft 옵션을 사용하면 딱 여기까지 진행하고 동작을 멈춘다.
  • git status 명령을 실행하면 Index와 reset 명령으로 이동시키 HEAD의 다른 점이 녹색으로 출력된다.
  • 이는 git commit --amend 명령의 결과와 같다.

2️⃣ --mixed

image

  • reset 명령은 더 나아가 Index를 현재 HEAD가 가리키는 스냅샷으로 업데이트할 수도 있다.
  • reset --mixed 명령을 실행하면 위의 다이어그램과 같이 git commit 명령과 git add 명령을 되돌린다.
  • reset 명령을 실행할 때 아무 옵션도 주지 않으면 기본적으로 --mixed 옵션으로 동작한다.

3️⃣ --hard

image

  • reset 명령에 --hard 옵션을 사용하면 워킹 디렉토리까지 되돌린다.
  • --hard 옵션은 reset 명령을 위험하게 만드는 유일한 옵션이다. Git에는 데이터를 실제로 삭제하는 방법이 별로 없지만. 이 방법이 그 중 하나다 --hard 옵션을 사용하여 실행한 reset 명령은 되돌릴 수 없다.
  • 이 예제는 v3 버전을 커밋한 적이 있기 때문에 reflog을 이용해서 다시 복원할 수 있다. 하지만 커밋한 적이 없다면 복원할 수 없다.

👍 개인 공부 기록용 블로그입니다. 오류나 조언이 있으시면 언제든지 댓글 혹은 메일로 남겨주시면 감사하겠습니다! 😄

맨 위로 이동하기

git 카테고리 내 다른 글 보러가기

댓글남기기