1차 프로젝트를 진행하면서 본격적으로 git과 github로 협업을 하게 되었다.
그 과정에서 각자 브랜치에서 만든 커밋들과 충돌이 뒤엉키면서 위와 같이 쓸데없는 코드가 많이 생겼다.
더 고급스럽고 깔끔하게 해결하는 방법이 있지 않을까 하는 의문이 생기던 찰나
2차 프로젝트 때부터는 git rebase를 사용하게 되었다.
git rebase란, 묵은 커밋을 방금 한 커밋처럼 이력을 조작하여 로그가 선형적으로 보이게 하는 기법이다.
정리하자면, 이전에 만든 코드를 기준으로 만들었던 브랜치를, 마치 최신 코드를 기준으로 만든 것처럼 이력을 조작해서 시치미를 뚝 떼는 것이다. 만약에 충돌이 생긴다면 이력을 조작하는 중간에 조용히 고쳐주면 된다.
다시 말해, 위의 예시 그림에서와 같이 팀원B가 작업한 master 커밋1,2를 똑 떼서, 뗀 커밋 가지를 팀원 A의 커밋가지에 한 줄로 이어 붙이는 것이 바로 git rebase이다.
로컬의 메인 브랜치로 넘어간다.
로컬의 메인 브랜치에서 원격 브랜치의 메인 내용을 git pull로 최신화한다.
다시 작업하던 브랜치로 돌아와서
리베이스를 진행한다.
이때 pick을 s나 squash로 변경하여 불필요한 커밋을 정리한다.
정리 후에는 esc를 누르고
:wq
로 탈출한다.
만약, conflict가 발생하면 고쳐주면 된다. 리베이스 진행 중에는 자연스러운 현상이니 너무 당황하지 말자.
다시 git add .를 하고
git rebase를 진행시켜주면 된다.
위 7번에서 continue할 것이 없다는 로그가 확인이 된다면 이후 작업을 진행하면 된다.
이후 다시 깃허브에 올릴 때는
git push origin <작업브랜치> -f
로 강제 푸쉬를 이용해야 한다. 이력을 조작하고 푸쉬를 하는 것은 다른 개발자에게 위험한 행위여서 이력을 조작하면 -f라는 특수한 옵션을 붙여서 푸쉬해야 한다.
누누히 말하지만.. push는 신중히..