(Git) reset과 revert의 차이 및 설명

1. reset은 그 이전으로 이력을 다시 돌리는 것이고
2. revert는 이전 이력은 그대로 두고, 그 되돌릴 커밋의 코드만 원복시키는 것
==========================================================

1.  Reset 

1. git reset <옵션> <돌아가고싶은 커밋>

옵션의 종류는 hard, mixed, soft 세가지 존재

예) 해당 커밋이후의 이력은 표를 예매하고, 팝콘과 사이다를 구매

1) hard

돌아가려는 이력이후의 모든 내용을 지워버린다.
이렇게 하면 표를 예매하고, 팝콘과 사이다를 구매했던 모든 것들이 지워지고 모든것이 초기화

$ git reset --hard a3bbb3c


2) soft


돌아가려 했던 이력으로 되돌아 갔지만, 이후의 내용이 지워지지 않고, 해당 내용의 인덱스(또는 스테이지)도 그대로 있는 상태. 즉, 바로 다시 커밋할 수 있는 상태로 남은 것이다.
기억은 되돌렸지만, 표와 팝콘과 사이다는 손에 들려 있는 상태

$ git reset --soft a3bbb3c


3) mixed(옵션을 적지 않으면 mixed 로 동작)

역시 이력은 되돌려진다. 이후에 변경된 내용에 대해서는 남아있지만, 인덱스는 초기화된다. 커밋을 하려면 다시 변경된 내용은 추가해야하는 상태

$ git reset --mixed a3bbb3c



또는 되돌아가는 커밋을 커밋 해쉬를 통해서 직접 지정할 수도 있고, 현재부터 몇개의 커밋을 되돌릴 수 있다.

$ git reset HEAD~6
위는 현재부터 6개 이전 이력으로 돌아가라고 상대적으로 지정



2. Revert

Revert는 상태를 되돌린다고 볼 수 있다. 스포를 당한 커밋을  revert하고 현재 작성중인 코드만 본다면 reset과 동일한 (hard옵션 준거만 뺴고) 결과를 가집니다.
하지만 이력은 같지 않습니다.



이전 이력은 그대로 있고, 스포일러를 당했던 커밋만을 되돌리자.
마치 스포일러 당한것에 대한 것을 기억하고 있지만, 그 내용은 알지 못하는 것처럼

git revert <되돌릴 커밋>

$ git revert 2664ce8

되돌릴 커밋이 여러개라면 범위를 주어서 여러개를 선택할 수도 있다.
예를들면 댓글을 읽은 것부터 영화관을 나설때까지 모두 되돌리려면 아래 코드처럼 범위를 주면된다.

git revert 2664ce8.. 15413dc



3. reset과 revert는 언제 사용하는가.


단순하게 생각하면 reset을 하는 것이  revert를 하는 것보다 이력을 더 단순하게 만들어 주기 떄문에 revert의 장점이 많지 않아 보입니다.
하지만 이력 중간에 로그 출력하도록 한 커밋이 있고 그 커밋만을 취소하려고한다면 reset을 사용하여 이후의 이력을 모두 제거하는 것은 이후의 이력을 모두 날려버리는 결과를 가져옵니다. 
이럴 떄는 revert 를 사용하여 해당 커밋의 내용만 되돌릴 수 있습니다. 또한 이미 원격 리파지토리에 push를 한 상태라면  reset을 사용하면 reset하기 이전으로 되돌리기 전까지는 push할 수 없게 됩니다. (물론  force라는 명령어 존재)
그래서 이미 push 한 코드는 revert를 사용해야 한다.



참고 : http://www.devpools.kr/2017/02/05/%EC%B4%88%EB%B3%B4%EC%9A%A9-git-%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0-reset-revert/


댓글

이 블로그의 인기 게시물

(18장) WebSocekt과 STOMP를 사용하여 메시징하기

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