-
[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 도구 - 히스토리 단장하기
'👩🏻💻 정리 > Git' 카테고리의 다른 글
[Git] git pull 되돌리는 방법 (reflog) (0) 2024.09.12 [Git] 실수로 날라간 stash 복구하는 법 (0) 2022.12.11 [Git] fatal: Could not read from remote repository 오류 해결 방법 (0) 2022.09.19 Git & Github (0) 2022.08.07