남과 같이 해선 남 이상이 될 수 없다.

Git

[Git] git reset과 git checkout의 차이점

맨동 2022. 3. 28. 22:55
728x90

1. 수정사항 되돌리기

코드를 작성하면서 여러 군데에 로그를 출력하는 코드를 삽입했다던가,

개발 환경에서만 작동하는 코드를 임시로 넣었을 때 그 내용을 되돌리는 경우에는 checkout을 사용합니다.
기존 커밋과 비교해서 직접 수정해도 되지만, 수정한 내용이 많을 경우에 사용하면 편리합니다.

새롭게 추가된 파일, 다시 말하자면 Untracked file의 경우에는 checkout을 하더라도 삭제되지 않습니다.

 

2. Unstaging

add 명령어로 stage 상태로 만든 파일을 다시 unstage 상태로 만드는 방법은

reset 명령어로 unstage 상태로 만들수있습니다.

 

3. Commit 되돌리기

3.1. reset

3.1.1. mixed

reset은 말그대로 커밋을 되돌리는 명령어입니다.

파일을 추가하고 커밋한 후,

reset 명령어 뒤에 커밋 아이디를 입력하면 해당 커밋으로 되돌아갈 수 있습니다.
git log를 보면 돌아온 커밋 이후의 커밋들이 전부 사라진 것을 볼 수 있습니다.

하지만 추가한 파일들은 그대로 존재합니다.
status를 보면 어떻게 된 상태인지를 파악할 수 있는데요,
기본적으로 reset을 사용하게 되면 해당 커밋 이후의 내용은 현재 내가 수정한 것처럼 내용 자체는 남아있게 됩니다.

reset을 사용할 때 아무 옵션을 주지 않으면 --mixed 옵션이 기본적으로 들어가게 되는데 그 동작이 위의 내용과 같습니다.

3.1.2. soft

파일들을 추가하고 커밋한 후 reset --soft로 soft 옵션을 걸게되면

log상으로는 동일하게 커밋 내용이 사라지지만 리셋 이후의 수정한 내용 또한 동일하게 존재합니다.

다만, 해당 내용들이 staging area에 존재하게 됩니다.

3.1.3. hard

위와 같이 파일들을 추가하고 커밋한 상태에서 --hard 옵션으로 reset을 실행하면

마찬가지로 커밋이 리셋되면서 해당 커밋 이후의 내용을 모조리 날려버립니다.

3.1.4. 정리

  • reset은 두 가지 용도로 사용 가능합니다. unstaging이나 commit reset.
  • commit reset의 경우 세 가지 옵션이 존재하며(mixed, soft, hard), default는 mixed입니다.
    공통적으로 리셋시킨 커밋 이후의 커밋은 사라지게 됩니다.
  • mixed option : 리셋 이후의 커밋 내용들이 unstage 상태로 존재
  • soft option : 리셋 이후의 커밋 내용들이 stage 상태로 존재
  • hard option : 리셋 이후의 커밋 내용들이 전부 삭제

3.2. revert

특정 커밋만 되돌리고 싶은 경우에 사용하는 것이 revert 명령어 입니다.

origin 커밋을 기준으로 file1을 추가하고 커밋, file2를 추가하고 커밋했을 때
이 상태에서 file1을 추가한 커밋만 되돌리고 싶다면 

git revert [되돌릴 커밋] 을 입력하면 됩니다.

그러면 revert commit 창이 뜨고, revert message를 입력합니다.

로그를 보면 reset과는 다르게 커밋이 사라지지 않고, 방금 전에 입력한 메시지로 새로운 커밋이 생성됩니다.

파일 상태를 보면 file1이 사라진 것을 알 수 있습니다.
즉, revert 명령어는 해당 커밋을 취소하는 커밋을 생성하는 것입니다.

 

이전 커밋을 취소하고 수정 후에 다시 반영하고 싶은 경우에는 -n 옵션을 사용하면 됩니다.

-n 옵션을 사용하게 되면 바로 커밋 메시지를 작성하는 창으로 전환되지 않고,

취소한 변경사항이 stage area에 존재하게 됩니다.
취소한 내용이 파일 내용을 수정한 것이라면 원하는 대로 다시 수정해 커밋하면 됩니다.

 

마지막으로 reset 과 checkout의 차이를 짚어보자면

reset checkout
HEAD가 가리키던 브랜치가 다른 커밋을 가르키도록 한다. HEAD 자체가 다른 커밋이나 브랜치를 가르키도록 한다
HEAD도 결국 간접적으로 다른 커밋을 가르키게 되는 효과가 생긴다. 브랜치를 통하지 않고, 커밋을 직접적으로 가르키는 HEAD를 Detached HEAD라고 한다
728x90

'Git' 카테고리의 다른 글

[Git] error: GH007: Your push would publish a private email address  (0) 2021.09.30