본문 바로가기

Git

Git CLI merge & conflict 병합

여러분들이 커밋을 하면 순차적으로 버전이 만들어지겠죠? (기본적으로 master or main 브렌치)

이 상태에서 여러분이 apple branch를 만들고 checkout해서 새로운 버전을 만든다면

이 버전은 apple branch 소속이 되겠죠? 그리고 여러분이 master 브렌치에 있는 상태에서 version 3 master 버전으로

다시 google 브렌치를 만들고 버전을 만들게 되면 master 브렌치를 기반으로하는 google branch 소속이 될 것 입니다.

여기서 다시 master로 checkout 하여 version을 만들게 되면 version 4가 되는 것이고요.

 

만약 apple branch에서 작업하던 내용이 master branch에도 유용할 것 같다면 어떨 것 같습니까?

merge(합침) 작업을 하고 싶을 것입니다. (그래야 되요..)

 

master branch에서 작업한 내용이 있고 apple branch에서 작업한 내용을 동시에 갖고 있는

새로운 버전이 갖고 master branch의 새로운 버전을 만들고 싶은겁니다.

그러기 위해선 merge작업을 하여야 합니다!

 

merge 작업을 하기 전에 먼저 용어를 살펴볼까요?

지금 apple branch의 버전과 master branch의 버전의 공통의 조상이 누구일까요?

맞습니다! (version 3)

 

Base: 합칠려고 하는 버전들의 공통의 조상

Merge Commit: 병합된 커밋 (그림에선 apple branch의 버전 +  master branch 의 version 4)

 

이런 거대한 작업을 자동화 해주는 것이 git에서 제공하는게 신기하네요!

 

이번엔 실습을 시작하기 전에 폴더 하나를 만들어 주겠습니다. (git3-cli)

 

저는 git3-cli 폴더안에 manual, manual-merge 디렉토리를 만들었고 init으로 초기화도 해주었습니다!

 

그래서 지금 상태는 이런 창이 되었고요!

 

여기서부터 nano 에디터를 이용해 텍스트 파일을 만들겠습니다.

간단하게 1이라는 내용을 추가하였고요!

CTRL+X -> Y ->Enter (이제 익숙하죠?)

nano work.txt

 

후에 Area에 올려주고 Commit을 하였습니다.

 

지금까지의 로그를 본다면 분명 이렇게 되겠죠?

 

그리고 브렌치를 만들겠습니다. (o2)

git branch o2

 

checkout으로 o2로 넘어가기전에 nano로 master.txt도 하나 만들어주시고요! (내용은 2를 추가해주세요!)

nano master.txt

 

그리고 add ,commit 해주겠습니다!

 

 

커밋메세지 내용을 바꾸고 싶어서 명령어를 치고 master work 2로 바꾸고 나왔습니다!

git commit --amend

 

 

이후에 checkout 명령어로  o2 브렌치로 가줍니다. (Head가 바뀐것을 확인 하실 수 있고요)

git checkout o2

 

그리고 o2.txt 파일을 만들고 o2 2라는 내용을 적겠습니다.

 

그리고 add, commit 잊지 말고 해주겠습니다.

 

 

그리고 현재상황을 그래프 로그로 보면

git log --all --graph --oneline

 

그러면 이제 병합을 해볼까요?

저는 master 브렌치에 o2 브렌치를 병합할 것입니다. (o2 브렌치를 main 브렌치로 합치겠다)

그럼 일단 master 브렌치로 이동해야하는데요. (저는 현재 main 브런치가 base입니다.)

git checkout master

 

 

병합 명령어는 현재(main) 브렌치에서 병합시키고싶은 브렌치를 merge하면 되는데요. 보시죠!

git merge o2

 

원래는 merge를 하고 새로운 버전이 만들어진 이유를 담은 커밋메세지를

써야하는데 추가하여 안쓰게되면 디폴트값으로 가게됩니다! 그냥 나가주세요!

그리고 로그를 보게 되면 그림이 신기하게 변했네요!

 

 

이제 Head는 main 브렌치를 가리키고 있고 새로운 버전인 Merge branch 'o2'가 만들어졌죠?

이것이 merge를 하는 방법이였습니다!

혹시 병합을 잘못 했다고요? 그럼 취소도 한번 해봐야겠죠!

 

git reset --hard "reset "버전 고유ID"

 

 

 

다시 그래프를 봐볼까요? 신기하죠?

git log --all --graph --oneline

 

