본문 바로가기

GIT

GIT CLI - Branch & Conflict(기본사용법)

반응형
SMALL

이 글은 생활코딩의 GIT CLI - Branch & Conflict 수업을 듣고 작성한 글 입니다.

  1. 이 수업을 통해 알 수 있는 것
    • Brunch : 버전관리를 통해 만든 여러개의 버전에서 일부를 수정하여 새로운 버전을 만들고 싶을 때
    • Merge : 여러가지 수정 버전의 일부를 기존 또는 새로운 버전의 일부로 가져오고 싶을 때
    • Conflict : Merge할 때, 버전끼리 같은 부분을 수정했다면 어떻게 할 것인가?
    • 3 way merge와 p4Merge(tool) : git의 3 way merge알고리즘과 외부 도구를 사용한 Conflict의 처리

2. 실습환경 준비

    • 영상 강의를 통해 실습을 위한 기본적인 환경(directory, file 등의 상태)을 준비하는 단계
      • 실습하고자 하는 디렉토리에 들어가서 manual 디렉토리 생성 후 work.txt 파일을 만든다.
      • content 1,2,3을 넣어 각 각 버전으로 만든다(총 3개의 버전을 생성)
    • 이렇게 만듦으로서, 각 각의 버전들을 모두 수정해야하는 상태를 겪을 수 있는데, Branch를 사용하면 이러한 문제를 해결할 수 있다.

mkdir manual

cd manual

git init

nano work.txt

content 1

^X ^Y Enter

git add work.txt

git commit -m "work 1"

nano work.txt

(추가)content 2

^X ^Y Enter

git commit -am "work 2"

nano work.txt

(추가)content 3

^X ^Y Enter

git commit -am "work 3"

git log -p(변경사항 출력)

git log -p ( 각 버전에 변경사항을 알 수 있다.)

3. 브랜치를 만들고, 열람하고, 사용하는 방법

    • 강의는 우리가 여러개의 고객사를 가지고있고, 고객사마다 다른 내용들을 추가해야할 때, 브랜치를 활용해서 관리하는 방법을 소개하고 있다.
      • 강의에서는 2개의 git bash를 열어 변화하는 상태를 별도로 보여주고 있다.
      • 기존 창에서 Alt + F2 버튼을 누르면 새 창을 열 수 있다.
      • 2번째 창에서는 git log를 통해 버전을 볼 수 있게 한다.
        • git log --all --graph --oneline
        • 축약 된 상태의 로그와 그래프 형태를 볼 수 있다.
        • 기본적으로 내가 작업 중인 디렉토리와 동일한 위치에서 보도록 하자
    • git branch 명령어
      • master라고 출력된다.
        • 우리는 버전을 만드는 순간 master라는 브랜치 위에서 작업을 하고 있었던 것이다.
      • git branch apple; git branch google; git branch ms
        • 3개의 브랜치를 만들었다
        • git branch 뒤에 내가 만들고 싶은 브랜치의 명칭을 적으면 브랜치가 생성 된다.

3개의 branch 생성

master branch상태에서 branch를 생성 후 log

        • apple, google, ms 모두 work 3라는 branch상태에 있는 것을 확인 할 수 있다.
    • 새로운 버전 생성

nano work.txt

master content 4(추가)

^X ^Y

git commit -am "master work 4"

git log --all --oneline --graph

ms, google, apple 은 여전히 work 3의 상태라는 것을 알 수 있다

    • git checkout
      • git checkout apple
        • apple branch로 이동하게 된다.
        • 여기서 apple은 work 3의 상태이다
        • 이 경우 'master content 4'는 안보이게 된다.
        • HEAD가 apple을 가르키는 것을 알 수 있다.
          • HEAD는 현재 branch이다.

apple branch로 이동 후 work.txt 파일 확인

git log를 이용해 현재 branch 상태 확인

      • 브랜치는 생성 된 마지막 상태를 가지고 있는다.
    • 추가 작업을 해보도록 하자
      • 현재 branch는 apple 이다.

nano apple.txt

apple work 4

^X ^Y

git add apple.txt

git commit -m "apple work 4"

git log --all --oneline --graph

      • master work 4와 apple work 4가 work 3를 부모로 하여, 새로운 버전을 만들었다는 것을 그래프로 알 수 있게 되었다.

git log

      • 동일한 방법으로 google과 ms로 만들어보자

git checkout google

nano google.txt

google work 4

^X ^Y

git add google.txt

git commit -m "google work 4"

git checkout ms

nano ms.txt

ms work 4

^X ^Y

git add ms.txt

git commit -m "ms work 4"

git log --all --oneline --graph

work 3를 부모로 서로다른 branch 생성

4. 브랜치 병합

    • 서로 다른 브랜치의 버전들을 병합하는 방법을 살펴보자
    • Merge : 합치다, 병합하다
    • 우리가 master branch에서 버전을 만들 때, apple 버전의 기능을 가지고 오고 싶다고 해보자
      • 이 때에는 master와 apple의 공통 조상인 work 3 버전을 base 라고 부른다.
      • 그리고, master와 apple을 merge한 새로운 master를 merge commit 이라고 부른다.

