git reset force
Git으로 버젼 관리를 하며 개발하다보면, 작성한 커밋들을 되돌려서 다시 이전 상태로 원상복구해야 할 때가 있다.
로컬repository까지만 저장된 커밋인 경우는 $ git reset
명령어를 이용해 쉽게 커밋을 되돌릴 수 있지만, 이 커밋이 원격 repository까지 이미 올라갔다면 얘기는 조금 달라진다.
- 로컬에서
$ git reset
명령어를 이용해 내가 되돌리고 싶은 커밋시점으로 되돌린다.
$ git reset --hard [커밋id]
(1) hard
돌아가려는 이력이후의 모든 내용을 지워 버리고 초기화 된다.
(2) soft
돌아가려 했던 이력으로 되돌아 갔지만, 이후의 내용이 지워지지 않고, 해당 내용의 인덱스(또는 스테이지)도 그대로 남아있다. 바로 다시 커밋할 수 있는 상태로 남아있는 것입니다.
(3) mixed ( 옵션을 적지 않으면 mixed로 동작)
역시 이력은 되돌려지고, 이후에 변경된 내용에 대해서는 남아있지만, 인덱스는 초기화 됩니다. 커밋을 하려면 다시 변경된 내용은 추가(add)해야 하는 상태(unstage)입니다.
2. 그 후 원격 repository에 push를 진행
$ git push origin master
하지만, 로컬 repository의 커밋 히스토리가 원격 repository의 커밋 히스토리보다 뒤쳐져 있는데 푸시를 하였으므로 발생한다.
지금 우리가 원하는 것은 이 뒤쳐져 있는 로컬 저장소의 커밋 히스토리를 원격 repository의 커밋 히스토리로 강제로 덮어쓰는 것이므로 이를 위한 옵션 -f
또는 --force
를 명령어에 추가하여야 한다.
$ git push -f origin master
원격 repository에서 커밋 이력 없이 원하는 커밋 시점으로 돌아간 것을 확인 할 수 있다.
그 외, Revert
Revert는 상태를 되돌린다고 볼 수 있다. 스포를 당한 커밋을 revert하고 현재 작성중인 코드만 본다면 reset과 동일한 (hard 옵션 준거만 빼고) 결과를 가진다. 하지만 이력은 같지 않다.
reset은 커밋 이력을 없애는 반면, revert는 커밋 이력을 덧붙여, 소스가 revert 되었다는 것을 알리는 커밋 히스토리가 생성한다.