INFO/Git

5. Cherry-pick & rebase - Git CLI | 생활코딩

AGAL 2020. 3. 1. 19:50
반응형

[출처 : https://opentutorials.org]

 

2. Cherry-pick의 개념과 기본사용법

Cherry-pick의 기본개념을 살펴봅니다. 

 

Cherry-pick

다른 브랜치의 특정 버전이 생성될 때 생긴 변화만을 적용한다.

 *특정 버전이 만들어졌을 당시에 워킹카피의 스냅샷 전체를 적용하는 것이 아니다.

 

> git cherry-pick 버전아이디  

버전아이디에 해당하는 버전(변경사항)을 현재 브랜치의 워킹카피와 결합해서 새로운 버전을 만든다

 

[실습] master 브랜치에서 topic 브랜치의 topic2 버전을 결합한다. 

실습환경 git log

 

> git checkout master; git cherry-pick 3751903 

브랜치(HEAD)를 master로 전환하고; 3751903(커밋아이디)를 cherry-pick 한다. 

  ⇒ 결과는 init master1 master2 topic2

  *여러개의 커멘드를 입력할 때는 세미콜론(;)으로 구분한다

cherry-pick 결과에 따른 git log

 

 

 

 

3. Rebase의 개념과 기본 사용법

Rebase란 무엇인지, 어떻게 사용하는지를 소개합니다. 

 

> git rebase 브랜치이름 

브랜치이름의 마지막 커밋으로 현재 브랜치의 base를 옮긴다.

 

[실습] master 브랜치를 topic 브랜치로 rebase

 

> git checkout master; git rebase topict  

브랜치(HEAD)를 master로 전환하고; topic 브랜치로 rebase 한다.   

 

※ merge와 rebase의 차이

생활코딩 강의 캡쳐

# 원격저장소에 push하기 전의 버전만 rebase 한다.

 * rebase하기 전의 버전과 후의 버전은 변경사항은 같지만 working copy는 다르다 

 

# merge와 rebase는 과정이 다를 뿐 결과는 같아야 한다.

 

 

 

4. cherry-pick 충돌의 원인과 해결

cherry-pick를 사용할 때 발생하는 충돌의 원인과 해결방법을 알아봅니다. 

 

# 현재브랜치에 대상버전을 cherry-pick한다. (현재브랜치에 대상버전을 결합한다.)   

> git cherry-pick 대상커밋

 - 3 way merge : 현재브랜치의 버전들 vs 현재브랜치의 base vs 대상브랜치의 워킹카피

 

 ① 대상 버전의 이전버전(base)과 대상버전을 비교해서 변경사항을 찾아낸다.

 ② 대상 버전의 변경사항과 현재브랜치의 워킹카피를 비교해서 새로운 버전을 만든다.

 

 

 

5. rebase 충돌의 원인과 해결

rebase를 하는 과정에서 충돌이 일어나는 원인을 소개합니다. 

 

# 현재브랜치가 대상브랜치 다음에 진행된 것 처럼 rebase한다. (현재 브랜치의 base를 대상브랜치로 한다.)   

> git rebase 대상브랜치

 - 3 way merge : 현재브랜치의 버전들 vs 현재브랜치의 base vs 대상브랜치의 워킹카피

 

 ① 대상브랜치로 HEAD를 옮긴다.  

 ② 현재브랜치의 n버전의 이전 버전(base)과 현재브랜치의 n버전을 비교해서 변경사항을 찾아낸다. 

 ③ 현재브랜치의 n버전과 대상브랜치의 워킹카피를 비교해서 새로운 버전을 만든다.

 ④ 새로운 버전으로 HEAD를 옮긴다.

 ⑤ 현재브랜치의 마지막 버전까지 ②~④을 반복한다.

 ⑥ 현재브랜치는 안보여지게 된다. (타임라인에서 사라진다.)

 

> git am --show-current-patch  

어디서 충돌됐는 지(patch)를 메시지로 보여준다.

 

> git rabase --continue  

rebase 도중에 충돌을 해결하고 변경 파일을 add했다면 rebase를 재개한다.

 

 

 

6. 협업에서 rebase 이용하기

협업에서 rebase를 이용해서 로그를 깔끔하게 정리하는 방법을 소개합니다. 

 

[실습] fetch를 통해서 원격저장소의 브랜치 버전만 가져오고 merge를 한다.

CASE.1) 지역저장소의 브랜치가 원격저장소의 브랜치보다 이전 버전일 경우 (Git log 상 뒤에 있을 경우) 

- merge : 지역저장소가 원격저장소의 버전으로 병합된다.     *Fast-forword merge

Fast-forword merge 결과

 

CASE.2) 지역저장소의 브랜치와 원격저장소의 브랜치의 서로 다른 버전일 경우  (Git log 상에서 앞에 있을 경우)

- merge : 지역저장소와 원격저장소의 변경사항을 병합한 새로운 merge 버전을 만든다.

CASE.2) merge 결과

- rebase : 지역저장소의 base를 원격저장소의 마지막 버전(origin/master)로 옮긴다.

CASE.2) rebase 결과

 

반응형