-
5. Cherry-pick & rebase - Git CLI | 생활코딩INFO/Git 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 결과 반응형'INFO > Git' 카테고리의 다른 글
Git Flow를 이용한 브랜치 전략 | 정아마추어 (0) 2020.07.10 4. 협업 - Git CLI | 생활코딩 (0) 2020.02.28 3. Backup - Git CLI | 생활코딩 (0) 2020.02.27 2. Branch & Conflict - Git CLI | 생활코딩 (0) 2020.02.26 1. 버전관리 - Git CLI | 생활코딩 (0) 2020.02.25