여기서 그 이후로 돌아가고 싶다면? 

 

 

reset으로 다시 돌려놓았고, 이제부터는 "같은파일이지만 다른부분을 수정했을때 병합"을 해보겠습니다!

시작하기전에 다시 새로운 폴더를 만들겠습니다!

 

init을 해주고 work.txt를 만들어주겠습니다!

보시다시피 같은 파일 다른부분을 합칠 것이기때문에 구분을 위해서 띄워줬고요.

git init
nano work.txt

 

add, commit도 해줘야겠죠?

git add work.txt
git commit -m "1"

 

이제 브렌치를 새로 만들겠습니다.

git branch o2

 

 

그리고 master branch 에서 work.txt를 수정해주겠습니다.

nano work.txt

 

git commit -am "master work 2"

 

그리고 checkout으로 o2 branch로 이동!

이후 work.txt 수정! 이번엔 밑에쪽을 수정.

git checkout o2
nano work.txt

 

 

이후 add, commit!

git commit -am "o2 work 2"

 

저희의 상황을 보면 o2는 아래쪽 content 수정 master는 위쪽 content를 수정하였죠?

 

이제 o2 브렌치를 master 브렌치로 병합해보겠습니다.

그전에 당연히 checkout 해주셔야겠죠?

병합도 해주시고요!

커밋메세지는 그냥 놔두고 진행하겠습니다.  CTRL+X -> Y

git checkout main
git merge o2

 

과연 work.txt가 어떻게 변해있을지 궁금하지 않나요?

cat work.txt

 

어떤가요? 같은 이름의 파일이 서로 병합되는게 신기하지 않나요..? (저는 신기함)

 

여기까지 오느라 고생하셨고 아직 하나의 의문점이 더 있습니다.

이것이 마지막이니깐 끝까지 봐주세요!

 

그렇다면 같은파일, 같은부분이라면 어떻게 git이 병합을 처리할까? 궁금하지 않나요? 

바로 가보시죠. 시작하기 전에 마찬가지로 새로운 파일 하나를 만들어 주겠습니다.

 

그리고 들어줍시다.

 

 

마찬가지로 init 진행하고 work.txt 만들어주고 내용 추가하겠습니다.

git init
nano work.txt

 

 

git add work.txt
git commit -m "work 1"

 

브렌치 생성까지

git branch o2

 

그리고 난 후 master branch에서 work.txt 내용을 수정해줍시다.

 

 

git commit -am "master work 2"

 

이후에 o2 branch로 이동해주시고요!

work.txt 수정해줍시다! (같은부분이죠?) 

git checkout o2
nano work.txt

 

git commit -am "o2 work 2"

잘못썼어요.. ㅠㅠ

 

자 이제 저희가 할 것은 o2 branch를 master branch로 병합시켜야 겠죠?

1. master branch로 간다.

2. o2 branch를 병합시킨다.

해보겠습니다!

 

git checkout main
git merge o2

 

보시면 자동으로 합치는 것을 실패하였고 CONFLICT(충돌) 되었다고 하네요!

충돌을 해결한 다음에 결과를 커밋해달라고 합니다.

여기서 git의 상태를 한번 물어봐줄까요?

git status

 

 

양쪽이 수정되었다고 하네요!

 

그렇다면 work.txt 안에서는 어떤 일들이 일어나고 있을까요?

nano work.txt

 

========= 이라는 구분자를 중심으로 나눠져 있다는 점을 확인 할 수 있고 

Head 현재상태는 master이고 o2branch 에서는 o2라는 내용이 있다는 것을 확인시켜 줍니다.

 

그렇다면 저희는 공평하게 옆에 놔주고 나옵시다.

 

이제 add를 하시면 git에게 "내가 이 문제 해결했어~ " 라는 말이 되겠죠?

그리고 git의 마음이 상하진 않았는지 확인도 해줍시다.

git add work.txt
git stauts

 

다행히 마음이 상하지 않았고요.

마음을 확인했으니 커밋을 해주겠습니다.

이후 그대로 나와주겠습니다.

git commit

 

로그를 보게되면 보시는 것 처럼 새로운 버전이 있다는 것을 확인 할 수 있었습니다.

'Git' 카테고리의 다른 글

Git CLI 협업2  (0) 2024.01.31
Git CLI 협업  (1) 2024.01.31
Git CLI branch  (1) 2024.01.22
Git CLI branch & conflict  (0) 2024.01.22
Git CLI 당겨오기 (pull)  (1) 2024.01.22