이 글은 생활코딩의 GIT CLI - Branch & Conflict 수업을 듣고 작성한 글 입니다.
- 이 수업을 통해 알 수 있는 것
- 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를 사용하면 이러한 문제를 해결할 수 있다.
- 영상 강의를 통해 실습을 위한 기본적인 환경(directory, file 등의 상태)을 준비하는 단계
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 뒤에 내가 만들고 싶은 브랜치의 명칭을 적으면 브랜치가 생성 된다.
- master라고 출력된다.
- 강의는 우리가 여러개의 고객사를 가지고있고, 고객사마다 다른 내용들을 추가해야할 때, 브랜치를 활용해서 관리하는 방법을 소개하고 있다.

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이다.
- git checkout apple
- git checkout

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를 통해 수정할 수 있게 해준다
- git commit --amend
- 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 branch에서 work.txt 파일의 윗 부분을 수정한다
-

-
-
- 결과적으로 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
- 같은 부분을 merge
-

-
-
-
-
- CONFLICT 를 확인 할 수 있다
- git status를 통해 어떤 상태인지 확인할 수 있다.
- 현재 work.txt가 둘 다 수정되었다는 경고를 준다.
-
-
-

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

git commit - merge 예외처리 완료 후 기본제공 commit message
-
-
-
- 공통 부모로 master와 o2를 가지고 merge완료한 새로운 master branch를 확인 할 수 있다.
-
-

git log --all --graph --oneline
기본적인 branch의 생성, 이동, 병합, 충돌을 확인하고 실습해보았다.
기능사용을 하는데는 여기까지면 충분할 것 같다고 생각된다.
추가적인 내용은 다음 글에서 작성해보겠다.
'GIT' 카테고리의 다른 글
GIT CLI - reset vs checkout (0) | 2024.01.14 |
---|---|
GIT CLI - Conflict, 3 way merge, p4merge (1) | 2024.01.14 |
GIT CLI - 버전관리 시작하기2(Update, Delete) (1) | 2024.01.14 |
GIT CLI - 버전관리 시작하기1(Create, Read) (0) | 2024.01.14 |
POSIX CLI - 디렉토리와 파일 CRUD (1) | 2024.01.14 |