상세 컨텐츠

본문 제목

Git reset 명령어로 push된 commit 제거하기

ETC/기타

by 쑤야. 2023. 1. 4. 23:33

본문

1. Problem

 

2학기가 종강한 이후 Todoary 프로젝트를 본격적으로 리팩토링 하고자 우선 ViewController와 View 코드/파일 분리를 진행했다.

 

내 파트를 모두 분리하고 며칠 뒤, Todoary 프로젝트에 DesignSystem을 구축하고자 프로젝트 파일을 열고 최근 버전으로 업데이트를 위해 pull을 했는데 뭔가 이상했다

 

나의 커밋들이 모두 사라지고 리팩토링 이전의 상태 되돌아가버린 것이다😱

 

아래와 같이 ViewController와 View 분리 리팩토링을 한 나의 파일들이 모두 사라진 상황이다….🥹(내 소중한 커밋들..)

 

이유를 찾기 위해 default 브랜치인 Develop 브랜치의 커밋을 살펴보았는데, 뭔가 이상한 것이 하나 있었다

 

 

바로 Revert였다.

 

git에서 revert 명령어를 사용해본 적이 없어서 이게 뭐지… 했는데 대충 커밋을 되돌리는 명령어라는 것을 알게 되었다

이미 Develop 브랜치에 push가 되어버린 상태라 이걸 어떻게 되돌려야 하나… 서치 하느라 바빠지기 시작했다

 


2. Search

 

나의 마지막 커밋을 기준으로 새로운 브랜치를 생성해 pull-request를 시도해보았지만,

이미 Develop 브랜치에 push가 되어있는 커밋이라 pull-request를 열 수 없는 상황이었다 하하..

 

할 수 없이 Develop 브랜치 자체를 건드려야겠다는 생각을 하게 되었다.

 

Develop에서 revert를 통해 커밋을 되돌릴려고 했는데, 내가 마지막으로 작업한 상태로 되돌아가도 문제의 파일들이 계속해서 기록이 남아있었다.

# revert

👉🏻 이전 이력은 그대로 두고, 되돌릴 커밋의 코드만 복구시킨다.

 

나는 이전 커밋 기록들 제거가 필요한 상황이었기에 revert 명령어는 적합하지 않은 방법이기 때문이다.

그렇다면 이전 커밋 기록들을 제거하는 명령어는 무엇인가

 

# reset

👉🏻 돌아가려는 커밋으로 레포지토리가 재설정되며, 해당 커밋 이후의 기록은 모두 사라진다.

     * hard : 돌아가려는 커밋 이후의 모든 기록을 삭제시키는 옵션

 

답은 reset이었다.

 

reset에 특정 커밋 이후의 모든 기록을 삭제시키는 hard라는 옵션이 존재하는데,

이를 통해 현재 문제 상황을 해결할 수 있을 것이라 판단했다

 

@ 참고

[초보용] Git 되돌리기( Reset, Revert )

 

[초보용] Git 되돌리기( Reset, Revert )

개발바보들 1화 git “back to the future”에서 설명한 Reset / Revert에 대한 글입니다.   Git을 익히면서 헷갈렸던 것들 중의 하나가 이력을 되돌리기 입니다. Git에서 이력을 되돌리는 방법은 여러가지

www.devpools.kr


3. Solution and Apply

 

1. 먼저 default 브랜치인 Develop 브랜치에서 돌아가려는 커밋으로 reset을 시키고

git reset --hard [돌아가려는 커밋]

2. force 옵션과 함께 Develop 브랜치에 push를 해주면 된다

git push origin Develop --force

이때 branch 규칙 중에 force push를 allow 해줘야 한다.

(추가로, 우리 팀은 Default 브랜치에 push를 하기 전에 반드시 pull-request를 거쳐야 하는 규칙이 존재하는데,

여기서는 터미널에서 Develop에 손을 대야 하는 상황이었기에 잠시 규칙을 없앴다.)

 

 

나는 혹시라도 문제가 생길 것을 대비해 다른 브랜치를 파서 테스트를 해보고 진행한 것이니.. 혹시라도 이 글을 참고하는 개발자가 있다면 꼭 먼저 테스트를 해보시길..

 


4. Result

Develop 브랜치에 내가 추가해놓았던 github issue, pull-request 템플릿도 잘 들어왔고

 

 

View 파일을 통해 ViewController와 View 코드를 분리해놓은 것도 오른쪽 사진과 같이 원상복구 되었다. 휴

 

 


 

이번 일을 계기로 얻은 교훈은

 

함부로 default 브랜치에 merge하지 않기.

 

그동안 귀찮기도 하고, 프로젝트 초반에 깃허브로 온갖 문제를 다 겪은 후로는 크게 문제 생길 일이 없을 거라 안일했었는데

앞으로 코드 comment 등을 통해 팀원이 수정한 코드에 대해서도 한 번씩 쭉 검토하고 의논해나가는 계기로 삼기로 했다..