이번 포스팅은 여러 브랜치로 나뉘어져있는 레포를 rebase 명령을 통해 한줄의 브랜치로 정리하는 과정을 기술한다.
깃 명령은 소스트리를 통해 진행한다. 레포의 상태는 여러 브랜치가 이미 병합되어 있고, 머지된 커밋 이후에 몇개의 커밋이 더 있는 상태이다. 해당 브랜치들을 한줄의 브랜치로 정리하는 작업을 진행한다.
작업의 흐름은
1. 정리되지 않은 레포 만들기
2. 두개의 브랜치를 합치기 위해 merge 직전 커밋으로 reset 하기전에, merge 이후의 커밋내역들을 저장하기 위해 현재 브랜치를 복사해놓기.
3. 각 브랜치를 reset
4. rebase 진행, 충돌 해결
5. 복사해놓은 이후 커밋들과, main 브랜치를 rebase 작업 진행
1. 정리되지 않은 repository 만들기
해당 레포를 브랜치를 하나 더만들어 merge를 시킨 후, 몇개의 커밋을 추가하여 이미 병합된 브랜치들을 합치는 작업을 할 것이다.
이제 이 브랜치들을 커밋 흐름은 유지한 채, 한줄로 만드는 작업을 진행한다. 완성된 브랜치 모습은 아래의 그림과 같다.
2. 두개의 브랜치를 합치기 위해 merge 직전 커밋으로 reset 하기전에, merge 이후의 커밋내역들을 저장하기 위해 현재 브랜치를 복사해놓기.
먼저 두갈래로 나뉘어져있는 브랜치를 rebase하기 전에, 각각 브랜치를 rebase하려는 커밋 지점으로 reset해야한다. 이때 reset하고 나서 리베이스를 하면, merge commit 이후의 commit들은 사라질 수 있기 때문에 다른 브랜치를 생성해 해당 커밋 내역들을 복사해놓는다.
main_copy 라는 브랜치를 생성하기만 하면 된다.
3. 각 브랜치를 merge 직전 커밋 지점으로 reset
해당 과정에서 hard reset을 했지만, mix나 soft로 진행해도 무방하다.
4. origin에 반영해주기 위해 reset한 main 지점을 force push 해주기
force push 해주기 위해 main_copy 브랜치를 생성해 복사한것이다.
force push를 하여 origin에도 main 위치를 반영시켜준다.
5. rebase
A 브랜치를 main 브랜치에 rebase를 해준다. 이때 사라질 브랜치(A)로 체크아웃하여 main 브랜치에 rebase를 진행한다.
이 과정에서 각 커밋끼리 충돌이 일어날 수 있으니 충돌 해결을 해주자.
rebase를 하게 되면 A1, A2 각 커밋이 main2 커밋으로 이동하기 때문에 충돌이 발생할 수 있다. 충돌이 발생한 파일로 이동하여 충돌을 해결해준다.
rebase 작업이 끝나면, 해당 커밋들이 한줄로 정리된것을 확인할 수 있다.
main을 A 2 커밋으로 reset명령어를 통해 위치를 이동시키고, push 명령어를 통해 origin의 main에도 반영시켜준다.
이제 남은 작업은 복사해뒀던 merge 이후의 커밋 (main 3, main 4, main 5)을 A 2 커밋 위로 이동시키기 위해 또다시 rebase 작업을 수행한다.
7. 복사해놓은 merge 이후 커밋들과, main 브랜치를 rebase 작업 진행
main_copy 브랜치로 체크아웃 후, 현재 main 브랜치와 rebase 작업을 수행한다.
어찌된 이유에선지 모르겠지만, 소스트리에서 해당 리베이스 작업이 불가하여 터미널로 작업을 진행했다. =
8. 결과
의도한대로 브랜치가 정리된것을 확인할 수 있다.