이번시간에는 Working copy
, index
, repository
에 대해 알아보도록 하겠습니다.
일단 git
에서 저장소를 크게 분류하면 Working copy
, Index
, Repository
로 나눌 수 있습니다.
이때 reset
의 옵션에 따라서 삭제되는 파일의 범위가 달라집니다.
Git reset --soft
시 Repository
에 있는 파일만 삭제됩니다.
Git reset --mixed
시 Cache
에 있는 파일도 삭제됩니다.
Git reset --hard
는 Working copy
에 있는 파일까지 삭제됩니다.
실습을 통해서 한번 확인해보도록 하겠습니다.
f1.txt
파일을 만들어서 add
와 commit
를 해줍니다.
이후 다시 f1.txt
파일의 내용을 repository
로 변경해준후 git commit -am "2"
를 해줍니다.
그렇다면 지금 만든 f1.txt
는 git
의 저장소 중에 어느곳에 위치하고 있을까요?
첫번째로 cat
실행시 파일의 내용이 출력되므로 working directory
에는 파일이 존재합니다.
두번째로 gistory
의 index
에서도 f1.txt
파일을 확인 할 수 있습니다.
마지막으로 .git/refs/heads/master
에서도 tree
에 들어가면 f1.txt
파일이 들어있기 때문에
현재 f1.txt
은 Working copy , index , repository
모두 저장되어있습니다.
이제 다시 f1.txt
을 index
로 수정하고 add
만 해보겠습니다.
즉 commit
을 하지 않은 상태입니다.
commit
을 하지않은 파일은 git
의 어느 저장소에 저장되어있을까요?
일단 cat
실행시 내용이 출력되므로 working directory
에는 존재합니다.
그리고 gistroy
의 index
에서도 존재합니다.
하지만 .git/refs/heads/master
에서는 파일의 내용이 변하지 않았습니다.
따라서 add
만 했을 때는 Working copy , index
에만 저장됩니다.
이번에는 f1.txt
파일의 내용을 working directory
로 해보겠습니다.
cat
을 실행시 화면에 출력되기 때문에 Working copy
에는 존재합니다.
다만 index
에서는 파일의 내용이 변하지 않았습니다.
즉 add
와 commit
을 하지않으면 파일은 오로지 Working copy
에서만 존재하게 됩니다.
처음 이 사진을 다시 볼까요?
git reset --soft
실행시 repository
에 있는 내용은 지워지지만 index
와 working copy
에 있는 내용은 지워지지 않습니다.
git reset --mixed
실행 시 repository
와 index
의 파일만 지워집니다.
마지막으로 git reset --hard
실행시 모든 저장소에서 파일이 지워지게 됩니다.
git log
에 있는 commit
메세지 로 reset
을 해보겠습니다.
git reset --soft commit_id
실행시 변경된 것을 확인 할 수 있습니다.
이때 git log -p
를 실행시 f1.txt
가 처음으로 commit
한 init
이라는 내용을 가지고 있습니다.
git diff
를 해보겠습니다. diff
는 index
와 working copy
의 차이점을 알려줍니다. index
저장소에는 index
가 존재하고 working copy
저장소에는 working copy
라는 내용이 존재하는것을 확인 할 수 있습니다.
이를통해 gir reset --soft
시 index
와 working copy
는 변하지 않고 유지되고있다는 것을 확인 할 수 있습니다.
이번에는 git reset --soft ORIG_HEAD
를 해보겠습니다.
working copy
저장소에는 working copy
내용이 그대로 있습니다.
그리고 index
에는 index
가 그대로 있습니다.
마지막으로 .git/refs/head/master
에는 repository
내용이 존재 하게 됩니다.
이번에는 --mixed
옵션을 사용해보겠습니다.
git diff
사용시 init
의 내용이 변경되었습니다.
이번에는 git reset --hard
를 해보겠습니다.
그러면 f1.txt
내용은 init
이 됩니다.
정리하겠습니다. 번째 commit
은 init
이라는 내용을 담고있고
번째 commit
은 repository
를 담고있었습니다.
이때 git reset --soft
를 실행시 repository
에서 이전 commit
인 init
으로 돌아가게 됩니다. 다만 --soft
를 사용했기 때문에 Repository
저장소에서만 변경됩니다.
다음으로 git reset --mixed
를 했습니다. 따라서 index
는 init
으로 변경되게 됩니다.
마지막으로 git reset --hard
를 함으로써 working directory
저장소에 있는 working copy
의 내용 까지 전부 init
로 변경되었습니다.
오늘은 여기까지 하도록 하겠습니다.