Git rebase에 대해 알아보자 🥸

2021. 8. 10. 16:06Git 정리

Git rebase에 대해 알아보자

  • 원래는 merge만 사용했었는데, 하나의 브랜치를 만들고 작업을 하다가 commit, push작업을 마쳤지만 history가 지저분하여 다른 브랜치를 생성하고 merge를 하면 변경사항으로 남지 않았기 때문에 내가 했던 작업을 commit, push를 할 수 가 없었다. 여기서 방법은 2가지가 있는데 Cherry Pick or rebase를 활용하면 된다. 이번에는 rebase를 활용해보겠다.

merge와 rebase를 했을 때 가장 큰 차이는 "깔끔함"

2021-08-10-3-14-57.png

  • merge로 사용하면 모든 commit을 남기게 되지만, rebase를 이용하면 필요없는 commit을 생략시키기 때문에 master의 commit은 항상 깔끔하다.
한 가지 예를 들어보자
  • 만약 feature/test라는 branch를 만들어서 열심히 작업을 하고 master에 merge 사용해서 병합한다고 하면, feature/test에서 기록한 모든 commitmastercommit으로 기록된다.
  • rebase 방식을 사용해서 병합한다면, 내 작업하면서 남겼던 commit 중 불필요한 것들은 생략시키고 필요한 commit 남겨서 master에 병합하기 때문에 mastercommit은 항상 깔끔하게 관리된다는 장점이 있다.
    똑같은 병합이지만, 나중에 mastercommit을 볼 때 깔끔하게 볼 수 있어서 여러 명이 협업할 때 유용!!!!

그렇다면 Rebase 하는 방법을 알아보자. (아래의 방법 직접하지는 않았으며 블로그 바로가기에서 가져왔습니다.)

  1. master에서 feature/test라는 branch를 만들고 퇴근 전까지 열심히 작업했다고 가정을 해보자. 퇴근 전에 commit을 남긴다면 아래와 같을 것이다.

    master > git checkout -b feature/test
    feature/test > git add .
    feature/test > git commit -m 'fix typo'
  2. 다음 날 출근해서 다시 남은 작업들을 하고, 퇴근 전에 또 commit을 남겼다면 아래와 같을 것이다.

    feature/test > git add .
    featrue/tes > git commit -m 'wip'
  3. 다음 날 또 출근해서 열심히 일하면서 다 작업 한 거 같아서, 테스트를 해보니 버그가 있다! 버그를 다 고치고 마지막 commit을 남겼다면 아래와 같다.

    feature/test > git add .
    feature/test > git commit -m 'bugfix'
  4. originpush 하기 전에 rebase로 불필요한 commitsquash해준다.

    feature/test > git rebase -i @~3
    (참고: -i는 --interactive 옵션이고, @~3은 최근 3개의 commit을 rebase하겠다는 뜻이다 HEAD~3과 같은 뜻이다.)
  5. 그러면 다음과 같은 화면이 보인다. 필요 없는 commits옵션으로 바꿔준다. 여기서는 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
  6. 편집하면 아래와 같은 모습이다. 그리고 :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
  7. 그러면 아래와 같은 또 다른 vicommit을 입력할 수 있게 된다.

    # 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;
  8. 정리를 하면 이런 모양이다. 이 상태에서 :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만 남길 수 있어서 mastercommit 기록을 보면 커밋이 깔끔하게 정리되서 이쁘다.
  • 사실... 저는 이번에 포스팅한 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