[Git] 5.4. 옛날 커밋으로 브랜치를 되돌리기 : reset

업데이트:

카테고리:

태그: , , , ,

reset 명령어

3절에서 만들었던 [feat/b] 브랜치에서 이어서 실습한다.

가. reset : 모든 기억을 남기면서 브랜치를 되돌리기

image

우선 지금까지 실습한 모든 변경사항을 remote branch에도 반영하기 위해 [feat/a] 브랜치와 [feat/b] 브랜치를 푸시한다.

이후 [feat/b] 브랜치는 현재 ‘두 번째 커밋 - 탐나는 커밋 체리 픽’ 커밋에 있는데 이를 하나 전의 커밋인 ‘featb 기능 추가’ 커밋으로 되돌려보겠다.

image

되돌아가길 원하는 커밋을 우클릭한 뒤, [이 커밋까지 현재 브랜치를 초기화]를 클릭한다.

image

그러면 이렇게 옵션을 선택할 수 있는 드롭다운 창이 나온다. 우리가 보통 하고 싶은 커밋 이력을 모두 지우는 reset은 [Hard] 모드이다. 반면 [Soft], [Mixed] 모드는 원하는 커밋으로 이력을 되돌리지만, 이 다음에 추가했던 모든 변경사항을 작업 공간으로 뽑아준다. 말이 애매하니 실습을 통해 확인해보자.


나. Mixed reset

image

기본 옵션 [Mixed] 모드를 선택하고 [확인] 버튼을 클릭한다.

image

성공적으로 [feat/b]가 ‘featb 기능 추가’ 커밋으로 되돌아갔다. 하지만 ‘커밋되지 않은 변경사항’이 생겼고, ‘두 번재 커밋 - 탐나는 커밋 체리 픽’ 커밋이 커밋 이전의 상태인 스테이지 아래로 튕겨나온 것을 볼 수 있다.

image

즉, 커밋 이력은 없던 것으로 돌렸지만, cherrypick.md를 만들었던 기록이 스테이지 아래에 살아났으니, cherrypick.md 파일을 다시 수정하여 새롭게 커밋을 할 수 있을 것이다.


다. Soft reset

image

Soft reset은 Mixed reset과 유사하지만, Mixed reset은 변경사항이 스테이지 아래에 있어 다시 무엇을 Add 할지 고민해볼 수 있는 반면, Soft reset은 변경사항을 스테이지 위로 둬서 다시 당장 커밋할 수 있다는 차이점이 있다.


라. Hard reset

remote branch인 [origin/feat/b]에 있는 ‘두 번째 커밋 - 탐나는 커밋 체리 픽’을 우클릭한 뒤, [Hard] 모드로 reset해보자.

image

image

작업하던 것을 모두 잃을 수 있다는 무시무시한 경고를 하는 팝업 메시지가 뜬다. [예]를 눌러 기록을 모두 지워보자.

image

커밋 이력을 모두 지워 그래프가 깔끔해졌다.


마. Remote branch도 hard reset

위의 Sourcetree의 커밋 그래프를 보면, 로컬 브랜치인 [feat/b]는 ‘featb 기능 추가’ 커밋까지 초기화 되었지만, 원격 브랜치인 [origin/feat/b]는 여전히 ‘두 번재 커밋 - 탐나는 커밋 체리 픽’ 커밋에 위치하는 것을 볼 수 있다. 이 히스토리까지 지우는 푸시를 해보자. 이는 강제 푸시이다. 다시 경고하지만, 강제 푸시는 나만 쓰는 브랜치에서만 해야 한다.

image

Push의 강제 푸시 체크박스를 체크한 뒤 푸시한다.

image

[origin/feat/b]의 remote branch마저 커밋 이력을 모두 초기화하고 ‘featb 기능 추가’ 커밋으로 돌아온 것을 확인할 수 있다.


Reference

  • 팀 개발을 위한 Git GitHub 시작하기, 한빛미디어, 정호영,진유림

댓글남기기