LHJ

I'm a FE developer.

git revert / reset

03 Sep 2020 » git

git revert / reset

git 이력 되돌리기 방법 중 하나입니다.
git에서 이력을 되돌리는 방법은 여러가지가 있지만, 그 중에 대표적인게 resetrevert입니다.
단어 의미만 보고는 둘 사이의 차이를 알기 쉽지 않은데, 풀어서 설명해보면 reset은 시계를 다시 맞추듯이 이력을 그 당시로 되돌리는 것이고, revert는 이전 이력은 그대로 두고 해당 되돌릴 커밋의 코드만 원복시킵니다.

reset

앞에서 설명한대로 reset은 시계를 다시 맞추는 것입니다.
돌아 가려는 커밋으로 레포지토리는 재설정되고, 해당 커밋 이후의 이력은 사라집니다.

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

여기에 옵션이 몇가지 있는데 자주 쓰는 것 hard, mixed, soft 세가지가 있습니다.

  1. hard
    돌아가려는 이력 이후의 모든 내용을 지워버립니다.
     git reset --hard <돌아가고싶은 커밋>
    
  2. soft
    돌아가려 했던 이력으로 되돌아 갔지만, 이후의 내용은 지워지지 않고, 해당 내용의 인덱스(또는 스테이지)도 그대로 있습니다.
    바로 다시 커밋할 수 있는 상태로 남아있는 것입니다.
    git reset --soft <돌아가고싶은 커밋>
    
  3. mixed (옵션을 적지 않으면 mixed로 동작합니다.)
    역시 이력은 되돌려집니다.
    이후에 변경된 내용에 대해서는 남아있지만, 인덱스(또는 스테이지)는 초기화됩니다.
    커밋을 하려면 다시 변경된 내용은 추가해야 하는 상태입니다.
    git reset --mixed <돌아가고싶은 커밋>
    

꼭 돌아가고싶은 커밋 번호로만 돌아갈 수 있는 것은 아닙니다.
현재부터 6개의 커밋을 되돌리고 싶다면 다음과 같이 명령어를 입력하면 됩니다.
```bash git reset HEAD~6 ``

revert

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

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

git revert <되돌릴 커밋>

되돌릴 커밋이 여러개라면 범위를 정해줄 수도 있습니다.

git revert <되돌릴 커밋>..<되돌릴 커밋>

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

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