3강. Commit 관리하기
강의자:임우재
・ Git reset
・ Soft/Mixed/Hard 옵션의 차이
・ Git 히스토리 관리하기
commit을 왜 할까?
작업이력을 남겨놓고 마치 엘레비터를 타듯 원하는 시점으로 자유롭게 돌아다니기 위해서 입니다.
그래서 이번 시간에는 commit간 이동에 대해서 배울 것 입니다.
저번시간에 Readme파일의 변경을 커밋 안시킨걸 시켜보겠습니다.
third commit으로 커밋합니다.
git log로 확인해봅니다.
첫번째 커밋과 세번째 커밋을 비교해봅니다.
이제 특정커밋으로 이동하는 방법을 배워보겠습니다.
여기서 HEAD는
현재 내가 위치해있는 커밋을 가리키는 식별자 입니다.
HEAD가 가리키는 것을 바꾸게 되면
우리의 working directory 의 모습도 HEAD가 가리키는 버전으로 바뀌게 됩니다.
HEAD가 가리키는 커밋을 바꿀 때는 git reset이라는 명령어를 사용하면 됨
다시 한 번 커밋로그를 보면
이렇게 변경되었고 이렇게 되면 working directory모습이 변경된다고 했음
실제로 README파일 보면 first commit했을 때로 돌아간 것 볼 수 있음
BasicCar도 바뀌었습니다.
-> git reset의 힘입니다.(❁´◡`❁)
이런식으로 우리는 언제든지 원하는 커밋으로 돌아갈 수 있어요 @
다시 원래의 3번째 커밋으로 돌아가겠습니다.
다시 git log를 보면 HEAD가 다시 세번째 커밋을 가리키는 것을 볼 수 있습니다.
두 파일모두 최신의 모습으로 돌아온 것도 볼 수 있습니다.
이렇게 git reset을 사용하면 head가 특정커밋을 가리키게 할 수 있습니다.
옵션에는 3가지가 있는데요
Mixed와 soft는 working Directory를 건들지 않습니다.
Mixed와 soft는 어떤 차이가 있을까요?
Staging Area차이
Hard에서 Soft로 갈 수록 뭐하나씩 안바꾸는 거죠
이 번에는 mixed 옵션을 줘서 첫번째 커밋으로 가볼게요
마찬가지로 HEAD가 첫번째 커밋을 가리키고 있습니다.
mixed와 hard의 차이가 뭐라고 했죠 ?
working directory의 변경여부에 차이점이 있다고 했습니다.
ㅡmixed 옵션은 working dorecory는 건들이지 않고
Staging Area를 새로 가리키게 된 커밋처럼 바꿉니다.
현재 Staging Area의 모습이 첫번째 커밋처럼 바뀌었다는 얘기입니다.
하지만 working directory는 건들이지 않고 최신 그대로의 모습입니다.
----
현재 이 git의 상태를 좀 더 구체적으로 볼 수 있는 명령어가 있는데요
바로 git status 라는 명령어 입니다.
head가 가리키는 첫번째 커밋과 지금 상태를 비교했을 때
현재 working directory 내 변경사항이
staging area에 반영되지 않았다는 뜻입니다.
왜냐하면
지금 staging area은 첫번째 커밋과 동일한 상태이기 때문입니다.
여기까지 mixed 옵션이었습니다.
----
다시 세번째 커밋으로 가봅시다.
git reset --hard e785
이제는 soft 옵션을 사용해서 첫번째 커밋으로 가볼게요
이번에도 커밋로그를 살펴볼게요
이전의 mixed옵션처럼 head가 첫번째 커밋을 가리키는 것은 똑같습니다.
하.지.만 이 soft 옵션은 working directory를 건들이지 않을 뿐만 아니라
Staging area도 건들이지 않습니다.
git status도 한 번 살펴볼까요?
초록색이죠?
이것은 head가 가리키고 있는 첫번째 커밋과 비교했을 때
working directory내 변경사항이 staging area에도 잘 반영되어있다는 뜻입니다.
soft옵션은 working directory와 staging area는 건들이지 않기 때문에 지금처럼 잘 반영되어있다고 나오는 거죠
그니까 이 상태에서는 바로 커밋도 할 수 있고,
working directory를 고치고 나서 git add를 한다음 커밋을 해도 됩니다.
지금 보여드린 것의 3가지 옵션을 정리하면 다음과 같습니다.
세 옵션 모두 head가 특정 커밋을 가리키게 하는 것은 똑같지만
working directory와 staging area를 해당 커밋의 모습처럼 변경시키는 지 여부가 다른 거죠
표를 보면 사실 --hard옵션은 위험한 옵션이라는 것을 알 수 있습니다.
working directory에서 해왔던 모든 작업을 한번에 날려버리는 옵션이기 때문입니다.
mixed 옵션과 soft 옵션이 헷갈릴 수 있는데 왜냐하면 이 둘의 차이는 크지 않기 때문입니다.
staging area의 변화여부만 차이가 있는 거죠
soft옵션을 사용하면 내가 작업하면서 만든 staging area의 상태가 그대로 남아있기 때문에 바로 커밋을 할 수 있습니다.
하지만 mixed옵션을 사용하면 staging area의 모습이 해당 커밋처럼 바뀌어버리기 때문에 최근 작업했던 것을 커밋으로 남기고 싶다면 꼭 한 번은 add를 하고 커밋을 해야한다는 차이가 있는 것이죠
git reset을 위험하게 만드는 옵션은 --hard 옵션이다. 라는 것을 기억하는 것이 중요하다.
아 ! 그래요 옵션들의 차이는 알겠는데
soft옵션이나 mixed 옵션은 언제 사용하죠?
가정을 해봅시다.
만약 여러분이 최근에 한 커밋들이 조금 마음에 들지 않는다고 해봅시다.
너무 조금씩만 고치고 커밋을 했다거나 굳이 남들이 보지 않았으면 하는 커밋이 있을 수도 있습니다.
바로 이럴 때 마지막에 제대로 했던 커밋으로 mixed나 soft옵션을 사용해서 git reset을 합니다.
이렇게 하면 head는 가장 마지막으로 제대로 있던 commit을 가리키게 되겠죠?
하지만 이때 working directory 내부는 최근에 했던 내용이 그대로 남아있기 때문에
이 상태에서 다시 커밋을 해주면
마지막으로 제대로 있던 커밋에 이어서 다시 커밋로그를 쌓아나갈 수 있습니다.
이렇게 되면 제대로 된 커밋들만 깔끔하게 쭉 이어서 남길 수 있겠죠?
---(2)에서 이어집니다.