ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Git] 특정 브랜치 커밋 가져와 하나로 합치고 이름 바꾸는 방법! (cherry-pick & rebase)
    👩🏻‍💻 정리/Git 2022. 10. 4. 18:30

    작업을 하면서 기능이 따로따로 분리되어 있어 다른 브랜치에서 작업했던 기능을 가져와서 새로운 브랜치에서 이어 작업하고 싶은 상황이 생겼다. 다행히도 깃 마스터인 옆자리 짝꿍 쥬쥬가 친절히 설명해주었고(🥰) 까먹지 않으려고 한번 기록해본다.


    1. cherry-pick 해오기

    $ git cherry-pick [특정 커밋 해시 주소]

    먼저 가지고 오고 싶은 특정 커밋의 해시 주소를 복사한 후 터미널에 위와 같이 입력한다. 이때 만약 cherry-pick해온 커밋이 여러 개인 경우는 하나로 합쳐주고 싶을 수도 있다.

    2. rebase로 합치기

    $ git rebase -i HEAD~[커밋 개수]

    나의 경우에는 가지고 온 커밋이 여러 개여서 하나로 합쳐주고 싶었고, 위와 같이 입력하였으며 커밋이 총 두 개였기에 HEAD~2를 입력하였다.

    $ git commit

    그러고 나서 git commit을 입력한 후 enter를 치면 cherry-pick해 온 주소들을 터미널에서 확인할 수 있고, 커밋을 하나로 합치기 위해서 pick에 f로 바꿔준다. 그리고 :wq(저장하고 나오기)를 입력하여 빠져나온다. 그렇게 되면 커밋이 하나로 합쳐져 있다.

    3. 커밋 제목 수정하기

    다만 커밋의 제목이 처음 커밋의 내용만 담고 있는 게 맘에 안 들어 바꿔주고 싶다.

    $ git commit --amend [새롭게 설정하는 커밋 제목]

    위와 같이 입력하여 제목도 합친 내용에 걸맞게 바꿔준다.

    4. 원격 레포지토리에 올리기

    $ git push origin [브랜치명]

    그렇게 커밋 합치기 작업이 끝이 났고, 만약 작업을 이어서 한다면 거기서 쭉 이어서 해도 되지만 바로 push를 하고 싶다면 위와 같이 push하면 된다!


    번외) cherry-pick하면서 필요 없는 파일도 해당 브랜치에 push되어 버려 히스토리조차도 없애고 싶은 상황

    1️⃣ 원격에 올라간 파일을 로컬에서 삭제한다.

    2️⃣ git commit을 한다.
    (💡 이때 커밋 메시지는 아무렇게나 해도 상관없다. 어차피 해당 커밋 메시지는 없어질 것이기 때문!)

    3️⃣ 위에 설명했던 2번 rebase로 합치기를 참고하여 git rebase -i HEAD~[커밋 개수]를 한다. git commit 엔터 치고 방금 b)에서 커밋한 커밋의 pick을 f로 수정 후 :wq

    4️⃣ git push origin -f [브랜치명]으로 강제로 push한다.

    ⚠️ 다만, 히스토리를 날리고 덮어쓰는 것은 해당 브랜치를 여러 명이서 사용하고 있다면 지양해야 하는 방법임을 유의하자!
     

    +) 추가로 pick을 f로 수정할 때 그 f가 무엇을 의미하는지 찾아보니 fixup을 의미했고, 그 밖에 다른 커맨드도 찾아볼 수 있었다. 커맨드는 아래와 같다.

    # Commands:
    #  p, pick = use commit
    #  r, reword = use commit, but edit the commit message
    #  e, edit = use commit, but stop for amending
    #  s, squash = use commit, but meld into previous commit
    #  f, fixup = like "squash", but discard this commit's log message
    #  x, exec = run command (the rest of the line) using shell

    - 참고: Git 도구 - 히스토리 단장하기