개발 관련 지식/GIT
[GIT] 생활코딩, GIT3 - Branch & Conflict
코딩하는 문과생
2019. 12. 13. 22:24
Branch - 우리는 때에 따라 복제본이 필요하다.
우리가 제품 사용설명서를 만든다고 가정하자.
저장소를 복제하지 않고 동일한 효과를 낼 수 있는 방법: Branch!!!
[실습 준비]
$ 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