Git rebase에 대해 알아보자 🥸
2021. 8. 10. 16:06ㆍGit 정리
Git rebase에 대해 알아보자
- 원래는 merge만 사용했었는데, 하나의 브랜치를 만들고 작업을 하다가 commit, push작업을 마쳤지만 history가 지저분하여 다른 브랜치를 생성하고 merge를 하면 변경사항으로 남지 않았기 때문에 내가 했던 작업을 commit, push를 할 수 가 없었다. 여기서 방법은 2가지가 있는데 Cherry Pick or rebase를 활용하면 된다. 이번에는 rebase를 활용해보겠다.
merge와 rebase를 했을 때 가장 큰 차이는 "깔끔함"
- merge로 사용하면 모든 commit을 남기게 되지만, rebase를 이용하면 필요없는 commit을 생략시키기 때문에 master의 commit은 항상 깔끔하다.
한 가지 예를 들어보자
- 만약 feature/test라는 branch를 만들어서 열심히 작업을 하고 master에 merge를 사용해서 병합한다고 하면, feature/test에서 기록한 모든 commit이 master의 commit으로 기록된다.
- rebase 방식을 사용해서 병합한다면, 내 작업하면서 남겼던 commit 중 불필요한 것들은 생략시키고 필요한 commit만 남겨서 master에 병합하기 때문에 master의 commit은 항상 깔끔하게 관리된다는 장점이 있다.
똑같은 병합이지만, 나중에 master의 commit을 볼 때 깔끔하게 볼 수 있어서 여러 명이 협업할 때 유용!!!!
그렇다면 Rebase 하는 방법을 알아보자. (아래의 방법 직접하지는 않았으며 블로그 바로가기에서 가져왔습니다.)
master에서 feature/test라는 branch를 만들고 퇴근 전까지 열심히 작업했다고 가정을 해보자. 퇴근 전에 commit을 남긴다면 아래와 같을 것이다.
master > git checkout -b feature/test feature/test > git add . feature/test > git commit -m 'fix typo'
다음 날 출근해서 다시 남은 작업들을 하고, 퇴근 전에 또 commit을 남겼다면 아래와 같을 것이다.
feature/test > git add . featrue/tes > git commit -m 'wip'
다음 날 또 출근해서 열심히 일하면서 다 작업 한 거 같아서, 테스트를 해보니 버그가 있다! 버그를 다 고치고 마지막 commit을 남겼다면 아래와 같다.
feature/test > git add . feature/test > git commit -m 'bugfix'
origin에 push 하기 전에 rebase로 불필요한 commit을 squash해준다.
feature/test > git rebase -i @~3 (참고: -i는 --interactive 옵션이고, @~3은 최근 3개의 commit을 rebase하겠다는 뜻이다 HEAD~3과 같은 뜻이다.)
그러면 다음과 같은 화면이 보인다. 필요 없는 commit은 s옵션으로 바꿔준다. 여기서는 commit 1개만 남겨보려고 한다. vi에서 쓰는 명령어로 편집하면 된다고한다!!!
pick f7f3f6d fix typo pick 310154e wip // 여기서 pick을 s로 바꿔준다. pick a5f4a0d bugfix // 여기서 pick을 s로 바꿔준다. # Rebase 710f0f8..a5f4a0d onto 710f0f8 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
편집하면 아래와 같은 모습이다. 그리고 :wq로 vi를 빠져나온다.
pick f7f3f6d fix typo s 310154e wip s a5f4a0d bugfix # Rebase 710f0f8..a5f4a0d onto 710f0f8 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out
그러면 아래와 같은 또 다른 vi로 commit을 입력할 수 있게 된다.
# This is a combination of 3 commits.//이 위치에서 dd를 눌러 줄을 삭제한다. # The first commit's message is: //이 위치에서 dd를 눌러 줄을 삭제한다. Task 1/3 //이 위치에서 dd를 눌러 줄을 삭제한다. # This is the 2nd commit message: //이 위치에서 dd를 눌러 줄을 삭제한다. wip //이 위치에서 dd를 눌러 줄을 삭제한다. # This is the 3rd commit message: //이 위치에서 dd를 눌러 줄을 삭제한다. bugfix //나는 이 commit만 남기고 싶으므로 이건 냅둔다. # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # rebase in progress;
정리를 하면 이런 모양이다. 이 상태에서 :wq를 하면 rebase가 끝나고 브랜치로 다시 돌아오게 된다.
bugfix # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # rebase in progress;
마지막 정리
- 이렇게 git reabase를 하면 여러 commit을 남겼어도 꼭 필요한 commit만 남길 수 있어서 master의 commit 기록을 보면 커밋이 깔끔하게 정리되서 이쁘다.
- 사실... 저는 이번에 포스팅한 Cherry Pick을 자주 사용했는데 rebase를 사용해도 괜찮을거 같아 포스팅했습니다!
주의할 점
- 다른 사람들과 함께 쓰고 있는 브랜치에다가 git push를 한 경우에는 가급적 rebase를 쓰지 않는 것이 좋다. 내가 rebase한 내용을 다른 사람이 git pull 로 당겨 받으면 엄청난 Conflict를 만날 수 있다고합니다....😨
그래서 local에서 작업하고 origin으로 push하기 전에 깔끔하게 커밋을 정리하는 차원에서 이용하는 것이 좋습니다!!!
'Git 정리' 카테고리의 다른 글
Git Cherry Pick에 대해 알아보자🙌 (0) | 2021.08.10 |
---|---|
Git Commands 정리🧐 (0) | 2021.08.10 |
Git Flow에 대해 알아보자🤔 (0) | 2021.08.10 |