[GIT] Git Reset과 Checkout 쉽게 이해하기

세 가지 트리로 Git을 이해

  • HEAD
    • 현재 작업 중인 브랜치의 마지막 커밋 스냅샷을 가리키며, 다음 커밋의 부모 커밋입니다.
  • INDEX
    • 다음에 커밋할 스냅샷을 준비하는 영역으로, Staging Area로도 알려져 있습니다.
  • 워킹 디렉토리
    • 파일들이 실제로 존재하고 작업하는 영역으로, 프로젝트 파일들이 저장되는 공간입니다.

HEAD

  • 현재 작업 중인 브랜치를 가리키는 포인터로, 해당 브랜치의 마지막 커밋을 참조합니다.
  • $ git cat-file -p HEAD
    tree cfda3bf379e4f8dba8717dee55aab78aef7f4daf
    author Scott Chacon  1301511835 -0700
    committer Scott Chacon  1301511835 -0700
    
    initial commit
    
    $ git ls-tree -r HEAD
    100644 blob a906cb2a4a904a152...   README
    100644 blob 8f94139338f9404f2...   Rakefile
    040000 tree 99f1a6d12cb4b6f19...   lib

INDEX

  • 일반적으로 Staging Area라고도 합니다.
  • 워킹 디렉토리에서 마지막으로 Checkout 한 브랜치의 파일 목록과 파일 내용으로 채워집니다.
  • 커밋시 변경된 사항이 있는 INDEX 파일은 변경됩니다.
  • $ git ls-files -s
    100644 a906cb2a4a904a152e80877d4088654daad0c859 0	README
    100644 8f94139338f9404f26296befa88755fc2598c289 0	Rakefile
    100644 47c6340d6459e05787f644c2447d2595f5d3a54b 0	lib/simplegit.rb
    
    # REAME 수정 후 커밋
    $ git ls-files -s
    100644 089ba81c58466fcbaf070caa657c04556a5f2c65 0	README
    100644 8f94139338f9404f26296befa88755fc2598c289 0	Rakefile
    100644 47c6340d6459e05787f644c2447d2595f5d3a54b 0	lib/simplegit.rb

워킹 디렉토리

  • 실제 파일이 저장되는 곳으로, 사용자가 직접 편집할 수 있는 공간입니다.
  • 이 디렉토리에는 현재 작업 중인 파일들이 포함되어 있으며, 변경된 내용은 바로 반영됩니다. 

워크플로

  • 파일이 하나 있는 디렉토리로 이동합니다. 이 파일을 v1이라고 가정합니다. Git 저장소를 초기화하고, HEAD가 아직 없는 브랜치를 가리키도록 합니다.
  • 파일을 커밋하기 위해 먼저 git add 명령을 사용하여 워킹 디렉토리의 내용을 Index로 복사합니다. 그리고 git commit 명령을 실행하여 Index의 내용을 스냅샷으로 영구히 저장하고 해당 스냅샷을 가리키는 커밋 객체를 만듭니다. 마지막으로 브랜치(master)가 해당 커밋 객체를 가리키도록 합니다.
  • git status 명령을 실행하면 변경 사항이 없다는 메시지가 표시됩니다. 모든 트리(HEAD, Index, 워킹 디렉토리)가 같은 상태이기 때문입니다.
  • 파일 내용을 수정하여 v2로 만듭니다.
  • git status 명령을 실행하면 변경 사항이 아직 Index에 스테이징되지 않았음을 알 수 있습니다.
  • 변경 사항을 Index로 올리기 위해 git add 명령을 실행합니다.
  • 이제 git status를 실행하면 변경 사항이 스테이징되어 커밋될 준비가 되었다는 메시지가 표시됩니다.
  • 경 사항을 커밋하기 위해 git commit 명령을 실행합니다. 
  • 이제 git status를 실행하면 다시 변경 사항이 없다는 메시지가 표시됩니다.

RESET의 역할

  • SOFT RESET : 이 모드에서는 HEAD를 이전 커밋으로 이동시키지만, Index와 워킹 디렉토리는 변경하지 않습니다. 이전 커밋 상태로 되돌아가고, 변경 사항을 스테이징 영역에 다시 추가하여 새로운 커밋을 만들 준비를 할 수 있습니다.
  • MIXED RESET : 이 모드에서는 HEAD를 이전 커밋으로 이동시키고, Index를 이전 커밋과 동일한 상태로 되돌립니다. 즉, 변경된 내용을 스테이징 영역에서 제거하지만, 워킹 디렉토리는 변경된 채로 남아 있습니다.
  • HARD RESET : 이 모드에서는 HEAD를 이전 커밋으로 이동시키고, Index와 워킹 디렉토리를 모두 이전 커밋과 동일한 상태로 되돌립니다. 변경된 모든 내용이 사라지고, 이전 커밋 상태로 되돌아갑니다.

경로 RESET

  • git reset file.txt와 같이 경로를 지정하면 해당 파일에 대해 reset 명령이 실행됩니다. 이는 단순히 파일의 상태를 Unstaged 상태로 변경합니다. 따라서 해당 파일에 대한 변경 사항이 Staging Area에서 제거됩니다.
  • git reset <commit> file.txt와 같이 특정 커밋과 파일을 지정하여 reset 명령을 실행하면 해당 커밋에서 파일의 내용을 가져옵니다. 이는 해당 파일을 해당 커밋의 상태로 되돌리는 것입니다.
  • git reset --patch file.txt와 같이 --patch 옵션을 사용하여 Hunk 단위로 작업할 수 있습니다.

RESET으로 커밋 합치기

  • soft reset으로 branch를 원하는 커밋으로 돌아오고 commit하여 새로운 커밋을 만듭니다.

CHECKOUT

  • git checkout [branch] 명령은 HEAD 포인를 branch로 옮깁니다. reset은 HEAD가 가리키는 branch를 해당 branch로 옮깁니다.
  • git checkout [branch] file일 경우 reset과 똑같이 head는 움직이지 않고 비슷하게 해당 브랜치가 가리키는 파일로 변경됩니다. Index 및 워킹디렉토리도 변경됩니다.

 

'GIT > Git 도구' 카테고리의 다른 글

[GIT] 고급 Merge 기술과 충돌 해결 전략  (3) 2024.03.19
[GIT] 히스토리 편집하기  (0) 2024.03.18
[GIT] 히스토리 검색하기  (0) 2024.03.18
[GIT] 작업에 서명하기  (0) 2024.03.18
[GIT] Stashing과 Cleaning  (0) 2024.03.11