ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2. Branch & Conflict - Git CLI | 생활코딩
    INFO/Git 2020. 2. 26. 21:37
    반응형

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

     

    1. 수업소개

    지금까지 만들던 버전에 이어서 서로 다른 여러 작업을 진행해야 하는 경우가 있습니다. 이런 경우 저장소를 복제하고 싶을 때가 있죠? 저장소를 복제하지 않고 동일한 효과를 낼 수 있는 방법이 있습니다. 바로 브랜치(branch) 입니다. 이 수업은 Git의 브랜치를 만들고, 이를 병합하는 방법을 소개합니다. 

     

    Branch

     : 같은 뿌리에서 나왔지만 서로 다른 역사를 이어가는 버전을 뜻한다.

     

    Conflict

    - 하나의 브랜치(파일 A) + 또 다른 브랜치(파일 B) = 병합된 브랜치(파일 A, 파일 B)   

      *서로 다른 파일은 자동으로 두개를 합쳐준다.

     

    - 같은 파일(수정 A) + 같은 파일(수정 B) = 병합된 파일(수정 A, 수정 B)   

      * 다른 부분이 수정되면 자동으로 하나의 파일로 합쳐준다

     

    - 같은 파일(수정 A) + 같은 파일(수정 A) = STOP   

      *같은 부분이 수정되면 병합을 중지하고 충돌이 났기에 수동으로 수정하라고 요청

     

     

     

    3. 브랜치의 사용법

    브랜치를 만들고, 열람하고, 사용하는 방법을 살펴봅니다. 

     

    > git log --all 

    모든 기록이 보여진다.

     

    > git log --graph 

    기록이 시각적으로 표현된다

     

    > git log --oneline 

    버전 기록이 한 줄로 나온다.

     - $ git config --global alias.l 'log --all --graph --oneline'    ⇒ > git l  커맨드와 같음

      ㆍalias.단축명령어 'git을 제외한 옵션 커맨드'

     

    > git branch 

    브랜치의 목록을 보여준다.     

     - * master로 표기되는 것은 아직 master에 속해 있다는 뜻

     

    > git branch 브랜치이름 

    브랜치이름을 가진 브랜치를 만든다.

     - master가 머물고 있는 상태에서 만든 브랜치는 공통적인 커밋을 가진다.

     

    > git checkout 브랜치이름 

    브랜치이름으로 브랜치 (HEAD)를 전환한다.   

     - 브랜치를 전환하게되면 전환한 브랜치의 마지막 커밋상태로 워킹카피가 바뀐다.

     

    실습 예제

     

     

     

    4. 브랜치 병합

    서로 다른 브랜치의 버전 들을 병합하는 방법을 살펴봅시다

     

    # base : 병합하려는 버전(브랜치)의 공통적인 조상 버전

    # merge commit : 서로  다른 버전(브랜치)을 하나로 병합한 버전

     

    > git commit --amend 

    커밋할 때의 메시지를 변경한다.

     

     

    4-2. 서로 다른 파일 병합

    # 'o2 브랜치'의 내용을 'master 브랜치'에 병합한다.

    > git checkout master 

    'master 브랜치' 상태로 돌아간다.

    git merge o2  현재 브랜치에 'o2 브랜치'를 병합한다.

     

    서로 다른 파일의 병합 결과

     

     

    4-3. 같은파일, 다른부분 병합

    같은 파일 다른 부분의 병합 결과

     

     

    4-4. 같은파일, 같은부분 병합

    같은 파일 같은 부분에 대한 수정은 우리가 직접하고 병합한다.

     

    # 같은파일, 같은부분을 병합할 때는 다음과 같은 메세지가 나온다.

      CONFLICT (content): Merge conflict in work.txt
      Automatic merge failed; fix conflicts and then commit the result.

      * 충돌 (컨텐츠): work.txt에서 병합 출동이 있다.

        자동 병합에 실패했다; 충돌을 수정하고 그 결과를 다시 커밋하세요

     

    # work.txt 파일을 열면 다음과 같이 보여진다.

     

    병합하려는 파일에서 보여지는 내용

     

    # 위 이미지에서 표시된 내용을 보고 직접 수정 후 파일을 저장한 뒤 다시 커밋한다.

     

     

     

    5. 3 way merge

    H (브랜치 이름) T (브랜치 이름) base (공통 조상) 2 way merge (H+T) 3 way merge (H+T+b)
    A A A A A
    H B B 충돌 H
    C T C 충돌 T
    H T D 충돌 충돌

    *base : branch가 생성될 때 공통의 조상

     

    # base와 병합하려는 브랜치 2개를 비교해서

    •  하나의 브랜치만 수정된 부분이 있으면 자동 병합
    •  2개의 브랜치가 모두 수정되어 있으면 충돌

     

     

     

    6. 외부 도구를 이용해서 병합하는 방법

    전문적인 외부 도구를 이용해서 병합하는 방법에 대해서 알아봅니다. 

     

    * P4Merge 다운로드

    * P4Merge git config for windows 검색

     

    > ~/ .gitconfig 

    해당 파일에 적혀있는 내용을 참고해서 git이 어떻게 동작할지를 결정

     

    ※ work.txt.orig 

    충돌을 직접 수정할 경우 수정 전 상태의 백업 파일

     

    > rm 파일이름 

    파일이름의 파일을 지운다.

     

     

     

    수업을 마치며

    앞으로 공부해볼만한 주제를 소개해드리는 시간입니다. 

     

    # git workflow  : git을 이용한 협업 업무 흐름의 사례    *git flow

     

    # cherry-pick : 다른 브랜치의 일부 커밋만 반영하고 싶을 때 사용

     

    # rebase : merge처럼 병합하는 작업이지만, 커밋 이력을 다룰 수 있다

     

     

     

    부록 : checkout vs reset

    비슷하면서 다른 개념인 reset과 checkout에 대해서 알아보는 시간입니다. 

     

    checkout (≒change)

    : HEAD의 값(가리키는 브랜치)을 제어한다. 주로 브랜치를 가리킨다.

     

    # 저장소를 만들면 HEAD(파일)와 matser 브랜치가 만들어지고 HEAD는 기본적으로 master 브랜치를 가리킨다.

     * 기본적으로 master 브랜치 위에서 버전을 만들어 간다.

     

    # 커밋을 하게 되면 master 브랜치는 해당 커밋 아이디를 가리킨다. 

     

    # 저장소의 현재 버전 상태를 알고 싶다면 HEAD가 가리키는 master가 가리키는 버전을 통해서 알 수 있다.

     * HEAD  →  master  →  커밋아이디(working copy)

     

    > git checkout 브랜치이름 

    HEAD가 브랜치이름을 가리킨다.

     * HEAD가 가리키는 브랜치이름이 가리키는 버전이 현재 상태가 된다.

     

    > git checkout 버전아이디 

    HEAD가 브랜치를 가리키지 않고 버전아이디를 직접을 가리킨다. 

     * git status는 detached : 브랜치로부터 떨어져 있는 상태

     

     

    reset (≒delete)

    : HEAD가 브랜치를 가리키고 있는 동안에는 브랜치를 제어한다. 주로 버전을 가리킨다.

     

    > git reset 브랜치이름 

    현재 브랜치가 브랜치이름이 가리키는 버전을 가리킨다.

     * 현재 브랜치가 가리키던 버전은 사라진다.

     

    > git reset 버전아이디 

    현재 브랜치가 버전 아이디를 가리킨다.

     

    반응형

    댓글

Luster Sun