복귀
되돌리기
리셋
리셋은 커밋을 기준으로 이전 코드로 되돌리는 방법으로, 기록한 커밋을 취소한다.
$ git reset {option} {commitID}
- 옵션
soft : 스테이지 영역을 포함한 상태로 복원.
$ git reset --soft {commitID}
- 파일을 수정 후, add 명령어로 스테이지 영역에 올려 커밋 실행하기 직전의 단계로 돌린다.
- 단순히 HEAD 위치를 이동하는 역할만 한다.
- 다시 커밋하면 원상태와 동일한 상태가 된다.
mixed : 기본 값.
$ git reset --mixed {commitID} $ git reset {commitId}
- 리셋한 후, 스테이지 상태까지 복원하지 않는다.
- 작업 내용은 워킹 디렉터리(커밋 전)로 이동한다.
- 원 상태로 돌아가려면, 다시 add 후 commit 하여야 한다.
hard : 실제 파일이 삭제된 이전 상태로 복원.
$ git reset --herd HEAD~
- 워킹 디렉토리 내용도 함께 삭제 된다.
- 이전 커밋을 막 마친 상태로 복귀한다.
reset --soft
명령어를 통해 몇 단계 뒤로 이동한 뒤, 커밋하면 뒤에 있던 커밋 2개가 합쳐져 새로운 커밋으로 바뀐다. 이런 식으로 작업을 하나의 커밋으로 합칠 수 있다.- 스테이지 리셋
스테이지 영역에 올라갔던 파일을 다시 unstage 상태가 되도록 스테이징을 취소 할 수 있다.
$ git reset {fileName} // HEAD를 돌린다. $ git reset {commitId} {fileName} // HEAD 대신 특정 커밋도 사용 가능.
- 작업 취소
수정 작업을 완전히 취소하려면 워킹 디렉토리와 스테이지 상태를 모두 제거하여 마지막 커밋 상태로 되돌려 놓아야 한다. 리셋할 때의 시점을 현재 HEAD 기준으로 하면 해당 시점의 수정 작업을 전부 삭제할 수 있다.
$ git reset --head HEAD
- 병합 취소
리셋은 병합된 브랜치도 취소할 수 있다.
$ git reset --merge HEAD~ // 이전 병합 커밋을 리셋.
- 주의할 점
- 저장소를 외부에 공개했거나 공유 중이라면, 주의해서 리셋을 사용해야 한다.
리버트
리버트는 기존 커밋을 남겨 두고 취소에 대한 새로운 커밋을 생성한다.
$ git revert HEAD // 헤드가 가리키는 커밋 리버트
$ git revert {commitId} // 특정 커밋 리버트
$ git revert {commitId} .. {commitId} // 특정 커밋부터 ~ 특정 커밋까지 리버트
- 리버트는 한 번에 커밋 하나만 취소할 수 있다.
- 병합 취소
리버트를 이용하여 병합한 커밋을 취소 할 수 있다.
$ git revert --mainline 숫자 병합커밋ID // mainline 옵션은 병합을 취소한 후, 체크아웃 되는 브랜치를 표시한다.
- 리버트는 새 커밋을 추가하기 때문에 이력이 복잡해지지만, 공개 저장소의 경우 리셋이 불가능 하기 때문에 리버트를 자주 이용 한다.