내 회사에선 git을 통해 코드 관리를 하는데, 작업을 하다가 git이 꼬여서 코드를 되돌려야 하는 상황이 생겼었다
그 상황에서 reset
명령어를 사용해야 했었고, 해당 명령어는 알고는 있었지만 정확하게 알고 있지 않아, 이번 계기를 통해 reset
에 대해 파헤쳐 보려고 한다.
본 내용의 글은 Github Document-reset을 통해 공부하였습니다.
git commit
명령을 실행했을 때, Git이 처리할 것들이 있는 곳.git add
git commit
명령을 실행하면 Index는 새 커밋으로 변환된다..git
디렉토리에 저장한다.git init
명령 실행
- Git 저장소가 생기고 HEAD는 아직 없는 브랜치를 가리킨다.
git add
명령을 실행하여 워킹 디렉토리의 내용을 Index로 복사한다.
git commit
명령을 실행한다.
- Index의 내용을 스냅샷으로 영구히 저장한다.
- 그 스냅샷을 가리키는 커밋 객체를 생성한다.
- 그리고 master
branch가 그 커밋 객체를 가리키도록 한다.
git status
명령을 실행하면 아무런 변경 사항이 없다고 나온다.
워킹 디렉토리의 파일을 고친다.
- 이를 이 파일의 v2로 한다.
git status
명령을 바로 실행한다면 “Changes not staged for commit.” 아래에 빨간색으로 된 파일을 볼 수 있다.
git add
명령을 실행하여 워킹 디렉토리 변경사항을 Index에 올려준다.
이 시점에서 git status
명령을 실행하면 “Changes to be committed” 아래에 파일 이름이 녹색으로 변한다.
Index
와 HEAD
의 다른 파일들이 여기에 표시된다.git commit
명령을 실행하여 커밋한다.
위의 커밋 이력들을 토대로 설명을 진행합니다.
예를 들어, file.txt
파일 하나를 수정하고 커밋한다. ( git add
→ git commit
)
마지막 트리의 형태는 아래와 같다.
reset
의 명령이 정확히 어떤 일을 하는지 알아보자.
트리를 조작하는 동작은 세 단계 이하로 이루어진다.
reset
명령이 하는 첫 번째 일은 HEAD 브랜치를 이동시킨다.
checkout
명령처럼 HEAD가 가리키는 브랜치를 바꾸는 것이 아니라 reset
명령어는 HEAD는 계속 현재 브랜치를 가리키고 있고, 현재 브랜치가 가리키는 커밋을 바꾼다.
여기서 git status
명령을 실행하면 Index와 reset
명령으로 이동시킨 HEAD의 다른 점이 녹색으로 출력된다.
git commit
명령을 실행하면 git commit --amend
명령의 결과와 같아진다.
git commit
명령을 되돌리는 것.
Index를 현재 HEAD가 가리키는 스냅샷으로 업데이트할 수 있다.
reset
명령을 실행할 때 아무 옵션도 주지 않으면 기본적으로 --mixed
옵션으로 동작한다.
가리키는 대상을 최근의 커밋으로 되돌리고,
Staging Area를 비우기까지 한다.
git commit
도 되돌리고git add
명령까지 되돌리는 것.
git add
와git commit
명령으로 생성한 마지막 커밋으로 되돌리며, 워킹 디렉토리 내용까지도 되돌린다.
--hard
옵션은 Git 에서 데이터를 실제로 삭제하는 방법reset
옵션들은 어떻게 사용하더라도 간단히 결과를 되돌릴 수 있다.--hard
옵션은 되돌리는 것이 불가능하다.--soft
옵션이 붙으면 여기까지)--hard
옵션이 붙지 않았으면 여기까지)