0. Introduction

  • 이번 단원에서는 git rebase --onto 를 사용하여 다른 브랜치에서 파생된 브랜치를 다른 브랜치로 옮겨 붙여본다.

파생된 브랜치 옮겨붙이기

git rebase –onto (옮겨지는 브랜치가 붙여지는 브랜치) (옮겨지는 브랜치의 base branch) (옮겨지는 브랜치): 다른 브랜치에서 파생된 브랜치 옮겨붙이기

  • 이전 단원과 동일한 branch와 commit을 사용한다.

image

  • fruit branch에서 파생된 citrus branch를 main branch로 옮겨붙이기

    • citrus로 fast forward
    1
    
    $ git rebase --onto main fruit citrus
    
  • 실행한 결과 다음과 같다.

image

  • 그러면 마지막으로 main branch의 HEAD를 옮겨보자.

    1
    2
    3
    4
    
    # 위 명령어를 실행하면서 branch가ㅏ citrus로 전환됬다.
    $ git switch main
    $ git merge citrus
    $ git branch -d citrus
    

image


rebase –onto 되돌리기

  • 되돌리기 위해서는 관련된 브랜치는 삭제되지 않아야 한다.

    • 왜냐하면 해당 명령어 이전으로 되돌리기 위해서는 이 명령어로 영향을 받은 모든 브랜치들에서 하나하나 리셋을 진행해주어야 하기 때문이다.
  • git reflog를 사용해서 내역을 살펴보면 rebase –onto 명령 시 여러 내역들이 진행된 것을 볼 수 있다.

    1
    2
    3
    4
    
    $ git reflog
    c519fac (HEAD -> main) HEAD@{0}: merge citrus: Fast-forward
    a8bfbbf HEAD@{1}: checkout: moving from citrus to main
    c519fac (HEAD -> main) HEAD@{2}: rebase (finish): returning to refs/heads/citrus
    
  • main branch

    • main이 fast-forward 되기 이전 기록으로 git reset --hard를 실행한다.
  • citrus branch

    • 방법 A

      • citrus branch는 해당 branch가 옮겨지기 전 마지막 커밋인 commit: Lime 부분을 reflog에서 찾아 그리로 reset --hard한다.
    • 방법 B

      • 다시 rebase --onto를 사용해서 citrus의 커밋들을 main으로부터 도로 fruit branch의 orange 부분으로 옮긴다. 이를 위해서 orange commit으로 checkout 후, 새로운 브랜치를 만들고 아래 명령어를 실행한다.
      • git rebase --onto temp main citrus
        • citrus branch는 main branch에 붙여진 것이므로, 시작 브랜치가 main이다.
      • citrus의 두 커밋들을 해당 위치로 옮겨붙인 뒤, 새로 만든 브랜치를 삭제한다.

Reference