github - reset

Harry·2020년 6월 30일
0

git

목록 보기
1/2
post-thumbnail

내 회사에선 git을 통해 코드 관리를 하는데, 작업을 하다가 git이 꼬여서 코드를 되돌려야 하는 상황이 생겼었다
그 상황에서 reset 명령어를 사용해야 했었고, 해당 명령어는 알고는 있었지만 정확하게 알고 있지 않아, 이번 계기를 통해 reset에 대해 파헤쳐 보려고 한다.
본 내용의 글은 Github Document-reset을 통해 공부하였습니다.

세 개의 트리

  • Git 은 일반적으로 세 가지 트리를 관리하는 시스템
    • HEAD : 마지막 커밋 스냅샷, 다음 커밋의 부모 커밋
    • Index : 다음에 커밋할 스냅샷
    • 워킹 디렉토리 : 샌드박스
  • 현재 브랜치를 가리키는 포인터
  • 브랜치는 브랜치에 담긴 커밋 중 가장 마지막 커밋을 가리킨다.
  • 단순하게 생각하면 “현재 브랜치 마지막 커밋의 스냅샷”

Index

  • 바로 다음에 커밋할 것들 ( Staging Area )
  • Staging Area는 사용자가 git commit 명령을 실행했을 때, Git이 처리할 것들이 있는 곳.
  1. 워킹 디렉토리에서 마지막으로 Checkout 한 브랜치의 파일 묵록과 파일 내용으로 채워진다.
  2. 이후, 파일 변경 작업을 하고 변경한 내용으로 Index를 업데이트 할 수 있다.
    • git add
  3. git commit 명령을 실행하면 Index는 새 커밋으로 변환된다.

워킹 디렉토리

  • 위의 두 트리는 파일과 그 내용을 효율적인 형태로 .git 디렉토리에 저장한다.
  • 워킹 디렉토리는 실제 파일로 존재한다.
  • 커밋하기 전에는 Index(Staging Area)에 올려놓고 얼마든지 변경할 수 있다.

Process

From Init To First commit

  1. git init 명령 실행
    - Git 저장소가 생기고 HEAD는 아직 없는 브랜치를 가리킨다.

  2. git add 명령을 실행하여 워킹 디렉토리의 내용을 Index로 복사한다.

  3. git commit 명령을 실행한다.
    - Index의 내용을 스냅샷으로 영구히 저장한다.
    - 그 스냅샷을 가리키는 커밋 객체를 생성한다.
    - 그리고 master branch가 그 커밋 객체를 가리키도록 한다.

  4. git status 명령을 실행하면 아무런 변경 사항이 없다고 나온다.

    • 세 트리 모두가 같기 때문에

From First Commit To Second Commit

  • 위의 커밋 이후로 계속해서 진행한다.
  1. 워킹 디렉토리의 파일을 고친다.
    - 이를 이 파일의 v2로 한다.

  2. git status 명령을 바로 실행한다면 “Changes not staged for commit.” 아래에 빨간색으로 된 파일을 볼 수 있다.

    • Index와 워킹 디렉토리가 다른 내용을 담고 있기 떄문이다.
  3. git add 명령을 실행하여 워킹 디렉토리 변경사항을 Index에 올려준다.

  4. 이 시점에서 git status 명령을 실행하면 “Changes to be committed” 아래에 파일 이름이 녹색으로 변한다.

    • 현재 세 개의 트리에서 IndexHEAD 의 다른 파일들이 여기에 표시된다.
    • 즉, 다음 커밋할 것과 현재 마지막 커밋이 다르다는 말이다.
  5. git commit 명령을 실행하여 커밋한다.


Reset의 역할

  • 위의 커밋 이력들을 토대로 설명을 진행합니다.

  • 예를 들어, file.txt파일 하나를 수정하고 커밋한다. ( git addgit commit )

  • 마지막 트리의 형태는 아래와 같다.

  • reset 의 명령이 정확히 어떤 일을 하는지 알아보자.

  • 트리를 조작하는 동작은 세 단계 이하로 이루어진다.

1단계 : HEAD 이동 ( --soft )

  • reset 명령이 하는 첫 번째 일은 HEAD 브랜치를 이동시킨다.

  • checkout 명령처럼 HEAD가 가리키는 브랜치를 바꾸는 것이 아니라 reset 명령어는 HEAD는 계속 현재 브랜치를 가리키고 있고, 현재 브랜치가 가리키는 커밋을 바꾼다.

  • 여기서 git status 명령을 실행하면 Index와 reset 명령으로 이동시킨 HEAD의 다른 점이 녹색으로 출력된다.

  • git commit 명령을 실행하면 git commit --amend 명령의 결과와 같아진다.

git commit 명령을 되돌리는 것.

2단계: Index 업데이트 ( --mixed )

  • Index를 현재 HEAD가 가리키는 스냅샷으로 업데이트할 수 있다.

  • reset 명령을 실행할 때 아무 옵션도 주지 않으면 기본적으로 --mixed 옵션으로 동작한다.

  • 가리키는 대상을 최근의 커밋으로 되돌리고,

  • Staging Area를 비우기까지 한다.

git commit 도 되돌리고 git add 명령까지 되돌리는 것.

3단계: 워킹 디렉토리 업데이트 ( --hard )

git addgit commit 명령으로 생성한 마지막 커밋으로 되돌리며, 워킹 디렉토리 내용까지도 되돌린다.

  • --hard 옵션은 Git 에서 데이터를 실제로 삭제하는 방법
  • 그 외 reset 옵션들은 어떻게 사용하더라도 간단히 결과를 되돌릴 수 있다.
  • --hard 옵션은 되돌리는 것이 불가능하다.

정리

  1. HEAD가 가리키는 브랜치를 옮긴다. (--soft 옵션이 붙으면 여기까지)
  2. Index를 HEAD가 가리키는 상태로 만든다. (--hard 옵션이 붙지 않았으면 여기까지)
  3. 워킹 디렉토리를 Index의 상태로 만든다.

0개의 댓글