호댕의 iOS 개발

[Git] 이미 Push를 해버린 Commit을 어떻게 고치지... 본문

Software Engineering

[Git] 이미 Push를 해버린 Commit을 어떻게 고치지...

호르댕댕댕 2021. 11. 13. 12:23

이미 커밋을 하고 한~참 시간이 지났다가 중간에 딱 한 커밋이 카르마 규칙을 준수하고 있지 않은 것을 발견했다. 지금까지 바로 직전의 커밋이었으면 reset을 하고 다시 커밋을 했지만 이미 다른 커밋들이 쌓인 뒤라 reset을 할 수도 없었다.

 

(찾아보니 이미 commit을 했다고 해도 push를 하지 않았다면 ammend 명령어를 사용하면 된다)

 

git commit --amend

 

하지만 이 방법은 Push를 하지 않았을 때 사용할 수 있다. 🥲

 


하지만 나는 이미 Push를 해서 Github에 이미 올렸고 이미 많이 commit을 진행하여 이 방법은 사용할 수 없었다. 

 

이때 사용할 수 있는 방법이 바로 rebase 이다. 

 

먼저 git log를 해서 커밋 로그를 살펴보자. 

 

그렇다면 지금 Head를 기준으로 고쳐야 할 Commit이 어디에 있는지 확인할 수 있다. 

 

예를 들어 현재 Head를 기준으로 6번 먼저 Commit을 했던 코드를 고친다고 가정해보자. 

 

그렇다면 이렇게 명령어를 작성하면 된다. 

 

git rebase -i Head~6

 

다만 rebase를 할 때 수정한 내용이 있다면 이와 같은 에러가 발생한다. 

error: cannot rebase: You have unstaged changes.

 

rebase를 할 때에는 반드시 이미 수정 내용이 stage에 올라가있어야 한다. 

 

만약 push할 내용이 있다면 push를 해주고 아니라면 git stash를 해서 변경 내용을 저장하거나 git checkout . 을 사용해 다시 변경 내용을 지우도록 하자. 

 

이렇게 위 명령어를 입력하면 아래와 같은 화면을 볼 수 있다. 

그림에서 보다시피 Head로 있던 곳에서 시작해서 위에서 6번째 코드까지 rebase를 할 수 있는 것을 볼 수 있다. 

 

여기서 i를 눌러 명령어를 수정할 수 있도록 하고 pick을 reword로 수정하면 해당 커밋 메세지를 수정할 수 있는 창으로 이동하게 된다. 

 

그러면 수정하고 싶은 부분을 수정하고 esc를 눌러 수정 모드를 나온 뒤 :wq를 해서 저장 후 나오면 커밋 메세지가 수정되게 된다. 

 

 

하지만 이렇게 하면 문제가 있다... 🙀

 

바로 Github의 원격 저장소와 Local의 저장소 상태가 다른 것이다. 이렇게 Push를 하려하면 Push가 되지 않는다. 

 

따라서 이때 강제 Push를 해서 원격저장소로 보내줘야 한다. 

 

즉 다음 명령어를 사용해야 하는 것이다. 

git push -f origin branch명

하지만 이렇게 하게되면 강제로 rebase했던 부분을 전부 커밋이 새롭게 되게 된다. 

 

따라서 협업을 하고 있었다면 엄청난 Side Effect이 발생할 수 있는 것이다... 

 

 

항상 Commit과 Push는 신중히 하는 것이 가장 좋은 방법인 것 같다...

 

Comments