SCM/Git

[Git & GitHub 4] git merge, merge commits, resolving merge conflicts

ride-dev 2024. 5. 5. 18:57

git merge, resolving merge conflicts

git merge

git merge 명령어를 통해 독립적인 브랜치에서 작업한 것을 통합(병합)할 수 있습니다.

브랜치를 다루는 전략은 다양합니다.

Fast-forward

Fast-foward는 일반적인 전략으로,

main(master) 브랜치는 손대지 않고,

다른 기능 브랜치를 만들어 main 브랜치에 merge하는 것입니다.

여러 번의 commit내역이 있는 branch를 HEAD에 병합합니다.

(특정 commit 간 병합이 아닙니다)

따라서 HEAD를 기준 branch(main, master)로 이동 후, 병합합니다.

git switch main
git merge feature

main branch의 레퍼런스 포인터가 feature branch의 commit(HEAD)을 가리킵니다.

Fast-foward의 merge 과정을 시각화하면 아래와 같습니다.

main branch에 feature branch를 병합하면, feature branch의 commit이 빠르게 일어납니다.

 

이렇게 병합이 일어난다고 feature branch가 사라지는 것은 아닙니다.

여전히 feature branch는 독립적으로 존재합니다.

 

만약 main branch에 새로운 commit이 존재하면,

Fast-forward 전략을 사용할 수 없습니다.

이 때, merge commits 전략을 사용할 수 있습니다.

merge commits

main branch에 새로운 commit이 존재할 때,

git pull 명령어를 사용하여 main branch의 commit 내역을 동기화한 뒤,

merge합니다.

(main branch에 변경사항이 없으면 fast forward가 될 수 있습니다)

 

각 commit은 부모 커밋을 가집니다.

merge commit 시, merge의 기준이 되는 branch에 (메시지와 함께)commit을 생성합니다.

이 때, merge commit은 (하나가 아닌) 두 개의 부모 commit을 가집니다.

(커밋은 다수의 부모 커밋을 가질 수 있습니다)

git switch main
git pull
git merge feature

 

merge commits의 과정은 아래와 같습니다.

feature branch 작업
git switch main
git pull로 main branch commit 최신화
git merge feature -m "커밋 메시지" 로 merge commit 생성

 

만약 두 명의 작업자가 동일한 파일을 작업하고 commit하면,

충돌이 발생할 수 있습니다.

resolving merge conflicts

충돌이 발생하면, 직접 충돌을 해결해야 합니다.

충돌이 발생한 파일을 열어 변경사항을 적용하고 커밋합니다.

 

각 branch의 동일한 파일, 동일한 line의 내용이 아래와 같이 다르다면,

<<<<<<< HEAD
main branch contents
=======
feature branch contents
>>>>>>> feature

위 예제에서 HEAD의 내용은 main branch contents이고,

merge 하려는 feature branch의 내용은 feature branch contents 입니다.

<<<<<<< 기준 브랜치

======= 충돌 내용 구분

>>>>>>> 병합할 브랜치

만약 feature branch의 내용을 적용하려면

<<<<<<< HEAD
main branch contents
=======
feature branch contents
>>>>>>> feature

위 내용을 아래와 같이 변경합니다.

feature branch contents

둘 다 유지하고 싶다면 아래와 같이 변경합니다.

main branch contents
feature branch contents

 

새로운 예시를 보겠습니다.

1. main branch에 Order 파일을 생성합니다.

2. waiter1 branch가 Order 파일을 수정합니다.

3. waiter2 branch가 Order 파일을 수정합니다.

4. waiter1을 기반으로 table1orders branch를 생성한 뒤, waiter2와 merge합니다.

5. 충돌을 해결하고 커밋합니다.

Git Merging 연습

연습 주제별 디렉토리를 생성하고, git respository로 초기화합니다.

각 디렉토리에 web.txt 파일을 생성하고 commit 합니다.

1. Fast Forward Merge 빨리 감기 병합

1. feature branch 생성-이동

git switch -c feature

2. web.txt에 feature1 추가 및 commit

vim web.txt
git add web.txt
git commit -m "create feature1"

3. web.txt에 feature2 추가 및 commit

vim web.txt
git add web.txt
git commit -m "create feature2"

4. master branch로 이동 및 feature branch merge

git switch master
git merge feature

2. Merge Commit (No Conflicts) 병합 커밋(충돌 없이)

1. feature branch 생성-이동

git switch -c feature

2. web.txt에 feature 추가 및 commit

vim web.txt
git add web.txt
git commit -m "create feature"

3. master branch로 이동 및 mobile.txt 생성, commit

git switch master
touch mobile.txt
git add mobile.txt
git commit -m "create mobile.txt"

4. feature branch merge

git merge feature

3. Resolving merge conflicts 병합 충돌 해결

1. member branch, board branch 생성

 git branch member
 git branch board

 

2. member branch의 web.txt에 "member page" 추가 및 commit

git switch member
vim web.txt
git add web.txt
git commit -m "create member page"

3. board branch의 web.txt에 "board page" 추가 및 commit

git switch board
vim web.txt
git add web.txt
git commit -m "create board page"

4. master branch에 member branch merge

git switch master
git merge member

5. master branch에 board branch merge

git merge board
vim web.txt
git add web.txt
git commit -m "resolving conflicts"
728x90