git revert / reset
git 이력 되돌리기 방법 중 하나입니다.
git에서 이력을 되돌리는 방법은 여러가지가 있지만, 그 중에 대표적인게 reset
과 revert
입니다.
단어 의미만 보고는 둘 사이의 차이를 알기 쉽지 않은데, 풀어서 설명해보면 reset
은 시계를 다시 맞추듯이 이력을 그 당시로 되돌리는 것이고, revert
는 이전 이력은 그대로 두고 해당 되돌릴 커밋의 코드만 원복시킵니다.
reset
앞에서 설명한대로 reset
은 시계를 다시 맞추는 것입니다.
돌아 가려는 커밋으로 레포지토리는 재설정되고, 해당 커밋 이후의 이력은 사라집니다.
git reset <옵션> <돌아가고싶은 커밋>
여기에 옵션이 몇가지 있는데 자주 쓰는 것 hard
, mixed
, soft
세가지가 있습니다.
- hard
돌아가려는 이력 이후의 모든 내용을 지워버립니다.git reset --hard <돌아가고싶은 커밋>
- soft
돌아가려 했던 이력으로 되돌아 갔지만, 이후의 내용은 지워지지 않고, 해당 내용의 인덱스(또는 스테이지)도 그대로 있습니다.
바로 다시 커밋할 수 있는 상태로 남아있는 것입니다.git reset --soft <돌아가고싶은 커밋>
- 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를 하셔야 합니다.