공동 작업
기준 브랜치 반영 작업
- 기준 브랜치를 여러 사람이 공동으로 사용하는 경우,
- 개발자 A가 기준 브랜치에 작업 브랜치를 반영하는 시점에 이미 다른 사람인 B가 기준 브랜치에 먼저 반영한 내용이 있을 수 있다.
- 이 때는 작업 내용에 따라 A가 기준 브랜치에 작업 브랜치를 반영하는 작업이 충돌할 수 있다.
- 기준 브랜치에 작업 브랜치를 반영하기 전에 먼저 기준 브랜치를 작업 브랜치에 반영하는 작업을 하면
경우 1: 충돌이 발생하지 않는 경우
- 설명
- 기준 브랜치를 혼자서 사용하는 경우
- 또는 공동으로 사용하지만 작업 빈도가 적어서 내가 모르는 사이에 기준 브랜치에 새 커밋이 올라오지 않는 경우
- 작업
- 기준 브랜치에서 b 브랜치 생성
- b 브랜치에 c1 커밋 추가
- 기준 브랜치에서 b1 브랜치 머지
$ git init test_merge_1
Initialized empty Git repository in test_merge_1/.git/
$ cd test_merge_1
$ echo "line 1" >> file1.txt
$ git add .
$ git commit -m c0
[main (root-commit) f36cdc2] c0
1 file changed, 1 insertion(+)
create mode 100644 file1.txt
$ git switch -c a
Switched to a new branch 'a'
$ echo "line 2" >> file1.txt
$ git add .
$ git commit -m c1
[a 68971af] c1
1 file changed, 1 insertion(+)
$ git switch main
Switched to branch 'main'
$ git merge a -m "merge a"
Updating f36cdc2..68971af
Fast-forward (no commit created; -m option ignored)
file1.txt | 1 +
1 file changed, 1 insertion(+)경우 3: 백머지를 하지 않아서 충돌이 발생하는 경우
- 작업 순서
- 기준 브랜치에서 b 브랜치 생성
- b 브랜치에 c1 커밋 추가 -> 다른 사람이 먼저 머지
- 기준 브랜치에 c2 커밋 추가
- 기준 브랜치에서 b1 브랜치 머지 -> 충돌
- 만약 다른 사람이 기준 브랜치 머지를 하지 않으면 (2번이 없는 경우) 충돌이 발생하지 않음
- 기준 브랜치에서 머지 취소 (
merge --abort) - b 브랜치에서 기준 브랜치 머지 -> 충돌
- 충돌 해결
- 기준 브랜치에서 b1 브랜치 머지 -> 성공
경우 2: 백-머지로 충돌을 줄인 경우
- 설명
- 레포를 공동으로 사용하는 경우
- 기준 브랜치에 내가 모르는 사이에 커밋이 올라올 수 있다는 가정
- 규칙: 작업 브랜치에 커밋하기 전에 항상 기준 브랜치를 백-머지(back-merge)해 주어야 함
- 위 규칙을 지키면 충돌 가능성이 적어짐
- 위 규칙을 지켜도 기준 브랜치에 머지 직전 다른 사람이 기준 브랜치에 커밋을 올릴 수도 있으므로 충돌 가능성은 존재
- 공동 사용하는 사람이 적어서 기준 브랜치 머지 간격이 길면 충돌 가능성이 적어진다.
- 작업 순서
- 기준 브랜치에서 a 브랜치 생성
- 기준 브랜치에 c2 커밋 추가 -> 다른 사람이 먼저 머지
- a 브랜치에서 기준 브랜치 머지
- a 브랜치에 c1 커밋 추가
- 기준 브랜치에서 b1 브랜치 머지
경우 4: 백머지를 했지만 충돌이 발생하는 경우
- 설명
- 레포를 공동으로 사용하는 경우
- 작업 브랜치에 커밋하기 전에 백-머지(back-merge)를 했는데 그 이전에 다른 사람이 먼저 기준 브랜치에 커밋을 올린 경우
- 백-머지시 충돌 발생
- 충돌을 해결하고 커밋
- 커밋 이후에 기준 브랜치에 머지
- 이렇게 해도 백-머지와 기준 브랜치 머지 사이에 다른 사람이 먼저 먼저 기준 브랜치에 커밋을 올리면 충돌이 발생한다.
- 많은 사람이 공동 사용해서 기준 브랜치 머지 간격이 아주 짧으면 충돌이 무한 반복될 수 있다.
- 작업 순서
- 기준 브랜치에서 b 브랜치 생성
- 기준 브랜치에 c2 커밋 추가 -> 다른 사람이 먼저 머지
- b 브랜치에 c1 커밋 추가
- b 브랜치에서 기준 브랜치 머지 -> 충돌
- 충돌 해결
- 기준 브랜치에서 b1 브랜치 머지
- 만약 5번과 6번 사이에 다른 사람이 기준 브랜치 머지하면 또 충돌 발생
$ git init test_merge_4
Initialized empty Git repository in test_merge_4/.git/
$ cd test_merge_2
$ echo "line 1" >> file1.txt
$ git add .
$ git commit -m c0
[main (root-commit) f36cdc2] c0
1 file changed, 1 insertion(+)
create mode 100644 file1.txt
$ git switch -c a
Switched to a new branch 'a'
$ echo "line 2" >> file1.txt
$ git add .
$ git commit -m c1
[a fb6bd2c] c1
1 file changed, 1 insertion(+)
$ git switch main
Switched to branch 'main'
$ echo "line 3" >> file1.txt
$ git add .
$ git commit -m c1
[main 7d13172] c2
1 file changed, 1 insertion(+)
$ git merge a -m "merge a"
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.
$ 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: file1.txt
no changes added to commit (use "git add" and/or "git commit -a")line 1
<<<<<<< HEAD
line 3
=======
line 2
>>>>>>> a