Githup 커밋 강제 되돌리기

학습할 Repo를 fork한 후 작업을 수행하고 push 후 PR을 날리고 잘 되었는지 확인하던 중 불필요한 파일들까지 커밋에 포함되어 날아간 것을 확인했다. 여러명의 작업내용들이 합쳐지고 다시 각자 원격저장소에 sync되기에 조심스러울 수 밖에 없었다. 그래서 급하게 커밋을 되돌릴 수 있는 방법을 찾았다.

 

방법에는 revert와 reset 두 가지가 있었다.

 

첫번째 방법으로 revert를 시도했는데 바로 revert를 하기전 현재 변경사항들이 있어서 그런가 계속 충돌이 발생하고 커밋을 하고 난 후에도 시도했을 때 계속 충돌이 났다. 그리고 해당 과정을 수행하면서 아직 미숙한 단계라 커밋들이 뒤죽박죽하고 더욱 꼬여만 갔다. 그래서 우선 좀 더 쉽게 해결 할 수 있는 방법을 찾았다.

 

그 결과 reset으로 해결하는 방법을 알게되었다. 

 

다음과 같이 로컬 저장소에 해당 위치로 hard reset을 하여 되돌린다. hard reset의 경우는 되돌리려 한 커밋을 한 바로 그 상태까지 되돌린다. 나의 경우 작업을 수행하고 1번의 커밋만 있었기에 되돌릴 경우 제출하려고 풀었던 문제들이 다 날아가기에 미리 백업을 해두고 reset을 진행하였다. 그리고 reset된 상태에서 다시 복원을 한 후 commit을 만들었다.

여기까지는 로컬에서 평소와 같이 commit을 만드는 부분이다. 그러나 원격으로 push를 할 때는 생각을 해봐야한다. 지금은 모든 것을 마치고 난 후이기에 각 브랜치들이 가르키는 커밋이 위와 같지만 당시에는 원격 브랜치는 기존에 PR을 날릴 당시 커밋을 가르키고 있다. 

$ git push -f origin main  -> 현재 브랜치에 상태를 그대로 원격 저장소에 push

다음과 같이 명령어를 사용하면 현재 브랜치에 커밋사항들이 강제로 원격저장소에 push된다. 즉 이전에 사항은 무시하고 현재 상태 그대로 push가 되는 것이다. 그 결과 기존에 PR을 날릴 당시 commit은 무시된다. 최종적으로 변경한 상태로 다시 PR을 날려주면 된다.

 

이번 과정을 통해서 push 할 시 -f 옵션이라는 것이 있고 원격 저장소에 올라간 커밋들을 조작할 수 있다는 것을 알았다. 아쉬운 점은 revert는 해당 커밋의 상태로 돌아가되 새로운 커밋을 만들면서 돌아가는 것인데, 이 개념을 생각하면서 진행했던 과정에서 결과적으로 아직 미숙하고 막연한 개념으로 알고 있다는 것을 느끼고 revert와 reset에 대해서 살펴볼 필요성이 있다고 생각한다. 다음으로 PR을 날렸어도 아직 merge되지 않아서인지 해당 PR에 업데이트가 되는 식으로 작동했다. 이 부분에 대해서도 알게는 되었지만, 왜 그런가는 한번 생각해보고 학습해 볼 필요성이 있다고 생각한다.