merge
와 rebase
모두 두 개의 브랜치를 합치기 위해 사용되지만 합치는 방식에 차이가 있다.
git switch main
git merge feature
만약 feature 브랜치가 갈라져 나온 이후 master 브랜치에 변경 사항이 없다면 fast-forward되어 feature 브랜치의 commit들이 main 브랜치의 가장 끝에 이어붙여진다.
그렇지 않고 main 브랜치에 변경 사항이 있는 경우, 변경사항들이 순서대로 replay된 후 새로운 merge commit이 생성된다.
새로운 merge commit이 생성된다 하더라도 이미 양쪽 브랜치에 존재하던 commit들이 수정되지는 않는다.
모든 commit이 보존되기때문에 commit history가 복잡해질 수 있다.
git switch main
git merge --squash feature
git commit
git switch feature
git rebase main
feature 브랜치를 main 브랜체이 rebase 하게 되면 현재 main 브랜치의 가장 끝에서 feature 브랜치의 commit들이 새로 생성된다.
commit history가 새로 써지며 feature 브랜치에 있던 commit들의 id가 바뀐다.
불필요한 merge commit이 생성되지 않으며 history가 정리된다.
feature 브랜치에서 작업하고 있는 동안 main에서 변경사항이 발생하면 rebase를 해 주어 main의 변경사항을 feature에 미리 반영해 주는 것이 좋다.
다른 사람과 공유 중인, 이미 remote 레포지토리에 올린 commit은 절대 상의 없이 rebase하지 말 것!
git reflog
git reset --hard <commit-id>