Git) merge? rebase?
여러분들은 merge와 rebase에 대해 잘 알고 계셨나요? 저는 merge는 알았어도 rebase에 대해서는 잘 몰랐기에 한번 공부해보려구 해요!
git history
깃으로는 많은 사람들이 자신의 개인 프로젝트나 작업물들을 관리하고 협업을 진행합니다. 그렇기 때문에 그 과정 속에서 여러 개의 브랜치가 뻗어있고 커밋이 기록되고 합쳐지곤 하죠. 이러한 기록들을 볼 수 있는게 git history입니다. 이걸 관리하는게 필수는 아니지만 협업을 할 때에 보다 직관적으로 history가 관리되면 개발자간 더 좋은 개발경험을 할 수 있겠죠?
git history가 그래서 관리하면 좋다는건 알겠는데 지금까지는 정말 소규모의 협업만을 경험해왔고 그래서 관리할 필요성을 못느꼈을 수 있습니다. 안해도 깔끔하니까요. 저 또한 지금까지 진행한 협업이 대부분 4명 이하의 협업이었습니다. 그 결과 프로젝트의 Git history는 아래와 같아졌습니다.
그래도 뭐 나름 깔끔한 history를 띄고 있다고 생각이 되네요.
근데 만약 팀이 4명이 아니라 그보다 더 많아진다면 어떨까요? 브랜치의 갯수는 더 많아질 것이고 특정 기간에 여러 브랜치에서 개발하는 인원이 평소보다 많아지는 만큼 history도 복잡해질것입니다.
근데 만약, 계속해서 merge만 사용한다면 브랜치의 연결 선들이 정렬되지 않고 뒤죽박죽 섞이게 되어 사다리타기 하듯 history를 보게 되는 상황이 생길 수 있습니다. 이때 rebase를 사용하면 보다 깔끔하게 history가 정렬되게 됩니다.
어떻게 깔끔하게 정렬이 되는지! merge와 rebase의 차이를 통해 알아보겠습니다.
rebase가 뭔데?
merge는 많이들 사용하시니까 무슨 역할을 하는 친구인지는 아실거라고 생각해요. branch를 통합하는 역할을 하죠!
그럼 rebase는 어떨까요? 그냥 단어만 보면 re, base 두개로 나눠지는데 여기서 base는 branch의 base를 의미합니다.
따라서 rebase는 "branch의 base를 재배치한다(옮긴다)" 라고 생각해주시면 됩니다!
이게 history랑 무슨 관련이 있냐구요? 아래 그림을 볼게요.
- A,B,C지점 중 B지점에서 뻗은 브랜치 주황이 D,E 커밋을 진행한다.
- 주황 브랜치는 자신의 base를 B지점에서 C지점으로 옮기기 위해 C지점으로 rebase를 한다.
- C지점으로 rebase되면서 기존의 D,E 커밋도 정렬되어 두갈래가 아니라 C지점 이후로 변경된다.
이제 rebase를 사용하면 git history가 왜 깔끔해지는지 어느정도 감이 오시나요?
rebase가 merge랑 어떤 차이가 있는데?
rebase를 안쓰면 어떻게 되길래 저게 깔끔하다는거냐!
1) merge
자 왼쪽부터 볼게요
master브랜치를 기점으로 test-1, test-2 브랜치를 생성하였고 각각 1과 2,3이라는 커밋을 해주었어요
가운데
master브랜치를 test-1브랜치와 merge해주었어요.
기존의 2,3커밋은 따로 떨어져있고 커밋 1만 합쳐쳐서 파란색 선으로 연결된게 보이시죠?!
마지막
이제 test-2브랜치와도 merge해줄게요.
자 사진을 보면 파란색과 보라색 두 브랜치는 서로 연결된건 아니지만 겹쳐진게 보이실거에요. 이건 지금 브랜치 2개로 테스트 한거지만 브랜치가 여러개고 여러 곳에서 merge가 일어나면 이것보다 훨씬 더 복잡해지겠죠?
근데 rebase를 쓰면 어떻게 될까요
자 여기까진 merge와 똑같습니다!
master브랜치를 기점으로 test-reb1, test-reb2 브랜치를 생성한 뒤, 각각 1과 2,3이라는 커밋을 해주었고 test-reb1브랜치와 master를 merge해주었습니다! 청록색에 파란색이 연결되었네요
차이는 이제부터 생깁니다.
위의 우측 사진을 보면 test-reb2브랜치의 시작 지점이 아직 master에 있죠? 여기서 그냥 머지를 해주게 되면 아까 merge만 할 때 마지막 사진에서 본 것처럼 파란색과 보라색선이 청록색에 연결되면서 서로 겹치게 될거에요.
그러면 test-reb2브랜치의 시작 지점을 master와 test-reb1브랜치가 머지된 지점으로 rebase해준다면? 어떨까요?
왼쪽을 보시면 test-reb2의 시작 지점이 merge된 master브랜치로 바뀌어서 선이 하나로 통합된 걸 보실 수 있을거에요. 이제 이 상태에서 test-reb2브랜치를 master브랜치와 merge 해주면 우측처럼 보다 깔끔한 history를 만나보실 수 있습니다.
아래 사진으로 결과물의 차이를 봐주세요!
끝!
오늘은 merge와 rebase의 개념과 둘의 차이에 대해 알아보았습니다! 글에 오류가 있다면 언제든 댓글로 남겨주세요 감사합니다 :)