현재상황
이전에 진행하였던 nest-board-project Repository를 다시 진행하려 했을 때, Serverless Framework와 nest.js Package가 과거의 버전으로 설치되어 있었고, 일부 서비스가 CQRS Pattern으로 작성되어 있어 프로젝트의 패턴을 원하는 대로 수정할 수 없는 상태가 되어 있었습니다.
현재 nest-board-project Repository의 @nest/cqrs Package가 설치되기 전 상태로 되돌린 후 Serverless Framework와 nest.js의 버전을 올릴 수 있도록 수정이 필요한 상태입니다.
목표
- nest-board-project Repository의 Git Commit Log를 남긴 상태에서 여러개의 Commit Log를 1개의 Commit을 이용해 되돌리는 것을 목표로 잡았습니다.
- 현재 Repository를 CQRS Package가 설치되지 않은 8de5720 Hash의 상태로 되돌립니다.
알아보기
git reset 명령어는 Commit을 이전으로 되돌리면서 기록한 Commit을 취소합니다. 예를들어 이전에 작성한 Commit Log의 Hash값을 입력하거나, HEAD~와 같이 입력하여 현재 HEAD가 바라보고 있는 Commit을 기준으로 특정 갯수만큼 Commit을 취소하도록 사용할 수 있습니다.
대표적으로 git reset을 한 이후 git push --force와 같이 Git Repository에 반영된 Commit 기록을 삭제할 때 주로 사용됩니다.
git reset의 경우 기존에 등록된 Commit Log를 삭제하기 때문에, “Git Commit Log를 남긴 상태에서 여러개의 Commit Log를 1개의 Commit을 이용해 되돌리는 것” 이라는 목표에 부합하지 않은 명령어 입니다.
git revert의 경우 하나 또는 여러개의 Git Commit의 변경 사항을 되돌리고, 새로운 커밋으로 기록하기 위해 사용합니다.
이전에 확인한 git reset은 Commit을 이전으로 되돌리면서 기록을 삭제 하였지만, git revert는 Commit Log를 남겨둔 상태에서 취소한 변경 사항들을 등록합니다.
git revert는 아래와 같은 연산자를 이용해 여러개의 Commit을 한번에 되돌릴 수 있습니다.
git revert <Commit Hash 1>..<Commit Hash 2>
- <Commit Hash 1>..<Commit Hash 2> 문법은 아래와 같은 Link에서 상세한 문법을 확인할 수 있습니다.
- git rev-list Description Link
git revert 8de5720..HEAD
.. 연산자를 사용하여 git revert를 진행하려 할 때, 되돌리려는 모든 Commit에서 변경되는 정보들을 하나씩 저장 및 설정해주어야하고, git revert하려는 Commit 갯수만큼 모든 Commit들이 생성되는 문제점이 발생하게 됩니다.
해당 문제를 해결하기 위해 --no-commit이라는 추가 옵션을 설정하여 commit 기록을 남기지 않고, 파일만 변경되도록 수정하였습니다.
해결방안
git revert의 --no-commit 옵션과 .. 연산자를 이용해 revert하는 여러개의 Commit Log를 되돌리면서 Commit을 자동 생성하지 않도록 설정할 수 있게 되었습니다.
$ git revert --no-commit 8de5720..98c61b081f1f256696b571867c0cddb078d7d0cc
or
$ git revert -n 8de5720..HEAD
현재 게시글은 Notion에 작성된 글을 바탕으로 작성된 게시글입니다.