2차프로젝트를 진행하기 전, 1차에선 git merge를 통해서 브랜치들을 통합했다.
근데 2차 때는 git rebase를 사용하여 프로젝트를 진행한다고한다! 그럼 왜 merge를 안쓰고
rebase를 사용하는지, 무엇인지, 어떻게 사용하는지 알아보도록 하자!
Git에서 한 브랜치에서 다른 브랜치로 합치는 방법은 Merge와 Rebase입니다.
Merge와 Rebase의 실행결과는 같지만 커밋 히스토리가 달라집니다.
Merge는 쉽고 안전하지만 커밋히스토리가 지저분할 수 있습니다만, Rebase는 잘 모르고 사용할 경우 위험할 수 있어 까다롭지만 커밋히스토리를 깔끔하게 관리할 수 있습니다.
👱♀️ 결론적으로는 commit들이 계속 쌓여서 규모가 큰 프로젝트를 할 때는 커밋 내용들을 확인하기 어렵기 떄문에 merge보다는 rebase를 사용하는게 좋다!
/master에 rebase 할 브랜치로 이동
$git checkout [rebase 할 브랜치]
$git rebase master
//rebase 할 브랜치를 master 브랜치에 merge
$git checkout master
$git merge [rebase한 브랜치]
//수정할 커밋들의 리스트 출력
//git rebase -i [수정을 시작할 커밋의 이전 커밋] 형식으로 입력
$git rebase -i HEAD~4
//4개의 커밋 리스트 노출
hint: Waiting for your editor to close the file...
pick 907c451 commit1
pick 1a7c765 commit2
pick v07c952 commit3
pick 40jc438 commit4
//사용할수있는 명령어 리스트
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# . create a merge commit using the original merge commit's
# . message (or the oneline, if no original merge commit was
# . specified). Use -c <commit> to reword the commit message.
pick
reword
edit
squash
fixup
drop
이전의 커밋 히스토리를 변경하기 때문에 항상 주의가 필요합니다.
만약 이미 Github과 같은 원격 저장소에 push까지 한 커밋이라면, 변경한 커밋들은 원격 저장소에 push 되지 않을 것입니다.
이때 git push --force 혹은 git push -f 명령으로 강제로 원격 저장소에 커밋 히스토리를 덮어쓸 수 있습니다.
만약 이전에 push 한 커밋들을 다른 개발자들과 공유하고 있었다면, 커밋 히스토리의 불일치가 발생해 git이 꼬이는 현상이 발생할 수 있습니다.