[Git] git에서 rebase해서 commit 합치기

Git에서 rebase를 통해 변경 내역은 남겨두고 rebase를 통해 commit을 합치는 방법을 알아보자


소개

Git에서 작업을 하다보면 오류를 고치거나 테스트를 하기 위해서 commit을 여러번하거나 불필요한 commit을 하게되는 경우가 있다. 이때 코드는 그대로 남겨두고(변경이력은 그대로) commit을 합치는 방법을 rebase를 통해서 알아보자


방법

특정 python 파일을 계속해서 한줄씩 추가해서 5번 commit을 하고 5번째 commit의 코드 내용은 그대로 유지하면서 commit은 4번째 commit으로 남기는 실습을 진행해 보겠습니다.

  1. rebase_test.py를 만든다
  2. print(“First Commit”)을 추가한다.
  3. “Fisrt Commit”이라는 메시지로 commit한다.
  4. 2~3을 “Fifth Commit”까지 반복한다.


예제 코드

위에 나온대로 하면 아래와 같이 나옵니다.

rebase_test.py

print("Fisrt Commit")
print("Second Commit")
print("Third Commit")
print("Fourth Commit")
print("Fifth Commit")


커밋 내역은 다음처럼 나오면 정상입니다. 추가적으로 나중에 remote에 push하는 과정까지 진행해볼 예정이기에 remote에 추가하였습니다.

Commits


이제 현재 코드를 그대로 “Fifth Commit”의 커밋 메시지를 삭제해보겠습니다. 자 터미널이나 쉘에서 다음과 같은 명령어를 칩니다.

git rebase -i HEAD~2
#HEAD를 포함한 이전 2개까지의 커밋을 보여줍니다.


그러면 아래와 같은 텍스트들이 출력이 됩니다.

Rebase Command Result


이제 커맨드들이 나왔으니 커맨드를 이용해줍시다. 우리는 squash를 통해서 현재의 커밋은 유지하고 이전 커밋으로 녹아드는(내역은 유지하고 메시지는 삭제) 작업을 진행하겠습니다.

아래 내용처럼 picksquash로 변경해주고 저장합니다.

Change to squash


그러면 아래와 같은 화면이 나오는데 여기서 삭제하시고 싶은 Commit을 삭제하시면 됩니다. 우리는 “Fifth Commit”을 삭제하겠습니다. 삭제해주시고 저장하시면 됩니다.

After Save


그러면 아래와 같이 코드는 그대로인데 Commit은 “Fifth Commit”은 사라진 것을 확인 할 수 있습니다.

Git Log Result
Code After Rebase


Remote 저장소에 push 하기

이제 remote에 push를 해보도록 하자

git push origin master


그런데 오류가 생긴다… Updates were rejected because the tip of your current branch is behind라고 현재 브랜치가 remote보다 뒤에 있다고 해서 그렇다고 한다..

그래서 이렇게 rebase를 통해 commit을 합친 경우에는 force push를 해줘야한다.

git push origin master -f


정리

  1. git rebase -i HEAD~2를 명령어 창에 입력
  2. 합치고자 하는 commit에서 pick -> squash로 변경 후 저장
  3. 지우고자 하는 commit 메시지를 지우고 저장
  4. force push로 remote 저장소에 저장


주의사항

force push로 remote에 업로드 하기 때문에 master 혹은 develop 브랜치는 피하는게 좋습니다.