개발 관련 지식/GIT

[GIT] 생활코딩, GIT3 - Branch & Conflict

코딩하는 문과생 2019. 12. 13. 22:24

Branch - 우리는 때에 따라 복제본이 필요하다.

 

 

우리가 제품 사용설명서를 만든다고 가정하자.

Branch가 필요한 이유

저장소를 복제하지 않고 동일한 효과를 낼 수 있는 방법: Branch!!!

 

Conflict 발생

 

 

[실습 준비]

$ mkdir manual
$ cd manual

$ git init
$ ls -al
$ nano work.txt
# content 1
# ctr + x, y

$ git add work.txt
$ git commit -m "work 1"
$ git log

# 3번의 commit을 한다. work 2, work 3

$ git log -p
# 여기서부터 3개의 고객사에게 조금씩 다른 메뉴얼 제공해야한다고 가정
# branch가 해결하도록 할 것이다.

 

 

[Branch의 기본 사용법]

# [브랜치 확인 area]
$ git log --all --graph --oneline
# 버전과 브랜치를 깔끔하게 확인
# Head: 현재 우리가 속해있는 브랜치
#---------------------------------------------------

apple google ms사가 고객사라고 하자

$ git branch
# 브랜치 목록 확인
# master: 우리는 기본 브랜치인 master에서 작업한다.

$ git branch apple
$ git branch
$ git branch google
$ git branch
$ git branch ms
$ git branch
#---------------------------------------------------

# [브랜치 확인 area]
$ git log --all --graph --oneline
# 현재 work 3에서 branch가 생성되었다.
#---------------------------------------------------

$ nano work.txt
# master content 4
$ git commit -am "master work 4"
#---------------------------------------------------

# [브랜치 확인 area]
$ git log --all --graph --oneline
# master work 4(master)
# work 3(apple, google, ms)
#---------------------------------------------------

$ git checkout apple
# apple branch로 가자
# 이제 apple 브랜치, "work 3"로 간다.

$ git checkout master
# master, "master work 4"로 돌아간다.
$ git checkout apple
# apple을 가리키도록
$ nano work.txt
# apple content 4 추가
$ nano apple.txt
# apple content 4

$ git add .
$ git commit -m "apple work 4"
#-----------------------------------------------
# [브랜치 확인 area]
$ git log --all --graph --oneline
#-----------------------------------------------
$ git checkout google
# google을 가리키도록
$ nano work.txt
# google content 4 추가
$ nano google.txt
# google content 4

$ git add .
$ git commit -m "google work 4"
#-----------------------------------------------
# [브랜치 확인 area]
$ git log --all --graph --oneline
#-----------------------------------------------
$ git checkout ms
# google을 가리키도록
$ nano work.txt
# ms content 4 추가
$ nano ms.txt
# ms content 4

$ git add .
$ git commit -m "ms work 4"
#-----------------------------------------------
# [브랜치 확인 area]
$ git log --all --graph --oneline

 

[merge]

 

- 파일명이 다른 경우 병합

# 새롭게 생성
$ git init manual-merge
$ cd manual-merge 
$ nano work.txt
# 1
$ git add work.txt
$ git commit -m "work 1"
$ git log

# o2라는 브랜치 생성
$ git branch o2

# master 브랜치 작업
$ nano master.txt
# master 2
$ git add master.txt
$ git commit -am "work 2"
$ git commit --amend
# 커밋 수정 메세지
# master work 2

# o2브랜치 작업
$ git checkout o2
$ nano o2.txt
# o2 2
$ git add o2.txt
$ git commit -m "o2 work 2"
#--------------------------------------
# [브랜치 확인 area]
$ git log --all --graph --oneline
#--------------------------------------

# master내용을 기준으로 o2브랜치와 병합하겠다.
$ git checkout master
$ git merge o2
#--------------------------------------
# [브랜치 확인 area]
$ git log --all --graph --oneline
#--------------------------------------

$ git reset --hard (master id)
# 리셋하고 연습해보자

- 파일명이 같은 경우 병합

$ git init manual-merge
# 새롭게 폴더 생성
$ cd manual-merge
$ nano work.txt
# 내용:
# #title
# content

# #title
# content
$ git add work.txt
$ git commit -m "1"

$ git branch o2
$ nano work.txt
# 내용:
# #title
# master content

# #title
# content
$ git add work.txt
$ git commit -m "master work 2"

$ git checkout o2
$ nano work.txt
# 내용:
# #title
# content

# #title
# o2 content
$ git add work.txt
$ git commit -m "o2 work 2"

#--------------------------------------
# [브랜치 확인 area]
$ git log --all --graph --oneline
#--------------------------------------

# o2내용을 master로 병합하고 싶다.
$ git checkout master 
$ git merge o2 

#--------------------------------------
# [브랜치 확인 area]
$ git log --all --graph --oneline
#--------------------------------------

$ cat work.txt

- 파일명이 같고, 같은 부분 수정 후 병합 : conflict

-> 충돌나는 부분은 유저가 직접 결정!!!

$ 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

$ nano work.txt
# #title
# content
master
# #title
# content

$ git add work.txt
$ git commit -m "master work 2"
#------------------------------------
$ git checkout o2
$ nano work.txt
# #title
# content
o2
# #title
# content

$ git add work.txt
$ git commit -m "o2 work 2"

#------------------------------------
# [브랜치 확인 area]
$ git log --all --graph --oneline
#--------------------------------------

# 병합
$ git checkout master
$ git merge o2
# CONFLICT발생

$ git status
# 충돌이 났다.
$ nano work.txt
# 확인
# master, o2로 수정

$ git add work.txt
# 이제 충돌을 해결했어!
$ git commit
# 그냥 커밋이름 그대로 쓴다.

#--------------------------------------
# [브랜치 확인 area]
$ git log --all --graph --oneline
#--------------------------------------

 

[3 way merge]

브랜치를 합칠 때, 협업할 때 충돌이 발생

$ git checkout here
$ git merge there
# 3 way merge로 해결안되는 부분만 수정하면 된다.

# 그러나 우리는 도구를 사용해보자
# perforce의 p4merge다운

$ git config --global merge.tool p4merge
$ git config --global mergetool.p4merge.path "C:\Program Files\Perforce\p4merge.exe"

$ git mergetool
# 병합을 전문적으로 도와주는 도구

$ cat work.txt
$ rm work.orig

$ git add work.txt
$ git commit
# 그대로 저장

#--------------------------------------
# [브랜치 확인 area]
$ git log --all --graph --oneline
#--------------------------------------

 

 

[수업을 마치며]

브랜치는 버릴 수 있는 작업을 만들 수 있는 것이다.

  • git workflow - git flow
  • cherry-pick : 병합과 관련된 기능
  • rebase : timeline을 조금 더 깔끔하게 만들 수 있다. base는 이전 설명했던 것과 조금 다르다.

 

[보충]

checkout vs reset

checkout
reset