[Git, bash] Rest 명령어 : commit 되돌리기, commit 취소하기
Reset 명령어 정리
실수로 커밋한 뒤 재빨리 취소를 해야 할 때, 사용하면 좋다. bash를 쓰는 이유는 GUI의 대표 격인 소스 트리에서는 없다. 되돌리기 기능이 있긴 한데 조금 불안정하다. push 한 뒤에만 작동하는 듯하고 어쩔 땐 --hard 옵션으로 작동해 버려 코드가 싹 날아가버리는 참사가 다수 발생한 경험이 있어. 역시나 안전한 Command 기반으로 정리하고자 한다.
1. 직전 커밋 삭제.
방금 올린 직전 커밋을 삭제하는 방법은 "$ git reset HEAD^"로 수행할 수 있다. 여기서 "HEAD + ^"은 ^는 헤드에서 직전이라는 말이며, "^^"이면 헤드에서 2번째 전을 말한다. "HEAD^"를 사용한다는 가정하에 아래 그림 1-1, 1-2를 참고하면 된다. 이 상황의 전제는 아래 그림 1-3이어야 한다. 즉, "원격지에 push를 안 한 상태"이어야 한다. remote에 push한 경우에도 처리하는 방법은 비슷한데 아래에서 정리할 예정.
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
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됨을 알 수 있다.
참고 :
- https://git-scm.com/docs/git-reset ("git-reset" document 공식 홈페이지)