ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 결과

     

    반응형

    댓글

Luster Sun