Im between cherry

Github 깃헙으로 협업할 때, 버전 충돌 해결하기!! 본문

Git

Github 깃헙으로 협업할 때, 버전 충돌 해결하기!!

meal 2020. 11. 24. 02:18

깃헙으로 협업하기 위해, 공용 레퍼지토리는 만들었는데...

만약, 하나의 파일을 두명, 세명이서 동시에 작업을 하게 된다면? 괜찮은건가??

다른 사람 코드를 가져와서 수정을 하는 사이에 또 다른 사람이 수정을 하면 어떡하지??

다른 사람이 먼저 수정했는지 모르고 가져왔다가 내가 수정해버리면 제대로 병합이 되는걸까??

와 같은 궁금증들이 생기실텐데요!

이 문제를 해결하기위해 알아야 할 개념이 바로,

branch & merge & conflict 

입니다.

 

 

1. branch

''만약, 하나의 파일을 두명, 세명이서 동시에 작업을 하게 된다면? 괜찮은건가??''

이 문제를 해결하기 위해서는 따로 작업을 하다가 마지막에 하나로 합치면 될 것 같습니다.

이를 위해 branch, 즉, 가지치기를 해야하는데요.

 

저장소를 만들면 기본적으로 HEAD가 만들어지고, master branch가 만들어집니다.

따라서, HEAD가 만들어지면 이는 master branch상태라는 것을 알 수 있습니다.

 

master branch에 있는 상태에서 버전(1)이 만들어지면, HEAD가 버전(1)을 가르킵니다.

여기서 버전(2)을 새롭게 만들면, master branch가 버전(2)를 가르킵니다.

이 상태에서 새로운 new branch를 만들면, new branch는 버전(2)를 가르킨 채 시작됩니다.

이때 버전(3)을 만들면, new branch는 버전(3)을 가르킵니다.

 

이렇게 master branch를 최종 작업물을 하나로 합치는 공간으로 두고 각자 new branch, new new branch ... 를 만들어 작업을 하면 됩니다.

 

branch 만들기

브랜치의 목록을 볼 때
git branch

브랜치를 생성
git branch "새로운 브랜치 이름"

브랜치를 삭제
git branch -d

병합하지 않은 브랜치를 강제 삭제
git branch -D

브랜치를 전환(체크아웃)할 때
git checkout "전환하려는 브랜치 이름"

브랜치를 생성하고 전환까지 할 때 
git checkout -b "생성하고 전환할 브랜치 이름"
더보기

checkout 과 reset

checkout, reset은 주인공인 HEAD, branch, commit들 간의 관계를 체크하는 것입니다.

checkout은 HEAD의 값을 바꾸는 것입니다.

그래서 checkout 1이라고 하면 HEAD가 바로 버전(1)을 가르킵니다.

이러한 상태를 detached라고 합니다.

 

checkout master와 reset master의 차이

checkout HEAD를 제어합니다.

HEAD가 branch를 가르킬 때, checkout은 branch를 제어합니다.

reset branch를 바꿔줍니다.

branch가 가르키는 commit을 바꾸면 commit이후에 나오는 링크는 끊겨버리기 때문에 삭제의 느낌인 것입니다.

따라서 checkout change, reset delete라 생각하면 됩니다.

branch 정보확인

브랜치 간에 비교할 때
git log "비교할 브랜치 명 1".."비교할 브랜치 명 2"

브랜치 간의 코드를 비교 할 때 
git diff "비교할 브랜치 명 1".."비교할 브랜치 명 2"

로그에 모든 브랜치, 그래프, 브랜치 명을 표시하고, 한줄로 표시할 때 
git log --branches --graph --decorate --oneline

 

 

2. merge & conflict

branch에서 작업을 다 했으면 master branch에 병합을 시켜줘야 합니다.

하지만, A가 master branch에 있는 a코드를 pull해와서 작업 후 a+c를 master branch로 올리는 와중에,

B가 a코드를 수정해 master branch에 a+b코드가 있는 상황이라면, 서로의 코드가 충돌할 수도 있습니다.
A와 B가 같은 코드를 다르게 고쳤을 때! 말이죠.

 

branch 병합

A 브랜치로 B 브랜치를 병합할 때 (A ← B)
git checkout A
git merge B

branch 병합 시 충돌해결

충돌이 일어났을 때

충돌이 생기면 아래와 같은 메시지가 뜹니다. 

git status를 하면 충돌이 일어난 파일을 찾을 수 있습니다. 

충돌이 발생한 파일은 아래와 같습니다. 

충돌이 발생한 파일을 수동으로 수정해 줄 수 있습니다.

 

'<<<<<<< HEAD' 부터 '=======' 사이의 구간이 현재 체크 아웃된 파일의 내용이고

'=======' 부터 '>>>>>>> exp' 사이의 구간이 병합하려는 대상인 exp 브랜치의 코드 내용입니다.

 

이를 참고로해서 두 개의 코드를 병합한 후, 특수기호들을 제거해주면 됩니다.

작업이 끝나면 파일을 저장하고, 충돌 작업을 끝냈다는 것을 git에게 알려줍니다. 

git add 'conflicted file name'

git add 'conflicted file name'

 

 

 

참고

opentutorials.org/course/2708

 

지옥에서 온 Git (새 수업으로 대체) - 생활코딩

이 수업은 GITn 시리즈로 완전히 대체 되었습니다. GITn은 보다 많은 내용을 작은 단위로 쪼개서 선택적으로 공부하실 수 있도록 제작된 수업입니다. 아래 주소를 통해서 GITn 을 접할 수 있습니다.

opentutorials.org

milooy.wordpress.com/2017/06/21/working-together-with-github-tutorial/

 

초심자를 위한 Github 협업 튜토리얼 (with 토끼와 거북이)

git을 사용해 Github에서 협업을 하는 과정을 설명한 글입니다. 초심자를 대상으로 하며, SourceTree를 사용합니다.

milooy.wordpress.com

rogerdudler.github.io/git-guide/index.ko.html

 

git - 간편 안내서 - 어렵지 않아요!

 

rogerdudler.github.io

gmlwjd9405.github.io/2017/10/27/how-to-collaborate-on-GitHub-1.html

 

[GitHub] GitHub로 협업하는 방법[1] - Feature Branch Workflow - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

Comments