본문 바로가기

Frontend is 실전

[Git] Git rebase와 cherry-pick

Git Rebase

rebase는 Local 작업물과 Base 브랜치(보통 main 또는 master)를 비교해서 변경된 부분을 자동 병합 또는 수동 병합 할 수 있게 해주는 기능

(이해하기 쉽게 master로 설명)

merge와의 차이점

  • merge : 두 브랜치를 병합하여 하나의 브랜치로 만드는 과정
  • rebase : 현재 브랜치의 변경 사항을 다른 베이스(commit history)로 이동시키는 것

rebase 과정

rebase는 말 그대로 베이스를 옮기는 행위

쉽게 말해, 내 커밋 히스토리를 master 브랜치의 최신 커밋 뒤에 붙이는 것

 

 

1.Master 브랜치에는 여러 커밋 내역이 저장되어 있는 상태. 가장 최근의 커밋(base)을 바탕으로 새 브랜치를 하나 만든다

 

 

2.Master 브랜치에도 작업 내역이 쌓이고, 새롭게 생성한 브랜치에도 작업 내역이 쌓인다

이때 rebase를 실행하면, Master 브랜치와 New 브랜치의 commit들을 비교한다

※주의 : Local에 있는 master 브랜치 역시 pull을 통해 최신화 해줘야 한다!!!!

 

 

3.Master 브랜치와 New 브랜치의 커밋들을 비교하여 변경된 부분을 찾는다

 

4.만약 변경된 사항이 있다면 수동으로 충돌 수정 후 commit 해 주고, 변경 사항이 없는 부분은 자동으로 병합된다

 

 

5.자동 병합 및 충돌 수정이 완료된다면, master의 최근 head가 다시 base commit으로 바뀌고, 그 뒤로 new 브랜치에서 생성한 커밋들이 적용된다

여기서 master 브랜치에 merge를 하게 된다면, master 브랜치는 new 브랜치와 같은 모습이 되는 것이다

 

 

위 그림처럼 master의 최신 commit 위에 내 commit이 들어가 있다면 rebase를 성공적으로 실행한 것

Rebase 명령어

git rebase master
//마스터 브랜치를 rebase함
//마스터 브랜치의 최신 커밋을 받아옴

git rebase --abort
//리베이스 이전의 상태로 되돌림

git rebase --continue
//충돌 수정 후 rebase를 마저 진행 할 때

git rebase --skip
//rebase를 강제로 skip함
//주로 수정한 파일이 이미 커밋한 파일과 동일할 때 사용

Git Cherry-Pick

cherry-pick은 다른 브랜치의 commit을 적용하고 싶을 때 사용하는 명령어

→ 브랜치 간에 필요한 특정 변경 사항을 선택적으로 가져오고자 할 때 유용

사용 방법

// 특정 커밋을 현재 브랜치에 적용
git cherry-pick <commit-hash>

//ex) fit cherry-pick e0s19k29z => 해당 커밋 내용을 현재 브랜치에 적용

// 여러 개의 커밋 해시를 나열하여 적용
git cherry-pick <commit1> <commit2> <commit3>

// 커밋 범위를 지정하여 적용
git cherry-pick <commit1>..<commit4>

작동 원리

  1. cherry-pick을 실행하면 해당 커밋의 내용을 그대로 불러오므로, local 파일과 다른 부분이 있다면 충돌이 발생 할 수 있음
  2. 충돌이 발생한 경우 파일을 편집하여 충돌 해결 후 add를 통해 스테이징
    • ‘git add’ 명령어로 스테이징해야 Git이 충돌이 해결되었음을 인식
  3. 여러 커밋을 가져왔을 경우, 충돌 해결 후 continue를 통해 다음 커밋 불러오기

Cherry-Pick 명령어

git cherry-pick --abort
//체리픽 이전의 상태로 되돌림

git cherry-pick --continue
//충돌 수정 후 체리픽을 마저 진행 할 때

git cherry-pick --skip
//체리픽을 강제로 skip함
//충돌이 발생했을 때나, 커밋을 적용 할 필요가 없을 때