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