git rebase와 cherry-pick 알아보기
히스토리를 한 줄로 관리하기 위해 Merge 보다 Rebase 나 Cherry-Pick을 사용하는 경우가 많습니다.
이번에는 Rebase
와 Cherry-Pick
에 대해 알아보도록 하겠습니다.
git rebase
rebase
는 브랜치의 공통 조상이 되는 base
를 다른 브랜치의 커밋 지점으로 바꾸는 것입니다.
이해하기 쉽게 그림으로 설명하겠습니다.
위 그림을 보면 master
와 topic
브랜치의 공통조상인 base
는 C1
이라는 것을 볼 수 있습니다.
1. HEAD
를 topic
으로 옮기겠습니다.
$ git checkout topic
2. rebase
명령으로 topic
의 base
를 master
가 가리키는 C4
로 변경합니다.
$ git rebase master
실제로 일어나는 일은 C3
, C5
를 임시로 저장해 놓고 C3
, C5
에 대한 새로운 커밋 C3`
, C5`
를 만들어서 차례대로 master
뒤에 적용합니다.
3. 마지막으로 master
브랜치를 topic
브랜치에 merge
합니다.
$ git checkout master
$ git merge topic
fast-forward 방식으로 merge가 됩니다.
reabse를 사용하면 한 줄로 깔끔한 commit 히스토리가 만들어집니다.
하지만 이미 공개 저장소에 push 한 커밋을 rebase 하면 히스토리가 엉망이 될 수 있기 때문에 주의해야 합니다.
cherry-pick
cherry-pick
은 커밋 하나만 rebase
하는 것입니다.
cherry-pick은 다른 사람의 커밋 중 일부를 가져오는 경우에 주로 사용됩니다.
커밋 해시값
을 사용하여 cherry-pick
을 할 수 있습니다.
e43a6
커밋 하나만 master
브랜치에 적용하려면 아래와 같은 명령을 실행하면 됩니다.
$ git cherry-pick e43a6
e43a6
커밋과 동일한 내용의 새로운 커밋 (4a094
)을 만들어 적용하고 필요 없는 브랜치나 커밋은 삭제됩니다.
커밋 해시값을 여러 개 나열하면 여러 개를 한꺼번에 브랜치에 적용할 수도 있습니다.
$ git cherry-pick e43a6 5ddae
cheery-pick 사용 시 conflict가 발생하는 경우
cherry-pick시 conflict가 발생하면 conflict를 수정하거나 cherry-pick을 취소하면 됩니다.
Conflict를 해결하고 cherry-pick을 진행하는 방법
- Conflict를 해결하기 위해 코드를 수정한다.
- git add 명령으로 수정된 코드를 add 한다.
git chery-pick --continue
명령을 수행한다.
cherry-pick을 취소하는 방법
--abort
명령을 사용하면 cherry-pick을 하기 전 상태로 돌아갈 수 있습니다.
git cherry-pick --abort