인프런 커뮤니티 질문&답변

planting31님의 프로필 이미지
planting31

작성한 질문수

빠르게 git - 핵심만 골라 배우는 Git/Github

reset관련 질문입니다

해결된 질문

작성

·

4.4K

0

안녕하세요! 강사님!

reset에 대한 실습을 진행한 후, 궁금한 점이 생겨 질문 남깁니다!

먼저, 현재 저의 문제상황부터 말씀드리겠습니다.

위 사진과 같은 상황에서 working directory, staging area, repository 전체를 reset하고 싶어 

"git reset --hard HEAD^"를 입력했지만 예상한대로 실행이 되지 않고, 아래와 같은 오류 메세지가 나타났습니다.

fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree.

Use '--' to separate paths from revisions, like this:

'git <command> [<revision>...] -- [<file>...]'

이 후, HEAD^대신 "git reset --hard HEAD"를 입력하니, staging area와 working directory는 reset이 되었는데

첫번째 commit은 삭제가 되지 않습니다.

여기서 질문 드립니다.

1) 두번째 commit을 soft로 reset한 후에는 HEAD가 이전 commit인 첫번째 commit을 가리키는 것이 아닌가요? HEAD^대신 HEAD를 썼을 때 working directory와 staging area가 reset되는 이유가 궁금합니다.

2) working directory와 staging area까지 모두 reset된 후, 'HEAD is now at fb13848 first commit'이라는 메세지가 떴는데도  "git reset --hard HEAD^"로는 첫번째 commit이 reset되지 않습니다. 이 경우 첫번재 commit(first commit)을 reset할 수 있는 방법이 무엇인지 궁금합니다!

긴 질문 확인해주셔서 감사합니다!

답변 1

2

강민철님의 프로필 이미지
강민철
지식공유자

안녕하세요 :) 자세한 질문에 감사드립니다

우선 아래와 같은 순서로 실습한 것이 맞는지 확인해주세요

(강의와 다르게 git reset --hard HEAD^ 명령어가 동작하지 않는 이유는 HEAD^가 가리키는 대상 (즉 커밋)이 만들어지지 않은 경우가 많습니다)

1. test.txt라는 파일을 만들어 this is first commit 이라는 문자 입력 후 commit 까지 완료하기 (첫 버전 만들기)

2. test.txt 내용을 this is repository 로 변경 후 commit 까지 완료하기 (두번째 버전 만들기)

3. test.txt 내용을 this is staging area 로 변경 후 add 까지 완료하기

4. test.txt 내용을 this is working directory로 변경하기

즉, 두 개의 commit이 있는 상황이고, staging area에도 변경사항이 있고, worknig directory에서도 변경사항이 있는 상황이어야 합니다.

이제 질문에 대한 답변을 드리자면, 

1) soft 옵션은 커밋만을 reset하는 명령어가 맞습니다. commit한 사실만 리셋되고, working directory나 staging area까지 변경하지는 않습니다. 모두를 한번에 변경하는 것은 hard 옵션입니다

2) HEAD는 현재 브랜치의 마지막 커밋을 가리키고 있고, 때문에 리셋을 할 때는 몇 번 전의 commit을 리셋할지를 ^ (혹은 ~숫자)로 표기합니다.

그래서 하나 전의 commit을 reset할 때는 HEAD^로 표기하는 것이지요.

git reset --hard HEAD 명령어로 되돌리고자 하는 버전은 지금 버전을 가리킵니다.

지금 버전으로 리셋하겠다는 의미이죠.

그래서 working directory와 staging area, repository 모두 지금 버전으로 업데이트 된 것입니다.

따라서 질문자님이 git reset --hard HEAD 로 쳤을 때의 상황은 올바르게 나온 것입니다 :)

위에서 설명한 바와 같이, 문제의 근본적인 이유는 강의 속의 상황과 동일하게

커밋이 만들어지지 않았기 때문일 가능성이 높습니다.

아래와 같이 커밋이 하나만 있는 상황에서는 "하나 이전의 커밋" 이라는 개념, 즉 HEAD^가 없기 때문에 

질문자님과 같은 오류가 생기는 걸 확인할 수 있습니다

minchul@DESKTOP-9KULGUE MINGW64 /c/test2 (master)

$ git log

commit a6abaab80c1679640098af12a534691e8b6da942 (HEAD -> master)
Author: Kang Minchul <tegongkang@gmail.com>
Date:   Thu Aug 5 03:25:56 2021 +0900

    1

minchul@DESKTOP-9KULGUE MINGW64 /c/test2 (master)

$ git reset --hard HEAD^

fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

다시 시도해보시고, 혹시나 막히는 내용이 있으시다면 언제든 다시 질문주세요

감사합니다 :)

planting31님의 프로필 이미지
planting31
질문자

아! 덕분에 이해갔습니다!! 감사합니다!!

planting31님의 프로필 이미지
planting31

작성한 질문수

질문하기