ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 히스토리를 디자인하다 - Rebase Interactive
    GIT 2025. 11. 10. 17:39

     

    깃으로 협업을 해본사람이라면 수많은 commit과 merge로 뒤엉켜있는 경험을 해본적이 있을것이다.

    물론 잘 관리해서 기능에 문제없이 만들면 그만이지만, 나중에 이 히스토리들을 읽는건 또 다른 문제가 된다.

     


     

    merge랑 Rebase의 차이

     

    쨌든 merge와 Rebase는 브랜치를 합치는건 같은데

    아래와 같은 차이점이 있다.

     

    merge : 히스토리를 있는 그대로 보존

    Rebase : linear(선형)으로 히스토리를 다시쓰며 동일커밋이라도 새 커밋이 생성됨

     

    그런데 단순히 rebase 쓰는 것을 넘어

    히스토리를 수정/삭제/합치기까지 할수있는 기능이 필요하다면?

    그럴때 바로 Rebase Interactive 를 쓰면된다는 말씀!

     

    아래와 같은 상황이 있다

    git init rebase-test
    cd rebase-test
    echo "1" > a.txt
    git add .
    git commit -m "first"
    
    echo "2" >> a.txt
    git add .
    git commit -m "second"
    
    echo "3" >> a.txt
    git add .
    git commit -m "third"
    
    git log --oneline

    이렇게 작성하면

    a3c1234 third
    b2b2345 second
    a1a1111 first

    커밋 3개가 생성이 된다.

     

     

     

    그런데 third와 second를 만약에 Squash 하고싶다면?

     

    1. rebase -i 실행

    git rebase -i HEAD~3

    HEAD~3 : 현재 HEAD에서 최근 3개의 커밋을 대상으로 rebase를 실행한다는 뜻

     

     

    2. 그럼 에디터가 열리면서 아래와 같이 뜬다

    pick a1a1111 first
    pick b2b2345 second
    pick a3c1234 third

     

    여기서 pick부분을 내가 편집하고싶은 것으로 바꿔주면 된다.

    아래는 쓸수있는 명령어를 정리해보았다!

    pick 그대로 둠
    reword 메시지 수정
    edit 커밋 내용 수정
    squash 이전 커밋과 합치기
    fixup 이전 커밋과 합치되 메시지 버림
    drop 커밋 삭제

     

     

    만약 2,3 번째 커밋을 합치고 싶다면?

    pick a1a1111 first
    pick b2b2345 second
    squash a3c1234 third

     

    3번째 커밋에게 squash 또는 s를 적어주면 끝!

    불필요한 커밋 수정이나 오타수정에 좋다

     

     

    사람이 실수할수도 있지... rebase로 잘못했을 때 복구하고 싶다면?

    git reflog //이전 상태의 해시를 찾는다.
    git reset --hard [원하는 커밋 해시] //이러면 복구완.

     

     

    실수해도 괜찮다. reflog를 사용하면 된다!

     

     

     

    협업에서 rebase를 쓰는것은 위험하다!

    Rebase는 커밋 히스토리를 다시 쓰기 때문에,
    다른 사람이 이미 pull한 브랜치에서 rebase를 하면 충돌이 생길 수 있다.

    따라서 개인작업이나 개인브랜치 안에서만 쓰는것을 권장~!

     

     

     

    git이란 나무가 있다고 생각해보면서 정리해보면

    참 쉽죠? (....아니요)

     

    • branch는 가지이다.
    • merge는 가지를 합치고,
    • rebase는 가지의 출발점을 바꾼다.
    • rebase -i는 과거 커밋 히스토리를 직접 다듬을 수 있는 강력한 도구다.

     

     

     

Designed by Tistory.