Git rebase에 대해서 알아보자!

김인태·2022년 7월 5일
1
post-thumbnail

😲Git rebase에 대해서 알아보자!

2차프로젝트를 진행하기 전, 1차에선 git merge를 통해서 브랜치들을 통합했다.
근데 2차 때는 git rebase를 사용하여 프로젝트를 진행한다고한다! 그럼 왜 merge를 안쓰고
rebase를 사용하는지, 무엇인지, 어떻게 사용하는지 알아보도록 하자!

Git rebase?

Git에서 한 브랜치에서 다른 브랜치로 합치는 방법은 Merge와 Rebase입니다.
Merge와 Rebase의 실행결과는 같지만 커밋 히스토리가 달라집니다.
Merge는 쉽고 안전하지만 커밋히스토리가 지저분할 수 있습니다만, Rebase는 잘 모르고 사용할 경우 위험할 수 있어 까다롭지만 커밋히스토리를 깔끔하게 관리할 수 있습니다.


🙋‍♂️Git merge와의 차이점

git merge flow

  • 병합을 하면 합쳐진 브랜치의 커밋 메시지가 중복으로 쌓이게 됩니다.
  • 커밋 순서를 바꾸지 않습니다.
  • 존재하는 브랜치가 변경되지 않습니다.
  • 새로운 merge commit을 생성합니다.

👱‍♀️ 결론적으로는 commit들이 계속 쌓여서 규모가 큰 프로젝트를 할 때는 커밋 내용들을 확인하기 어렵기 떄문에 merge보다는 rebase를 사용하는게 좋다!

git rebase flow

  • 병합을 하면 브랜치의 커밋 메시지가 시간 순서대로 합쳐집니다.
  • 히스토리를 깔끔하게 유지하기 위해 사용합니다.
  • 전체 브랜치를 마스터 브랜치 끝에 위치 시킵니다, 그렇기 때문에 master 브랜치의 기존의 마지막 커밋 뒤에 병합할 브랜치의 커밋들이 합쳐지게 하여 master 브랜치에 재배치(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

  • 커밋 메시지를 변경하는 명령어
  • 커밋 메시지를 변경할 커밋 앞에 reword 명령으로 수정하고, 저장하면 해당 커밋의 메시지를 다시 작성하는 에디터 창이 열리게 됩니다.

edit

  • reword 명령어는 커밋 메시지만 변경하는 명령이라면, edit 명령어는 커밋 메시지뿐만 아니라 커밋의 작업 내용까지 변경할 수 있습니다.

squash

  • squash 명령어는 해당 커밋을 이전 커밋과 합치는 명령어입니다.

fixup

  • fixup 명령어는 squash와 동일하게 해당 커밋을 이전 커밋과 합치는 명령어이지만, 커밋 메시지는 합쳐지지 않습니다.
  • 결과적으로 이전 커밋의 커밋 메시지만 남게 됩니다.

drop

  • drop 명령어는 커밋 히스토리에서 커밋을 삭제합니다.

유의사항 !

  • 이전의 커밋 히스토리를 변경하기 때문에 항상 주의가 필요합니다.

  • 만약 이미 Github과 같은 원격 저장소에 push까지 한 커밋이라면, 변경한 커밋들은 원격 저장소에 push 되지 않을 것입니다.

  • 이때 git push --force 혹은 git push -f 명령으로 강제로 원격 저장소에 커밋 히스토리를 덮어쓸 수 있습니다.

  • 만약 이전에 push 한 커밋들을 다른 개발자들과 공유하고 있었다면, 커밋 히스토리의 불일치가 발생해 git이 꼬이는 현상이 발생할 수 있습니다.

profile
새로운 걸 배우는 것을 좋아하는 프론트엔드 개발자입니다!

0개의 댓글