git rebase를 통해서 여러개의 커밋을 하나의 커밋으로 만들어 푸시에 하나의 커밋만 들어가도록 만들어보자.
우선 기본적인 푸시에는 마지막 풀 이후로 쌓였던 커밋이 한번에 들어간다.
위와같이 쌓여있던 커밋이 한번의 푸시에 다 들어가게된다.
이 상황은 최신화된 로컬마스터 브랜치를 기준으로 커밋상황을 합치는 git rebase를 통해서 가능하다.
$ git checkout master
$ git pull origin master
로컬마스터 브랜치에서는 내가 실질적으로 작업을 하지않기 때문에 이전에 풀을 받았을 때와 동일한 상황이라 충돌이 일어날 일이 없을 것이다. 혹시나 충돌이 일어난다면 충돌을 해결해주자.
$ git checkout feature/branch
그리고 현재 마스터의 상태(리모트 마스터브랜치의 상황으로 업데이트된)를 기준으로 이때까지의 커밋을 하나로 합치고, 앞으로 커밋의 기준이되는 커밋을 만드는 rebase를 해준다.
tig를 통해 현재의 커밋과 머지상황을 확인해본다.
위와같이 마지막으로 마스터브랜치가 merge된 이후에 3개의 커밋이 생성되었다.
이제 3개의 커밋을 rebase를 통해서 하나의 커밋으로 합쳐보자
$ git rebase -i master
편집기를 통해서 rebase작업을 수행하기위해 -i를 넣어준다.
위와같이 편집기가 뜨면 직접 수정해준다.
제일 오래된 커밋을 기준으로 현재커밋까지를 하나의 커밋으로 합칠 것이기 때문에, 제일 오래된 커밋이 제일 위에 뜨게 되며, 제일 오래된 커밋에 pick을 하고 나머지는 s(squash)표시를 해준다.
원래 이 과정에서 충돌이 가장 자주발생한다. 내가 작업을 할 동안 리모트마스터에는 팀원들의 푸시가 올라와 많은 업데이트가 이루어져 있을 상황이고 내가 작업해서 나아간 상황과는 달라 져 있을 가능성이 크다.
그렇다면 이 상태에서 rebase를 하게 되면 어떤 상황이 발생할까?
리베이스는 마스터의 상태를 기준으로 내 커밋들을 합치는 것이기 때문에 만약 커밋들이 마스터와 같은 부분을 수정했다면 커밋 갯수 혹은 내 충돌해결 상황에 따라 재충돌을 피할수 없을 경우만큼 충돌이 발생한다. 이러한 이유 때문에 하나의 브랜치에서 푸시하지 않고 오래 머물러 있을 경우 rebase 혹은 merge시 많은 충돌을 피할 수 없다. 2~3번정도의 커밋당 한번의 리베이스와 푸시를 해주도록 하자.
충돌을 전부 해결하고 커밋 통합에 성공했다면
3개의 커밋이 합쳐지고 커밋메세지를 하나로 합쳐주라는 edit 창이 나온다. 3개의 커밋을 합친 적당한 커밋메세지를 적어준다.
커밋메세지를 합치고 tig를 확인해보면 3개의 커밋이 합쳐져 하나의 커밋이 되었음을 알 수 있다.
만약 나의 이전 커밋이 remote master branch에 merge되지 않은 상태에서 푸시를하게되면 어떻게 될까?
위와같이 푸시자체가 되지않는다. 이 경우 --force를 push명령어 뒤에 붙혀 강제로 푸시를 해주어야 한다.