안녕하세요. 갓대희 입니다. 이번 포스팅은 [ git branch 병합 및 Conflict 해결하기] 입니다. : )
Git Merge
※ 브랜치의 사용, 머지 전략은 다양하게 있겠지만,
이번엔 가장 기초적인 머지 작업에 대해서 써보려 한다.
▶ 1. Git Merge
1) 신규생성한(없다면 생성 > git branch test ) branch로 이동 하여보자.
#git switch test
#git branch
- 현재 test 브랜치에 위치하고 있다.
2) test 브랜치에서 다음과 같은 신규 함수를 작성 한다.
- 파일명 : test.js
- 내용
function add (x, y){
console.log(x);
console.log(y);
console.log(x + y);
return x + y;
}
- 생성한 파일 확인
#cat test.js
3) 신규 js 파일 커밋
#git add .
#git commit -m "Add add Function"
- test 브랜치에 신규 js 파일이 추가 되었고 충분히 테스트 되어 문제가 없다는 가정하에 master 브랜치에도 똑같은 js 파일을 생성 하려 한다. 이때 내가 작성한 파일을 master branch로 이동하여 그대로 작성해도 되지만, merge 기능을 사용하여 test브랜치에서 합칠 수 있다.
4) master branch로 이동
(이전 test 브랜치에서 작성한 파일은 당연히 master branch에는 없을 것이다.)
# 2.23.0 이후 브랜치 이동시 checkout 대신 switch를 사용한다.
#git switch master
#ll
5) 그럼이제 test브랜치에 작업하였던 파일을 master브랜치로 병합해보자.
- 문법 : git merge [브랜치명]
#git merge test
- test 브랜치에서 했던 작업 내용이 복사된 것을 볼 수 있다. 즉 다른 브랜치에서 했던 작업 내용을 가져오고 싶을 때 merge를 사용할 수 있다.
▶ 2. Git Conflict 상황 해결 하기
- 이번엔 간단한 소스 충돌 상황을 만들어 볼까 한다.
1) test 브랜치로 이동
#git switch test
2) 함수 이름을 변경 (test 브랜치)
- 메모장또는 vi를 사용하여 다음과 같이 함수 이름을 변경해 해본다.
function add_test (x, y){
console.log(x);
console.log(y);
console.log(x + y);
return x + y;
}
3) 수정한 내용 커밋
#git add .
#git commit -m "change function name"
- master 브랜치로 이동하자.
#git switch master
4) 파일 확인
- 당연히 master branch를 확인해보면 test 브랜치에서 수정한 내용은 반영되어있지 않다.
#cat test.js
5) 함수 이름을 변경 (master 브랜치)
- 메모장또는 vi를 사용하여 다음과 같이 함수 이름을 변경하고, 커밋해보자.
6) branch 병합
- 머지 작업을 진행해보자.
#git merge test
- 메세지를 살펴보면 CONFLICT라는 단어가 포함되어 있을 것이다. 충돌이 발생하였다는 얘기다.
- 그럼 충돌 상황이 발생하였다고 나와있는 파일 내용을 살펴 보자.
#vi test.js
- "=======" 을 기준으로
위 : HEAD로 표시되어 있는 내용이 master 브랜치에서 한 작업
아래 : test로 표시되어 있는 내용은 test 브랜치에서 한 작업
- 각각의 브랜치에서 동일한 파일을 수정하였는데, merge를 하려고 했을때 git이 어떤 내용이 맞는지 판단할 수 없기 때문에 충돌이 발생하였다고 알려 준다. 이런 상황을 Conflict가 발생하였다고 한다.
7) 충돌 해결
7.1) 직접 수정
- 직접 양 브랜치간의 내용을 비교하여 수정 후 add, commit 처리 한다.
ex) console.log제거, 함수 이름은 add 로 변경 하였다.
function add (x, y){
return x + y;
}
- 컨플릭트 해결 후 커밋 처리 한다.
(commit 메세지를 살펴보면 다음과 같이 나타나는 것을 볼 수 있다. 나와 같은 경우 해당 메세지를 그대로 사용해 보겠다. :wq를 입력하여 저장)
#git add.
#git commit
- git log 등을 살펴보면 다음과 같이 충돌이 해결되어 방금 커밋 메세지로 commit된 것을 볼 수 있다.
7.2) 머지 작업 취소
- 머지를 하다가 conflict가 발생했을 때, 일단은 머지 작업을 취소하고 이전 상태로 돌아갈 수 있다.
#git merge test
Auto-merging test.js
CONFLICT (content): Merge conflict in test.js
Automatic merge failed; fix conflicts and then commit the result.
# cat test.js
<<<<<<< HEAD
function add_master (x, y){
=======
function add_test (x, y){
>>>>>>> test
console.log(x);
console.log(y);
console.log(x + y);
return x + y;
}
#git merge --abort
#cat test.js
- 머지 시도 이전 파일내용과 똑같은 것을 볼 수 있다. - 이후 작업을 다시 하고 머지하거나, 아니면 test브랜치의 내용으로 그냥 merge처리 하는 등의 선택을 할 수 있다.