ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • git merge, rebase, squash
    버전관리/Git,Github 2022. 8. 3. 23:49

    Git Rebase, Merge, Squash

    이번 포스팅에서는 Git 에서 브랜치를 합칠 때 사용할 수 있는 Merge 와 Rebase 그리고 여러 커밋을 하나의 커밋으로 합칠 수 있는 Squash 를 알아보도록 하겠습니다.

    우선 다음과 같은 상황을 가정해보겠습니다. 개발팀이 공통으로 작업하는 repository 가 있습니다. 이 때 Master 라는 공동의 브랜치가 있고 어떤 기능을 구현하기 위해 개발자 A 가 my-branch라는 새로운 브랜치를 만들어서 코드 작업을 하려고 합니다.

    이렇게 브랜치를 새롭게 만들려면 다음과 같은 명령어를 입력하면 됩니다.

    git branch my-branch
    git checkout my-branch
    ​
    # 명렁어를 한줄로 축약하면 다음과 같습니다.
    git checkout -b my-branch

    작업을 다 끝내고 master 브랜치에 merge 를 하려고 하는데 만약 master 브랜치에 누군가 merge 나 push 를 했다면 다음과 같은 모양으로 커밋 그래프는 다음과 같이 변경됩니다.

    이 경우 my-branch 를 master에 병합하는 방법에는 merge 와 rebase 가 있습니다.

    Merge

    하나의 브랜치와 다른 브랜의 변경 이력 전체를 합치는 방식입니다.

    실제 git log --pretty --graph --all 명령어를 쳐서 보면 위 사진과 같은 환경일 것입니다. 이때 my-branchmaster 브랜치에 merge 시켜보겠습니다.

    git checkout master
    git merge my-branch

    이와 같이 두 그래프가 합쳐 지고 가장 마지막 커밋에는 Merge가 되었다는 commit 이 한개 생겼습니다. Merge 가 되었다는 커밋은 master 브랜치와 my-branch 브랜치를 부모로 가집니다

    Squash and Merge

    squash 는 commit a + b+ c 를 합쳐서 새로운 commit, abc 를 만들어지고 master에 추가 됩니다. 이때 abc 는 1개의 부모를 가지게 됩니다. squash 는 merge 될 브랜치의 commit history를 합쳐 깔끔하게 만들기 위해 사용됩니다.

    이처럼 sqush 를 사용하면 master branch 기준으로 my-branch 의 변경사항이 모두 반영되고 my-branch 의 여러 commit history 가 합쳐져 하나의 커밋 메시지만 들어간 것을 볼 수 있습니다.

    Rebase and Merge

    이 방법은 모든 commit 들이 합쳐지지 않고 각각 master 브랜치에 추가가 됩니다. 즉 각 commit 은 모두 하나의 parent 를 가집니다.

    git checkout my-branch
    git rebase master
    git checkout master
    git merge my-branch

    여기서 모든 my-branch 의 모든 커밋이 다 붙지 않은것은 제가 conflict를 해결하는 과정에서 반영되지 않은 커밋은 붙지 않았습니다. 예를들어 2.html from develop 같은 경우 제가 이 커밋에서 변경한 내용을 버렸기 때문에 추가되지 않았습니다.

    또한 commit 메시지의 id 를 보면 3.html from develop 의 id 는 원래 bc7182cc5180xxx 인데 rebase 될 때 de7924c78xxx 로 변경된 것을 알 수 있습니다.

    결론적으로 Merge 는 Merge 되었다는 commit 기록이 추가로 남지만 Rebase의 경우에는 Branch 병합시 Merge commit 의 기록이 남지 않고 마치 하나의 브랜치에서 작업한 것처럼 보입니다.

    요약

    1. Rebase 는 브랜치를 합치려는 목적으로 사용됩니다!
      • Commit History 가 Merge 와는 다르게 선형적으로 그려진다.
    2. Rebase 는 현재 브랜치의 base 를 바꾸겠다는 것.
      • 생성된 커밋들은 새롭게 복사되어 base가 변경됩니다!
    3. Merge 를 한 코드 결과, Rebase 를 한 코드 결과는 같아야합니다!

    참조

    댓글