Git에서 프로젝트를 과거로 되돌리는 방법은 2가지가 있다.
reset: 원하는 시점으로 돌아간 뒤 이후 내역들을 지웁니다.revert: 되돌리기 원하는 시점의 커밋을 거꾸로 실행합니다.
reset vs. revert
- reset의 경우 과거로 돌아갈 경우 이후 행적이 완전히 남지 않기 때문에 복구가 어렵다.
- revert의 경우 이후의 행적을 취소한다는 사실조차 기록으로 남기 때문에 추후 복구가 비교적 간편하다.
revert로 커밋 취소하기
revert은 과거의 커밋 중 특정한 커밋만 취소해야 하는 경우 유용하다. 예를 들어 아래 그림을 보면

위 히스토리에서 "Replace Lions.." 의 커밋에 revert를 사용하면 작업한 내용을 취소하면서 아래 그림과 같이 취소했다는 사실이 새로운 커밋으로 남게 된다.

협업 시에는 reset보다 revert를 고려하자.
보통 개발자들은 git만을 사용하는 것이 아닌 github와 같은 git 공유 저장소를 사용하여 코드를 공유하고 협업한다. 이때 한번 공유 공간에 올라간 코드에 reset 을 적용하면 협업시 문제가 발생할 수 있다. (reset 이전 상태를 기반으로 작업한 다른 사람들의 코드와 심각한 충돌을 일으킬 수 있기 때문) 따라서 한번 공유된 코드들은 revert를 사용하여 되돌려야 한다.
revert 충돌
간혹 가다가 revert를 사용하면 충돌이 나는 경우가 발생한다. 예를 들어 아래 그림을 보자.

위 그림에서 0985738 해시에 해당하는 커밋을 취소하고 싶다고 해보자. 이때 해당 커밋의 변경사항으로는 아래와 같다.

그러나 해당 커밋을 revert하면 문제가 발생한다. 이는 650df2f에 해당하는 커밋 때문이다. 해당 커밋의 변경사항은 아래와 같다.

문제는 바로 leopards.yaml 파일에 있다. revert 하고자 하는 파일에서 leopards를 생성하므로, revert를 사용하면 leopards는 삭제되어야 한다. 그러나 위 그림의 커밋에서는 해당 파일을 수정하므로 충돌(conflict)가 발생하는 것이다.
이런 경우 git은 자체적으로 leopards 파일을 삭제하기 판단할 수 없으므로 사용자가 추가적인 작업을 해줘야 한다. 만약 leopards를 삭제하고자 한다면 아래와 같이 명령어를 지정한다.
git rm leopards.yaml
이후 중단된 revert 작업을 계속하기 위해 아래와 같이 옵션을 지정한다.
git revert --continue
그러면 아래와 같이 성공적으로 충돌을 해결했음을 알 수 있다.

revert --no-commit
revert 명령에는 --no-commit 이라는 옵션을 지정할 수 있다. 해당 옵션은 커밋 메세지를 작성하지 않고 revert 할 수 있는 옵션으로, 바로 .git repository에 적용되는 것이 아닌 Modified 된 상태에서 사용자가 커밋하기를 기다린다. 아래와 같이 사용할 수 있다.
git revert --no-commit (커밋 해시값)
이러면 최종적으로 커밋하기 전에 원하는 작업을 추가하거나 커밋 메세지를 자신이 원하는데로 정의할 수 있다. 만약 이 단계에서 취소하기를 원한다면 git reset --hard를 사용하면된다.
'Git' 카테고리의 다른 글
| Gitlab CI 적용하기 (0) | 2023.08.29 |
|---|