병합 충돌
충돌의 개념과 발생 이유
병합 충돌 (merge conflict
) 란, 두 브랜치에서 같은 파일의 같은 위치를 동시에 수정한 경우, 3-way 병합이 불가능하여 충돌이 발생을 하는 것을 의미한다. 서로 다른 위치를 수정한 경우에는 자동 병합이 가능하다.
병합의 해결 방법
개발자가 편집기로 직접 수정하여 충돌을 해결해야 한다.
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| # git log
git log --all --graph --oneline
>> * 94a38c4 (4th_branch) 4th branch
>> * 759ebef (3rd_branch) is_merged_test
>> | * ee3fae4 (HEAD -> main) ./test.sh
>> | * 6187d11 final commit
>> |/
>> * 3b89005 third commit
>> * 5d3fbb8 second commit
>> * cb545cf first commit
# main 브랜치로 이동
git switch main
# main 브랜치와 4th_branch 병합 - merge failed
git merge -m "main-4th_branch merge" 4th_branch
>> Auto-merging test.sh
>> CONFLICT (content): Merge conflict in test.sh
>> Automatic merge failed; fix conflicts and then commit the result.
# git status 로 상황 확인 - conflict (both modified) 발생
git status
>> On branch main
>> You have unmerged paths.
>> (fix conflicts and run "git commit")
>> (use "git merge --abort" to abort the merge)
>> Unmerged paths:
>> (use "git add <file>..." to mark resolution)
>> both modified: test.sh
>> no changes added to commit (use "git add" and/or "git commit -a")
# 충돌 파일 확인 및 수정
vi ./test.sh
|
1
2
3
4
5
6
7
8
9
10
11
| #!/bin/bash
echo Hello Linux
echo $0 $1 $2
<<<<<<< HEAD
diff test
diff test - unstaged
switch test1
=======
is merged? test
additional commit
>>>>>>> 4th_branch
|
항목 |
영문 |
설명 |
«««< HEAD |
Current Change |
충돌 부분 중 현재 헤드가 가리키고 있는 버전의 내용 |
======= |
Conflict Separator |
구분선 |
»»»> main |
Incoming Change |
충돌 부분 중 병합하려는 브랜치의 내용 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| # 파일 수정 후 내용
cat ./test.sh
>> \#!/bin/bash
>> echo Hello Linux
>> echo $0 $1 $2
>> newline_test
>> -- history --
>> \#is merged? test
>> \#additional commit
>> \#diff test
>> \#diff test - unstaged
>> \#switch test1
# git add
git add ./test.sh
# git commit
git commit -m "conflict resolution"
[main d40b0ce] conflict resolution
# git log
git log --oneline --all --graph
>> * d40b0ce (HEAD -> main) conflict resolution
>> |\
>> | * 94a38c4 (4th_branch) 4th branch
>> | * 759ebef (3rd_branch) is_merged_test
>> * | ee3fae4 ./test.sh
>> * | 6187d11 final commit
>> |/
>> * 3b89005 third commit
>> * 5d3fbb8 second commit
>> * cb545cf first commit
### >> 충돌을 해결하고 병합 완료
|
Reference
UNIX시스템 - 김희천,김진욱 저