프로필

프로필 사진
Popomon
Frontend Developer
(2020/12 ~)

    카테고리

    포스트

    [프로젝트 관리] 상황 2. 내 브랜치를 반영하기에는 시간이 너무 많이 지났어 (reset/rebase/cherry-pick)

    2021. 7. 8. 07:31

    꿈가게: To Do List - iOS

    꿈가게: To Do List - Android

    상황은 이렇습니다. 일주일 전에 develop 브랜치로부터 하나의 feature 브랜치를 만들어서 기능을 만들고 있었고 딱 오늘 마침내 모든 개발이 완료되었습니다!
    그런데 .. 깃 그래프를 보니, develop 브랜치에는 수십개의 커밋이 반영되어 있었고, 제 feature 브랜치를 반영하기에는 이미 너무 늦어버린 것입니다.
    이러한 상황에서 feature 브랜치가 마치 현재의 develop 브랜치에서 뻗어나온 가지마냥 만들어주기 위해서 develop 브랜치를 rebase 하는 방법을 선택할 수 있습니다.

    develop 브랜치를 rebase

    $ git checkout feature/myfunction
    $ git rebase develop

    그런데 이게, 일반적인 방법으로 커밋이 반영된 것이 아니라, Github와 같이 Pull Request를 반영한 경우는 또 다릅니다! 별도의 옵션을 통해서 10개의 커밋을 그룹으로 묶어서 1개의 커밋으로 반영되는 경우도 있기 때문입니다.
    이 때는 reset / cherry-pick 두가지의 조합을 사용하는 것을 추천합니다.

    reset / cherry-pick 두가지의 조합

    현재 feature 브랜치를 업로드(push) 하고, 기존의 feature 브랜치를 develop 브랜치와 동일하게 만든(reset --hard) 다음에 처음에 업로드한 브랜치에서 커밋을 하나씩 반영해나가는(git cherry-pick) 방법입니다. 작업 순서는 아래와 같습니다.

    서버에 현재 feature 브랜치 업로드

    여기서 origin은 서버의 저장소 주소값이 들어가 있을 것입니다. 따라서, 서버에 나의 feature 브랜치를 잠시 올려두는 작업입니다.

    $ git checkout feature/myFeature
    $ git push origin feature/myFeature

    feature 브랜치를 develop 브랜치와 동일하게 리셋

    이제 서버에 feature 브랜치를 올려 두었으니 내 컴퓨터에서는 develop 브랜치의 최신 소스와 동일하게 맞춰줍니다. 이 때, 완전히 변경사항을 지워버리면서 맞추도록 하는 git reset --hard 명렁어를 사용합니다.

    $ git checkout feature/myFeature
    $ git reset --hard origin/develop

    서버에 업로드한 브랜치의 커밋을 하나씩 반영

    우선 서버에 업로드한 브랜치의 커밋 아이디를 찾아야 합니다. git log --online 명령어를 통해서 커밋 목록과 아이디를 알아내 보겠습니다. 우리가 올려둔 브랜치는 myFeature 이므로 해당하는 브랜치의 로그를 가져오려면 다음과 같이 명령어를 입력할 수 있습니다.

    $ git log origin/feature/myFeature --oneline

    이렇게 해서 나온 결과로는 다음과 같이 총 7자리의 커밋 아이디를 얻어낼 수 있습니다. (1984b6c, 9cce689)

    # 1984b6c (HEAD -> feature/myFeature) Add feature
    # 9cce689 (master, develop) 변경되었습니다.

    이제 Feature 브랜치에서 작업한 커밋 아이디만 따로 적어두고 git cherry-pick <커밋아이디> 명령어를 실행하면서 커밋을 하나씩 반영해줍니다. 여기에서는 feature 브랜치에서 딱 하나의 작업만 했기 때문에 한번만 체리픽을 하도록 하겠습니다.

    성공

    $ git cherry-pick 1984b6c
    
    ## [feature/myFeature ee405d1] Add feature
    ##  Date: Fri Jul 9 06:35:07 2021 +0900
    ##  1 file changed, 0 insertions(+), 0 deletions(-)
    ##  create mode 100644 feature.txt

    실패

    이렇게 커밋을 하나씩 쌓아가면서 충돌이 안나면 좋겠지만 ... 꼭 납니다. 이럴 때에는 에디터에서 제공하는 충돌 해결 시스템을 빌려서 충돌을 해결한 뒤, 다시 커밋을 해주시면 됩니다.

    $ git cherry-pick fe1e5fa
    
    ## CONFLICT (add/add): Merge conflict in README.md
    ## Auto-merging README.md
    ## error: could not apply fe1e5fa... Initial commit
    ## hint: after resolving the conflicts, mark the corrected paths
    ## hint: with 'git add <paths>' or 'git rm <paths>'
    ## hint: and commit the result with 'git commit'

    열심히 수정 ...

    $ git add <충돌파일명>
    $ git commit -m "충돌 파일을 수정하였습니다"
    $ git cherry-pick --continue

    깔끔해진 feature 브랜치를 서버에 업로드

    $ git push feature/myFeature