Gidhub BE Developer

Git :: Reset과 Revert

2018-11-13
goodGid
Git

Reset

  • 돌아가려는 커밋으로 재설정되고

  • 돌아가려는 커밋 이후의 이력은 사라진다.

  • 위 그림을 보면 기대했던 영화를 예매하였으나 스포일러 때문에 실망했던 이력을 볼 수 있다.

  • 그래서 스포일러를 보기 전으로 이력을 되돌리자.

  • 즉 커밋 a3bbb3c 이후의 이력은 모두 지운다.

$ git reset <옵션> <돌아가고싶은 커밋>
  • reset을 사용할 때 사용되는 옵션이 있다.

  • hard, mixed, soft 3가지가 있다.


Hard

  • 돌아가려는 커밋 이후의 모든 커밋을 지워버린다.

  • 이렇게 하면 표를 예매하고 팝콘과 사이다를 구매했던 모든 것들이 지워지고 모든것이 초기화 된다.

$ git reset --hard  a3bbb3c


Soft

  • 돌아가려 했던 커밋으로 되돌아 갔지만

  • 이후의 내용이 지워지지 않고

  • 해당 내용의 인덱스(또는 스테이지)도 그대로 존재한다.

  • 바로 다시 커밋할 수 있는 상태로 남아있는 것이다.

  • 기억은 되돌려졌지만 표와 팝콘과 사이다는 손에 들려있는 상태이다.

$ git reset --soft a2bbb3c


Mixed

  • 옵션을 적지 않으면 기본적으로 mixed로 동작한다.

  • 역시 이력은 되돌려진다.

  • 이후에 변경된 내용에 대해서는 남아있지만 인덱스는 초기화 된다.

  • 커밋을 하려면 다시 변경된 내용을 추가해야한다.

  • 기억도 되돌려 졌고 표와 팝콘 그리고 사이다는 사야겠다는 마음만 남아있다고 할 수 있다.

$ git reset --mixed a2bbb3c


Revert

  • Revert는 상태를 되돌린다고 볼 수 있다.

  • 스포를 당한 커밋을 revert하고

  • 현재 작성중인 코드만 본다면 reset과 동일한 (hard 옵션 준거만 빼고) 결과를 가진다.

  • 하지만 이력은 같지 않다.

  • 먼저 결과를 먼저 보자.

  • 이전 이력은 그대로 있고

  • 스포일러를 당했던 커밋만을 되돌렸다.

  • 마치 스포일러 당한것에 대한 것을 기억하고 있지만

  • 그 내용은 알지 못하는 상태이다.

# git revert <되돌릴 커밋> 
git revert 2664ce8
  • 되돌릴 커밋이 여러개라면 범위를 주어서 여러개를 선택도 가능하다.
git revert 2664ce8..15413dc

언제 reset을 하고 언제 revert를 해야하나?

  • 단순하게 생각하면 reset을 하는 것이

  • revert를 하는 것보다 이력을 더 단순하게 만들어주기 때문에

  • revert의 장점이 많지 않아 보인다.

  • 하지만 이력 중간에 로그 출력하도록 한 커밋이 있고

  • 그 커밋만을 취소하려고 한다면 reset을 사용하여 이후의 이력을 모두 제거하는 것은

  • 이후 이력을 모두 날려버리는 결과를 초래한다.

  • 이럴 때 revert를 사용하여 해당 커밋의 내용만 되돌릴 수 있다.

  • 또한 이미 원격 Repository에 push를 한 상태라면

  • reset을 사용하면 reset 하기 이전으로 되돌리기 전까지는 push 할 수 없게된다.
    (물론 force라는 무시무시한 옵션이 있다. )

  • 그래서 이미 push한 코드라면 미련을 버리고 revert를 해야한다.


Reference


Recommend

Index