5. 브랜치 병합 실습

    • 강의에서는 새로운 디렉토리를 만들어 실습을 진행한다.
    • 현재는 같은 파일에서는 서로 다른 부분이 없는 상태이다.
    • 해당 글에서는 이전 실습환경에서 진행해보도록 하겠다.
    • 강의에서 commit message를 수정하는 기능이 나와 소개해보도록 하겠다
      • git commit --amend
        • commit message를 기본 설정 editor를 통해 수정할 수 있게 해준다
    • apple branch를 master branch로 합치고 싶다고 해보자
      • 일단 master branch로 이동한다
      • merge 명령어를 통해 branch를 가져온다.
      • git bash는 기본적으로 merge한다는 내용의 commit messge를 기본 설정 editor를 통해 자동으로 작성해주고, 수정할 수 있게 해준다.
      • ^X를 통해 닫아준다
      • git log --all --oneline --graph를 통해 확인한다.
      • 이 때, 실습 중 reset 명령어를 통해 merge를 당하는(여기서는 apple) branch에 변화가 없으면 기존에 commit message의 자동생성을 해주지 않는 것을 확인했다.

Merge branch 'apple' : apple branch를 병합했다는 기본 문구

master branch에 apple branch를 merge 한 log

master 상태에서 apple을 merge해서 apple.txt가 생겼다.

    • 같은파일에서 다른 부분이 수정되었을 때
      • 새로운 저장소를 만들고 시작하자
        • git init 명령어 뒤에 디렉토리명을 붙이면 해당 디렉토리를 저장소로 만들 수 있다
        • 해당 디렉토리가 없을 경우 디렉토리를 생성하는 과정까지 함께 해준다.

git init manual-merge

cd manual-merge

nano work.txt

#title

content

#title

content

^X ^Y

서로 다른 부분을 수정하는 것을 명확하게 하기 위해 #주석을 통해 구분

      • o2라는 branch를 생성한다

git branch o2

      • master branch에서 work.txt 파일의 윗 부분을 수정한다
        • content -> master content
        • git commit -am "master content 2"
      • o2 branch로 이동해서 work.txt 파일의 아래 부분을 수정한다
        • content -> o2 content
        • git commit -am "o2 content 2"
      • git log 실행 결과는 아래와 같다
      • 결과적으로 master에서는 윗부분, o2에서는 아랫부분을 했다
      • master를 기준으로 o2를 병합해보자
        • git checkout master
        • git merge o2
      • 같은 파일의 다른 부분을 merge 했을 때, git이 알아서 처리해주는 것을 알 수 있다.

master branch에 o2 branch를 merge

같은 파일 다른 부분 merge 결과

    • 같은 파일 같은 부분이 수정되었을 때
      • git은 같은 파일의 같은 부분을 수정하였을 때, 자동으로 병합하지 못한다
      • 이것을 Conflict(충돌)이라고 한다.
      • 새로운 저장소를 만들어서 실습해보자
      • 강의에서는 동일한 이름의 디렉토리를 새로 만들었기 때문에 숫자 2를 붙이도록 하겠다
        • git init manual-merge
        • cd manual-merge
        • nano work.txt
        • #Title
        • content
        • #Title
        • content
        • git add work.txt
        • git commit -m "work 1"
        • git branch o2
        • git log
          • master와 o2 모두 work 1을 가르키는 것을 확인
        • nano work.txt
        • master
          • 윗 쪽 #TItle의 content 밑에 master 추가
        • git commit -am "master work 2"
        • git checkout o2
        • nano work.txt
        • o2
          • master에서 수정한 위치와 동일한 위치에 o2 추가
        • git commit -am "o2 work 2"

work.txt

각 각 해당 위치에 master와 o2 추가

      • 같은 부분을 merge
        • master branch로 이동한다
        • master branch에서 o2 branch를 땡겨온다
          • git checkout master
          • git merge o2
          • CONFLICT 를 확인 할 수 있다
        • git status를 통해 어떤 상태인지 확인할 수 있다.
          • 현재 work.txt가 둘 다 수정되었다는 경고를 준다.
        • <<<<<<< HEAD
          • HEAD는 아래와 같고
          • master
        • =======
          • 구분자
          • o2
        • >>>>>>> o2
          • o2는 위와 같습니다
        • 이런식으로 해석할 수 있다.
        • 여기서 필요한 부분의 내용만 남기고 수정하면 된다.
        • 추가적으로 제공 된 구분자들은 내용에 들어가면 안된다.
        • 수정 후 파일을 저장한다.
        • 저장 완료 후 다시 버전을 만든다
        • git add work.txt
          • git에게 수정 완료를 알린다.
        • git commit
          • 별도의 메세지를 주지 않으면 editor가 동작하고, 기본적으로 수정사항과 commit message를 제공한다.

git commit - merge 예외처리 완료 후 기본제공 commit message

        • 공통 부모로 master와 o2를 가지고 merge완료한 새로운 master branch를 확인 할 수 있다.

git log --all --graph --oneline

기본적인 branch의 생성, 이동, 병합, 충돌을 확인하고 실습해보았다.

기능사용을 하는데는 여기까지면 충분할 것 같다고 생각된다.

추가적인 내용은 다음 글에서 작성해보겠다.

반응형
LIST