Git(Basic) - 5에서
branch를 생성하고 $ git banch <branchname>
전환하고$ git checkout <branchname>
변경사항을 commit하고
병합한 뒤$git merge <branchname>
삭제하는 단계까지 마쳤습니다.$ git branch -d <brancdname>

이제 branch 두개를 생성해 동시에 여러 작업을 처리하는 상황을 만들어 보겠습니다.


1. branch를 이용해 독립된 작업하기

issue2, issue3 branch 2개를 만들어 issue2로 전환하겠습니다.

$ git branch issue2
$ git branch issue3
$ git checkout issue2
Switched to branch 'issue2'
$ git branch
* issue2
  issue3
  master

issue2에서 myfile.txt 파일에 아래와 같이 변경사항을 만들어 commit에 대해 메시지를 남기고 commit하도록 하겠습니다.

  branch 명령어 연습용
add: 변경 사항을 만들어서 인덱스에 등록해보기
commit: 인덱스 상태를 기록하기 
$ git add myfile.txt
$ git commit -m "commit의 설명 추가"
[issue2 8f7aa27] commit의 설명 추가
 1 files changed, 2 insertions(+), 0 deletions(-)

여기까지의 상황을 그림으로 표현하면 다음과 같습니다.

스크린샷, 2019-10-06 15-28-55.png

이제 issue3 로 전환한 뒤, 변경사항을 만들겠습니다.

$ git checkout issue3
Switched to branch 'issue3'
branch 명령어 연습용
add: 변경 사항을 만들어서 인덱스에 등록해보기
pull: 원격 저장소의 내용을 가져오기 

issue2에서는 commit: 인덱스 상태를 기록하기라고 내용을 추가했고 issue3에서는 pull: 원격 저장소의 내용을 가져오기라고 내용을 추가했습니다.

이제 commit해주겠습니다.

$ git add myfile.txt
$ git commit -m "pull 설명을 추가"
[issue3 e5f91ac] pull 설명을 추가
 1 files changed, 2 insertions(+), 0 deletions(-)

여기까지의 상황을 그림으로 표현하면 다음과 같습니다.

스크린샷, 2019-10-06 15-31-47.png

이처럼 독립된 작업을 수행할 수 있습니다.

2. 병합할 때 발생하는 충돌 해결하기

이제 issue2에서 변경한 부분과 issue3에서 변경한 부분 모두 master에 통합하겠습니다.

$ git checkout master
Switched to branch 'master'
$ git merge issue2
Updating b2b23c4..8f7aa27
Fast-forward
 myfile.txt |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

이를 그림으로 표현하겠습니다.

스크린샷, 2019-10-06 15-34-38.png

이제 issue3를 병합하겠습니다.

$ git merge issue3
Auto-merging myfile.txt
CONFLICT (content): Merge conflict in myfile.txt
Automatic merge failed; fix conflicts and then commit the result.

CONFLICT(충돌)가 일어나 자동 병합에 실패했습니다.
이유는 각각의 branch에서 변경한 내용이 myfile.txt의 같은 행에 포함되어 있기 때문입니다.

이때, myfile.txt를 확인해보면 다음과 같습니다.

branch 명령어 연습용
add: 변경 사항을 만들어서 인덱스에 등록해보기
<<<<<<< HEAD
commit: 인덱스의 상태를 기록하기
=======
pull: 원격 저장소의 내용을 가져오기
>>>>>>> issue3

이를 통해 어떤 부분에서 충돌이 일어나는지 확인할 수 있습니다.

충돌이 일어난 부분은 일일이 확인해서 수정해야합니다.

파일을 다음과 같이 변경해보겠습니다.

branch 명령어 연습용
add: 변경 사항을 만들어서 인덱스에 등록해보기
commit: 인덱스의 상태를 기록하기
pull: 원격 저장소의 내용을 가져오기

수정을 완료한 뒤, 다시 commit해주겠습니다.

$ git add myfile.txt
$ git commit -m "issue3 브랜치 병합"
# On branch master
nothing to commit (working directory clean)

여기까지의 상황을 그림으로 표현하면 다음과 같습니다.

스크린샷, 2019-10-06 15-39-37.png

충돌 부분을 수정했기 때문에 그 변화를 기록하는 병합 commit이 새로 생성되었습니다. 그리고 'HEAD'가 master의 위치로 이동했습니다.
이와 같은 방법을 non fast-forward merge라고 합니다.