두 브랜치의 작업을 합치는 두 방법이다. 머지는 히스토리를 그대로 두고 합치는 커밋을 하나 더 만들고, 리베이스는 내 커밋들을 상대 브랜치 끝 위로 다시 적용해 일직선 히스토리를 만든다.
머지
- fast-forward(빨리 감기): 대상 브랜치가 갈라진 뒤 새 커밋이 없으면 새 커밋 없이 브랜치 포인터만 앞으로 옮긴다
--no-ff: 그런 경우에도 머지 커밋을 꼭 만든다. "이 기능 브랜치가 언제 들어왔는지"가 히스토리에 남는다- 장점은 실제로 일어난 일을 보존한다는 것, 단점은 머지 커밋이 쌓이면 그래프가 복잡해진다는 것
리베이스
- 내 커밋을 새 기준 위에 하나씩 다시 만든다. 커밋 해시가 바뀐다
- 히스토리가 깔끔해 blame·bisect로 따라가기 쉽다
- 원칙: 이미 푸시해 남과 공유한 커밋은 리베이스하지 않는다. 다른 사람의 히스토리와 갈라져 충돌과 중복 커밋이 생긴다
git merge --no-ff feature
git rebase main # 내 브랜치를 main 끝으로 옮기기
git pull --rebase # 원격 갱신을 머지 커밋 없이 받기고르는 기준
내 로컬 브랜치를 최신으로 맞출 때는 리베이스, 공유 브랜치에 기능을 합칠 때는 머지(필요하면 --no-ff)가 흔한 조합이다. 다른 기준 브랜치에서 시작했어야 하는 작업을 옮길 때도 git rebase --onto가 쓰인다. 커밋을 정리하는 일은 인터랙티브 리베이스로 커밋 정리, 되돌리기는 git reset (soft·mixed·hard)과 git revert를 본다. 결국 팀 규칙의 문제라 커밋 단위 합의와 함께 정한다.