ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Git] Rebase
    Today_I_Learned 2024. 2. 7. 16:37

     

    작성 목적

    다소 의미가 빈약한 commit 이력들을 깔끔하게 관리할 수 있는 방법을 찾다가 Git 에 Rebase와 Squash 라는 기능이 있다는 것을 알게 되었다.

    먼저 Rebase 기능을 조사하기 위해 Git 공식 문서 (https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-Rebase-%ED%95%98%EA%B8%B0)를 참고 하였다. 그러나 Git 공식 문서의 한글 번역본이 이해하기 어려웠던 부분이 있어 내 수준에 맞게 좀 더 풀어 써보려 한다.

     


     

    Git의 Reabse는 Branch를 합칠 때  Merge와 다르게 Commit history를 깔끔하게 선형적으로 만들어주는 기능이다. 브랜치를 Rebase한 결과물은 Merge를 수행한 결과물과 동일하다.

     

    사전 지식

    Rebase 방법을 설명하기 전에 문서에서 지칭하는 대상(Rebase를 적용할 브랜치, Rebase를 실행할 브랜치)에 대해 정확히 파악할 필요가 있다.

    다음과 같은 브랜치들이 있다고 할 때, experiment 브랜치의 commit 인 E, F를 Rebase 기능을 사용하여 master 브랜치에 합치려고 한다.

    (예시 1.1)

    master    A---B---C---D
                       \
    experiment          E

     

    원하는 그림은 다음과 같다. 

    (예시 1.2)

    master    A---B---C---D---E''

     

    위와 같은 상황에서 문서 상의 표현과 실제 대상은 다음과 같다.

    • Rebase를 적용할 브랜치  = master         = Rebase로 합칠 브랜치
    • Rebase를 실행할 브랜치  = experiment  = Rebase를 할 브랜치

    Rebase란 '기준을 ~으로 바꾼다'는 의미이므로 Rebase를 적용할 브랜치, 즉 Rebase의 대상이 되는 브랜치는 master가 되고 반대로 Rebase의 주체는 자신의 기준을 바꾸게 되는 experiment 가 된다.(...라고 본인은 이해했다.)

     

    Rebase 사용 방법

    (예시1.3)

    git chekout experiment
    git rebase master     // experiment 브랜치의 기준(base)을 master로 변경한다.
                          // 실제로는 master와 다른 변경사항 부분(E)만 patch 파일로 저장하고 
                          // experiment 브랜치는 master 브랜치의 마지막 commit을 가리키도록 한다.
                          // 이후 experiment 브랜치에 patch 파일들을 적용한다.(E')
                          // 여기까지의 모습이 궁금하다면 공식 문서의 ' 그림 37.' 을 참고
    git checkout master
    git merge experiment  // master 브랜치를 experiment로 Fast-Forward한다. (예시1.2와 같은 그림이 됨.)

    (* Fast-Forward: A 브랜치에서 다른 브랜치 B를 Merge 할 때 B 브랜치가 A 브랜치 이후의 커밋을 가리키고 있으면 그저 A 브랜치가 B 브랜치와 동일한 커밋을 가리키도록 Head만 이동하여 두 브랜치를 병합하는 방식. 참고: https://git-scm.com/book/ko/v2/Git-%EB%B8%8C%EB%9E%9C%EC%B9%98-%EB%B8%8C%EB%9E%9C%EC%B9%98%EC%99%80-Merge-%EC%9D%98-%EA%B8%B0%EC%B4%88#_basic_merging)

     

     

    Rebase 심화 활용

    내가 아닌 다른 브랜치에서 갈라져 나온 브랜치를 나에게 Rebase로 합치기

    -> 내가 아닌 다른 브랜치(ex.server)에서 갈라져 나온 브랜치(ex.client)를 나(ex.master)에게 Rebase로 합치기

    주요 키워드: --onto

     

    다음 같은 상황에서 master에 client를 합치고 싶을 때에도 Rebase를 사용할 수 있다.

    (예시 2.1)

    master    A---B---C---D
                       \
    server              E---F
                         \
    client                G---H

     

    (예시 2.2)

    git rebase --onto master server client
        // server로부터 갈라진 이후 client에서만 변경된 내용들은 patch로 만들고
        // master 브랜치에 이 patch 파일을 적용하여 commit 한다.
    
    // 여기까지 했을 때의 모습
                                   ↓client 
    master    A---B---C---D---G'---H'
                       \
    server              E---F
    
    
    git checkout master
    git merge client  // master 브랜치를 client로 Fast-Forward

     

     

    주의 사항

    Git Rebase를 사용할 때에는 반드시 Push 되지 않은 Commit 들에 대해서만 Rebase를 수행하라는 것이다.

    이미 Push된 Commit으로 Rebase를 진행할 경우 다른 사용자가 해당 Commit으로 Fetch 받아 작업을 진행하고 다시 Push 하는 경우 Commit이 꼬이게 된다.

     

    댓글

Designed by Tistory.