-
Git 교과서 04 (복귀)Git Github 2021. 12. 15. 21:33
복귀
깃을 사용하면 언제든지 원하는 시점으로 전체 코드를 되돌릴 수 있다.
깃에서 코드 작업을 되돌리는 방법은 크게 reset과 revert 두 가지다.
리셋 Reset
리셋은 커밋을 기준으로 이전 코드로 되돌리는 방법으로 기록한 커밋을 취소한다.
이전 코드로 복귀하려면 복귀 시점을 알려 주어야 한다. 이 시점은 커밋을 기준으로 정한다. 커밋은 log 명령어로 조회할 수 있다.
$ git log --oneline
고정된 해시값을 사용하지 않고, HEAD 포인터를 이용하여 상대적 위치를 지정할 수도 있다.
$ git reset --hard HEAD^^
reset 명령어를 사용하면 지정된 커밋 코드로 되돌아간다. 즉, 특정 커밋의 해시 값 상태로 모든 코드를 복구한다.
$ git reset 옵션 커밋ID
reset 명령어는 세 가지 옵션이 있다.
- soft : 가장 낮은 단계의 동작이며 스테이지 영역을 포함한 상태로 복원한다. 파일을 수정하고, add 명령어로 스테이지 영역에 올려 커밋을 실행하기 직전의 단계로 되돌린다. 단순히 HEAD 위치를 이동하는 역할만 한다.
- mixed : 기본 옵션 값이다. 워킹 디렉터리로 이동한다. 리셋한 후 스테이지 상태까지 복원하지 않는다.
- hard : 실제 파일이 삭제된 이전 상태로 복원한다. 커밋 이후의 모든 내용은 삭제된다.
스테이지 리셋
스테이지 영역에서 등록된 파일을 다시 unstage 상태로 만들 때는 reset 명령어를 사용한다. 파일 이름을 지정하여 리셋하면 해당 파일은 unstage 상태가 된다. HEAD 대신 다른 커밋 ID를 사용할 수도 있다.
$ git reset 파일이름
$ git reset 커밋ID 파일이름
작업취소
코드를 수정하는 도중 오류가 생겨 현재 작업을 모두 취소해야할 수도 있다. 워킹 디렉터리와 스테이지 상태를 모두 제거하여 마지막 커밋 상태로 되돌려 놓아야 한다. 리셋할 때의 시점을 현재 HEAD를 기준으로 하면 해당 시점의 수정 작업을 모두 삭제할 수 있다.
$ git reset --hard HEAD
리버트
공개한 저장소에서는 커밋의 버전을 되돌리기 위해 리버트를 사용한다. 리버트와 리셋의 차이점은 커밋 정보 삭제 여부이다.
취소 커밋
리버트는 기존 커밋을 남겨 두고 취소에 대한 새로운 커밋을 생성한다. 취소 커밋은 지정한 커밋을 삭제하지 않는다. 그 대신 삭제를 위한 새로운 커밋을 생성한다.
공개된 커밋은 삭제하지 않으므로 취소하고자 하는 커밋을 리버트한다. 직전의 커밋을 리버트할 때는 HEAD 포인터를 사용하면 편리하다.
$ git revert HEAD
리버트 지정
리버트는 한 번에 커밋 하나만 취소할 수 있다. 여러 커밋을 리버트하려면 최신 커밋부터 순차적으로 취소해야 한다. 직전의 커밋이 아닌 다른 커밋을 취소하려면 커밋 해시 값을 지정한다.
$ git revert 커밋ID
$ git revert 커밋ID .. 커밋ID // 지정 연산자로 여러 커밋 리버트
병합 취소
리셋은 방금 전 실행한 병합만 삭제한다. 하지만 리버트는 시간이 지난 후에도 과거의 병합을 선택하여 취소할 수 있다. 리버트로 병합을 취소할 때는 --mainline 옵션을 같이 사용할 수 있다.
$ git revert --mainline 숫자 병합커밋ID
'Git Github' 카테고리의 다른 글
Git 교과서 06 (서브모듈) (0) 2021.12.16 Git 교과서 05 (배포와 태그) (0) 2021.12.16 Git 교과서 03 (병합과 충돌) (0) 2021.12.15 Git 교과서 02 (임시처리) (0) 2021.12.15 Git 교과서 01 (0) 2021.12.13