이전 포스트에서 다룬 git reset에 3가지 옵션
자세한 내용은 아래 포스팅에서 확인해주세요
2019/12/06 - [Git] - [Git] reset 자세히 알아보기
git reset --hard 사용해보기 |
$ git log --oneline
위 명령어로 해당 과정을 깃에서도 확인이 가능합니다.
+) --online 옵션을 주면 log를 간단하게 한 줄로 표시하는 것이 가능합니다.
C3의 현재 커밋을 잘못 커밋한 상태이므로 C2의 커밋으로 가려고 하는 상태입니다.
해당 커밋으로 돌아가기 위해서 commit id 혹은 commit 참조 어떤 것을 사용해도 상관 없습니다.
커밋 참조는 아래에서 참고해주세요
commit id부분은 잘못된 부분의 commit id를 입력해도 좋으며 commit에 대한 참조를 사용해도 좋습니다.
만약 자식 commit에서 부모 commit으로 이동하고 싶다면?
commit id 대신 HEAD~ or HEAD~1 or HEAD^ or HEAD^1로 표현이 가능합니다.
만약 조상 commit으로 가려면 HEAD~2 or HEAD^2로
쉽게 HEAD~(돌아갈 횟수)라고 생각하시면 간단합니다.
이제 2번째 커밋으로 돌아가기 위해서
$ git reset --hard HEAD~1
or
$ git reset --hard c1c22391
위 명령어를 사용합니다.
(명령어에 대한 설명은 2019/12/06 - [Git] - [Git] reset 자세히 알아보기 해당 포스트에서 다룹니다.)
결과 |
soft와 mixed 옵션과 다르게 바뀐점이 크게 보이는 것을 확인 할 수 있습니다.
git reset --mixed 자세히 알아보기 |
하지만 저번과 다르게 사용하시는 에디터에 따라서 아주 조금의 변화가 있음을 느낄 수 있습니다.
(에디터에 따라 해당 커밋 snapshot으로 돌아갈 수도 있고 아닐 수 있습니다, 만약 해당 변경점이 없는경우는 에디터가 자동적으로 이미 저장한 내용을 손실하지 않기 위해서 보존하는 것입니다. 가끔 에디터 따라 차이가 발생)
자세한 확인을 위해서 log와 status로 상태를 확인하면
일단 log로 C2 커밋으로 돌아온 것은 확실한데 status로 아무런 커밋도 없고 working tree마저 깔끔한 것을 볼 수 있습니다.
일단 이러한 상태를 그림으로 확인하면 아래와 같습니다.
HEAD와 branch는 C2커밋으로 이동하였으며
다른 옵션들과 달리 Working directory마저 잘못 작성한 C3의 내용 모두를 보존하지 않고 C2로 돌아간 것을 확인 할 수 있습니다.
즉, 간단하게 보면 현재 상태는 C2커밋을 한 상태로 돌아온 것이며, 이후 작성한 내용과 C3에 대한 모든 것은 삭제 되었음을 알 수 있습니다.
따라서 status를 쳐도 아무런 파일 상태가 뜨지 않는것은 C2가 commit까지 이루어진 상태이기 때문에 따로 파일에 대한 작업이 없기 때문입니다.
(파일에 대한 git 상태는 추후 포스트에서 다루어보도록 하겠습니다)
결론 |
위에서 살펴본 것 처럼 hard옵션의 경우 HEAD, branch 이동에 더해서 돌아간 커밋 이후에 모든 작업은 보존하지 않고 날려버린다고 볼 수 있습니다.
따라서 reset 옵션중에서 가장 안전하지 않으며 주의가 필요합니다.
해당 커밋을 잘못 커밋했으나 일부 내용만 수정하면 되는 경우에 hard를 사용하게 되면 모든 작업이 보존되지 않고 삭제되므로 작업한 모든 내용을 다시 타이핑해야하고, 작성한 중요 내용이 있다면 해당 내용은 손실될 수 있습니다.
하지만 사용하는 에디터 따라서 내용이 유지되는 경우도 있으며 모든 내용자체가 잘못된 커밋이라면 해당 옵션으로 간단하게 싹 날려버릴 수 있습니다.
(Staging Area, index, staged 등등에 대한 용어 정리)
Staging Area부분을 reset 설명에서 index, stage로 표현하지만 결과는 같은 내용이므로 초기 포스팅 부터의 이해를 돕기 위해서 해당 부분을 Staging Area로 표기하고있습니다.
실제로 용어들에 자세한 내용을 살펴보면 아래와 같음을 알 수 있습니다.
Staging Area - .git directory에 있으며 단순 파일이며 곧 커밋할 파일에 대한 정보를 담음
index - git에서 기술용어로 쓰이지만 Staging Area라는 용어를 사용해도 상관이 없다.
staged 상태 - 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미함.
출처 - https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-Git-%EA%B8%B0%EC%B4%88
'Git > Git - 시작하기' 카테고리의 다른 글
[Git] reset, --mixed 옵션 자세히 알아보기 (0) | 2020.01.01 |
---|---|
[Git] reset, --soft 옵션 자세히 알아보기 (0) | 2020.01.01 |
[Git] reset 자세히 알아보기 (0) | 2019.12.06 |
[Git] reflog 란? (0) | 2019.12.05 |
[Git] rebase 개념 알아보기 (0) | 2019.11.18 |