ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Git ( Rebase, Squash )
    Computer Science 2023. 11. 7. 09:46

    1. Rebase

       1.1 Rebase --onto

    2. Squash


    1. Rebase

    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 - Rebase 하기

    Rebase는 기존의 커밋을 그대로 사용하는 것이 아니라 내용은 같지만 다른 커밋을 새로 만든다. 새 커밋을 서버에 Push 하고 동료 중 누군가가 그 커밋을 Pull 해서 작업을 한다고 하자. 그런데 그 커

    git-scm.com

    Git에서 한 Branch를 다른 Branch로 병합하는 방법은 크게 2가지가 있다. 하나는 Merge이고 다른 하나가 Rebase이다.

    Rebase는 말 그대로 현 Branch를 목표 Branch로 Base를 재설정하는 것으로 갈라져 나온 가지가 아니라 하나의 가지로 변경된다.

    git rebase master // 현 branch를 master branch로 base를 재설정한다.

    이로 인해 Commit 이 선형적으로 유지됨으로 이해 및 디버그하기 쉬워진다.

    아래는 rebase-test Branch를 main Branch로 Rebase하는 과정이다.

    git checkout rebase-test
    git rebase main
    
    //Rebase 후 main branch를 fast-forward 시킨다.
    git checkout main
    git merge rebase-test

    git rebase 과정

     

    또한 현재 작업하고 있는 Branch에 목표 Branch를 가져오게 됨으로 Branch를 최신화 할 수 있어 작업함에도 용이하다.

    다만 Rebase는 현 Branch의 새로운 Commit 내역을 목표 Branch위에 다시 작성하는 것이다. 이로인해 Rebase를 한 Branch는 목표 Branch 위로 생성된 Commit History가 새로이 변경된다. 따라서 다른 사람이 작업중인 Branch나 원격에 올라간 Branch 등은 Rebase하는 것을 다시한번 생각해보자.

    1.1 -- onto

    내가 작업 한 Branch의 내용을 main 혹은 다른 Branch에 Rebase 하고 싶은데 이 Branch가 바로 갈라져 나온 Branch가 아니라 한번 더 나온 Branch일 때 사용된다.

    git rebase --onto [base로 삼을 branch] [공통 branch] [rebase할 branch]

     

    명령어는 다음과 같으며 공통 Branch의 Commit 내역은 들어가지 않은 채 Rebase할 Branch의 Commit 내역만을 적용할 수 있다.

    예를 들어 A, B, C Branch가 존재하고 A의 3 Commit에서 갈라져 나온 B Branch, B의 4 Commit에서 갈라져나온 C Branch가 있다.

    A : 1, 2, 3[A HEAD]
    B : 1, 2, 3, 4, 5[B HEAD]
    C : 1, 2, 3, 4, 6[C HEAD]

     

    다음과 같을 때 아래의 명령어를 적용하면 

    git rebase --onto A B C

     

    아래와 같이 된다.

    A, C : 1, 2, 3[A HEAD], 6[C HEAD]
    B : 1, 2, 3, 4, 5[B HEAD]

     

    2. Squash

    Git에서 Squash라는 명령어는 존재하지 않는다. 다만 여러개의 연속적인 Commit을 하나의 단일 Commit으로 합치는 작업을 Squash라고 하며 명령어는 Rebase 명령어로 진행한다.

    main branch의 상위 3개를 Squash 한다.

    git rebase -i HEAD~3 // 현재부터 최근 3개까지의 commit을 합친다

     

    해당 명령어를 입력하면 아래와 같이 나오는데 압축할 Commit들을 Pick이 아닌 Squash로 변경후 저장해준다.

    pick 2개를 squash로 변경후 저장

    그런뒤 아래와 같이 해당 Commit Message 내역이 나올텐데 이제 Message 내역을 수정해준다.

    전부 지우고 squash rebase test로 변경해주었다.

     

    Squash는 Commit의 History를 간소화 시킬수 있다는 장점이 있지만 이력 손실 및 하나의 Commit이 너무 커지게 되면 리뷰 등이 힘들어 질 수 있다.

     

     

Designed by Tistory.