◽ Git

[Git, bash] Rest 명령어 : commit 되돌리기, commit 취소하기

kkk20000a 2023. 1. 31. 10:16

Reset 명령어 정리

  실수로 커밋한 뒤 재빨리 취소를 해야 할 때, 사용하면 좋다. bash를 쓰는 이유는 GUI의 대표 격인 소스 트리에서는 없다. 되돌리기 기능이 있긴 한데 조금 불안정하다.  push 한 뒤에만 작동하는 듯하고 어쩔 땐 --hard 옵션으로 작동해 버려 코드가 싹 날아가버리는 참사가 다수 발생한 경험이 있어. 역시나 안전한 Command 기반으로 정리하고자 한다.

 


 

1. 직전 커밋 삭제.

  방금 올린 직전 커밋을 삭제하는 방법은 "$ git reset HEAD^"로 수행할 수 있다. 여기서 "HEAD + ^"은 ^는 헤드에서 직전이라는 말이며, "^^"이면 헤드에서 2번째 전을 말한다. "HEAD^"를 사용한다는 가정하에 아래 그림 1-1, 1-2를 참고하면 된다. 이 상황의 전제는 아래 그림 1-3이어야 한다. 즉, "원격지에 push를 안 한 상태"이어야 한다. remote에 push한 경우에도 처리하는 방법은 비슷한데 아래에서 정리할 예정.

그림 1-3

 

그림 1-1 : 명령어 실행 이전 모습
그림 1-2 : 명령어 실행 이후 모습

 

 

 

 

 

 

2. Mode option : "git reset [<mode>] [<commit>]"

  이 명령어의 옵션은 다양한 문법이 있지만, 주로 쓰는 것들로만 간단히 정리하고자 한다. 위 syntax에서 <mode>에는 아래와 같은 옵션들을 제공한다. 주로 쓰는 것만 설명을 추가하고 자세한 것은 공식 홈페이지 참고하면 된다.

(https://git-scm.com/docs/git-reset)

  • soft : 커밋을 특정하여 reset하면 삭제되는 커밋들의 변경된 파일을 working repository에 남긴다는 말이다. [그림 2-1]
  • mixed : 생략하게 될 경우, 이 값으로 설정이 된다.
  • hard : soft와 다르게 [그림 2-1]와 같이 남기지 않고 아예 버린다.
  • merge
  • keep

그림 2-1 : soft

 

 

 

 

 

3. Commit option : "git reset [<mode>] [<commit>]"

  정확히 말하면, commit 옵션은 아닌데 HEAD로 지칭 할 수도 있고, commit의 hash값으로 특정할 수도 있다는 것을 설명하려고 한다. 그림 3-1에서 직전 커밋이 아닌 head에서 2번째 것까지 reset을 하기 위해서는 2가지 방법이 있다. 참고로 [<mode>] 옵션은 생략 가능하며, default값은 mixted이다.

  • $ git reset --soft HEAD^^^
  • $ git reset --sfot 07b332d

아래의 그림 3-1, 3-2를 참고하면, 지정한 커밋까지 reset됨을 알 수 있다.

그림 3-1 : 명령어 수행 전
그림 3-2 : 명령어 수행 후

 

 

 


참고 :

- https://git-scm.com/docs/git-reset ("git-reset" document 공식 홈페이지)