Git CLI - Branch & Conflict

Sangho Moon·2020년 8월 6일
0

Git & Github

목록 보기
2/2
post-thumbnail

3번의 커밋 내역이 있는 파일을 기반으로 3명이 각자 작업을 한다고 가정해보자.

이 때 한 저장소에 3명이 작업한 파일을 각각 저장할 수 있는 방법은 git의 브랜치 기능을 사용하는 것이다.


1. 여러 개의 브랜치 만들기

  1. git branch : 현재 브랜치 내역을 보여줌

  2. git branch 브랜치명 : 브랜치를 생성함
    (아래 그림에서는 apple 이라는 브랜치 생성)

  3. git log --all --graph --oneline : 현재 HEAD가 어디에 위치해 있는지, 브랜치들이 어떤 커밋을 기반으로 작업 되었는지 보여줌
    (아래 그림에서는 google, ms 브랜치를 생성, HEAD는 master에 위치해 있으며, work 3를 기반으로 만들어져 있다는 것을 확인할 수 있음)

  4. git checkout 브랜치명 : HEAD를 특정 브랜치로 옮김
    (아래 그림은 터미널에서 git checkout apple 입력한 뒤, vscode로 작업을 한 것)

    아래 그림을 보면 처음과 달리 브랜치가 갈라진 것을 볼 수 있다.

    apple과 마찬가지로 google, ms에도 똑같이 작업을 하고 브랜치 내역을 보면 아래 그림처럼 여러 갈래로 갈라진 것을 확인할 수 있다.


2.1 서로 다른 파일 병합하기

이번에는 master branch와 다른 하나의 branch를 병합해보자.

먼저 master branch에서 work.txt라는 파일을 만들고 commit까지 완료한 상태이다.

그 다음 아래와 같이 o2라는 branch를 만들고 HEAD가 master인 상태에서 master.txt라는 파일을 만들어 commit한다.

만약 commit 설명을 수정하고 싶다면 git commit --amend 명령어를 통해 수정할 수 있다.

그리고 git checkout o2 명령어로 HEAD를 o2로 변경한다. 여기서는 아래와 같이 o2라는 파일을 만들고 commit까지 완료한다.

그러면 아래와 같이 branch가 두 개로 갈라진 것을 확인할 수 있다.

여기서 master branch와 o2 branch를 병합해보자. (o2를 master에 병합)

우선 git checkout master로 HEAD를 변경한다.

그리고 git merge o2를 입력하여 두 개의 branch를 병합한다.

결과를 보면 아래와 같이 두 개의 branch가 병합된 것을 확인할 수 있다.

만약 여기서 병합을 취소하고 원 상태로 되돌리고 싶다면,

git reset --hard branchID를 입력하면 원래 상태로 되돌아온다.

branchID는 아래 그림에서 master work2 옆에 노란색 값인 9e53cf9이다.


2.2 같은 파일, 다른부분 병합하기

우선 master branch에서 work.txt라는 파일을 만들고 아래와 같이 내용을 작성한 뒤 commit한다.

# title
content


# title
content

그리고 git branch o2 명령어로 o2 branch를 생성한다. HEAD가 master인 상태에서

텍스트 파일의 내용을 아래와 같이 변경한다.

# title
master content


# title
content

그 다음 git checkout o2 명령어로 HEAD를 o2로 위치시킨다. 이 상태에서

텍스트 파일의 내용을 아래와 같이 입력한다.

# title
content


# title
o2 content

이제 두 branch를 병합하기 위해 git checkout master 명령어로 HEAD를

master branch에 위치시키고 git merge o2 명령어를 입력한다.

결과는 아래와 같이 서로 다른 부분이 병합된 모습을 볼 수 있다.


2.3 같은 파일, 같은 부분 병합하기

이번에는 master branch와 o2 branch가 있을 때, 두 branch에서 동시에 같은 부분을 수정하여

commit했을 때 나타나는 현상에 대해서 알아보겠다.

우선 2.2와 같이 HEAD가 master인 상태에서 work.txt라는 파일을 만들고 그 안에 아래와 같이

내용을 입력한다.

# Title
content

# Title
content

그리고 2.2에서 했듯이 o2라는 branch를 생성한 뒤 HEAD가 master인 상태에서 텍스트 파일의 내용을

아래와 같이 입력하고 commit을 한다.

# Title
content
master
# Title
content

그리고 git checkout o2로 HEAD를 위치시킨 뒤 텍스트 파일의 내용을 아래와 같이 입력한다.

# Title
content
o2
# Title
content

commit을 하고 두 파일을 병합하기 위해 git checkout master로 HEAD를 위치시킨다.

git merge o2를 입력하면 아래와 같이 conflict 에러가 뜨고 git status로 확인해보면

아래와 같이 빨간 글씨로 both modified라는 문구가 나타난다.

이 상태에서 nano work.txt로 파일 내용을 확인해 보면 아래 그림과 같다.

======= 은 구분자이며 충돌되는 부분을 보여준다.

이 충돌되는 부분에서 master와 o2 라는 내용을 모두 쓰고 싶다면

아래와 같이 파일 내용을 수정하면 된다.

# Title
content
master, o2
# Title
content

그리고 git add work.txt, git commit을 입력하면 충돌이 났었던 부분에 대해 다시 보여주면서

정상적으로 커밋이 완료되고 branch 내역을 보면 아래와 같은 결과를 볼 수 있다.


commit 충돌 시 외부 도구를 이용한 병합도 할 수 있다.

KDiff3, Vim, P4Merge 등이 있으며 이것들은 나중에 필요한 상황이 왔을 때 다뤄봐야겠다.


이번 강의를 듣고 나서 나중에 협업을 하게 되었을 때 각자 맡은 부분에 대한

설정을 확실히 해두고 이런 충돌 문제를 사전에 예방할 수 있도록 해야겠다는

생각이 들었다.


Ref.
생활코딩

profile
Front-end developer

0개의 댓글