namkyujin.com

2016-08-20
#git

GIT 여러 commit을 하나로 합치기

버전 관리 시스템은 변경 내역을 기록하고 보관 하기 위해 사용하는 만큼 이력들(commit log)를 잘 관리하는 것이 중요하다. 이를 위해서는 은근히 신경 써야 할 것 들이 많은데

  1. 좋은 커밋 메시지를 작성한다.
  2. 일련된 작업 단위의 커밋
  3. 커밋 전략, 브런치 전략 등등

회사에서는 SVN을 사용하고 개인 작업용으로는 주로 Git을 사용했는데 최근 스터디 모임등으로 인해 Git으로 협업을 하게 되었다. 따라서 혼자 브런치를 가르고 합치는 등의 방법을 연습하고 있는데 아주 재미있다.

현재 진행하는 스터디 모임에서는 각자가 담당 도메인마다 브런치(Brunch)를 따서 작업을 하고, 한 주간 완료 된 작업은 다시 develop 브런치로 Pull Request 를 보내 반영하는 식으로 진행한다.

이 때 발생 한 문제는, 같은 내용이 여러 커밋에 거쳐 나눠진다는 것이다. 무슨 말이냐면

  • 수요일에 일단 작업을 마무리 하고 커밋을 했다.
  • 목요일날 생각해보니 조금 수정을 해야할 것 같다. 수정을 하고 커밋을 했다.
  • 금요일날 또 생각해보니 수정을 해야할 것 같다. 수정을 하고 커밋을 했다.

최초에 기능을 개발한 후, 2번의 수정을 거쳤다. 물론 나의 입장 에서 보면 별개의 작업들이지만, 내 커밋 로그들이 여러 사람들의 커밋로그들이 모두 합쳐질 통합 브런치에 포함된다고 생각해보자. 그렇게 생각해보면 이 세 개의 커밋들은 결국 하나의 커밋으로 합쳐 통합 브런치에 포함하는 것이 낫다고 할 수 있다.

여러 커밋 하나로 합치기

이미 모든 작업들이 커밋 완료 된 상황이다. 나는 최근 2개의 커밋을 하나로 합칠 것이다.

1$ git rebase -i HEAD~2

위의 명령어로 최근 현재 HEAD 부터 최근 2개의 커밋을 rebase 하라고 명령한다. (만약 커밋하지 않은 파일이 있다면 --autostash를 붙여준다.) 그럼 아래와 같은 화면이 나타난다.

두번째 줄의 picksquash로 변경한 후 :x. 그럼 합친 커밋의 커밋 메시지를 새로 작성할 수 있게 해준다. 아래와 같이 커밋 메세지를 새롭게 입력한 후 :x

이제 합친 커밋을 원격 저장소에 push 를 하면 오류가 발생한다.

왜냐하면 히스토리로 봤을 때는 현재 로컬저장소에서 원격저장소로 푸쉬하려는 커밋은 HEAD가 더 뒤에 있기 때문이다. 위에서 커밋을 합치는 과정에서 더 이전의 커밋으로 합치는 과정을 거쳤기 때문인듯 하다. 이때에는 브런치명 앞에 + 를 포함하여 강제로 푸쉬(force push)를 한다.

1$ git push origin +브런치명

force push 를 할 때는 항상 주의해야 한다.

참고자료