추천 가젯

Git과 CLI (5) - 3-way 병합하기

버그 처리 시나리오

버그를 마주하였다면 다음 단계를 거쳐 수정하게 된다.

  1. (옵션) 오류가 없는 버전(주로 Tag가 있는 버전)으로 롤백

  2. master 브랜치로부터 hotfix 브랜치 생성

  3. 빠르게 소스 코드 수정 및 테스트

  4. master 브랜치로 병합(Fast-Forward) 및 배포

  5. 개발 중인 브랜치에도 병합

버그가 발생한 상황에서는 원래 작업 중이던 브랜치도 master 브랜치로부터 시작했기 때문에 같은 버그를 가지고 있을 것이다. 그렇기 때문에 hotfix 브랜치의 내용은 master 브랜치와 개발 브랜치 모두에 병합되어야 한다. 보통 master 브랜치의 병합은 빨리감기이기 때문에 쉽게 되는 반면 개발 중인 브랜치의 병합은 병합 커밋이 생성되고 충돌이 일어날 가능성이 높다.


먼저 feature1 브랜치를 만들고 커밋을 생성해 보겠다.

# master로 체크아웃
yegang@yegangs:~/hello-git-cli$ git checkout master
Already on 'master'
Your branch is up to date with 'origin/master'.

# feature1 브랜치 생성 후 체크아웃
yegang@yegangs:~/hello-git-cli$ git checkout -b feature1
Switched to a new branch 'feature1'

# 새 내용 추가
yegang@yegangs:~/hello-git-cli$ echo "기능 1 추가" >> file1.txt

# 스테이징 및 커밋 추가
yegang@yegangs:~/hello-git-cli$ git add file1.txt
yegang@yegangs:~/hello-git-cli$ git commit -m "새로운 기능 1 추가"
[feature1 247cb34] 새로운 기능 1 추가
 1 file changed, 1 insertion(+)
# 

이 시점에서 장애가 발생했다고 가정하자. 커밋을 한 상태에서 장애가 발생했지만 실제 개발을 진행할 때에는 커밋을 하기 애매한 상황에서 장애가 발생할 수 있다. 이 때 git stash를 사용할 수 있다. 우선 커밋을 한 직후에 장애가 발생했다고 가정하고 서술한다.

이제 버그를 고치기 위해 master 브랜치에서 hotfix 브랜치를 먼저 만들어야 한다. 그리고 버그를 고친 후에 커밋을 한다. 그리고 hotfix 브랜치를 master 브랜치로 병합한다.

master 브랜치의 최신 커밋을 기반으로 hotfix 브랜치 작업을 했기 때문에 빨리 감기 병합이 가능한 상황이다.

# master로부터 hotfix 브랜치 생성 및 체크아웃
yegang@yegangs:~/hello-git-cli$ git checkout -b hotfix master
Switched to a new branch 'hotfix'

# 로그 보기
yegang@yegangs:~/hello-git-cli$ git log --oneline --all -n2
247cb34 (feature1) 새로운 기능 1 추가
db8ebff (HEAD -> hotfix, tag: v0.1, origin/master, m
aster) mybranch1의 두 번째 커밋

# 핫픽스 내용을 입력 후 커밋
yegang@yegangs:~/hello-git-cli$ echo "핫픽스" >> file1.txt
yegang@yegangs:~/hello-git-cli$ git add file1.txt
yegang@yegangs:~/hello-git-cli$ git commit -m "hotfix 실습"
[hotfix ef34ef4] hotfix 실습
 1 file changed, 1 insertion(+)
 
# 커밋 내용 확인
yegang@yegangs:~/hello-git-cli$ git log --oneline -n1
ef34ef4 (HEAD -> hotfix) hotfix 실습

# master 브랜치로 체크아웃 후 hotfix 병합
yegang@yegangs:~/hello-git-cli$ git merge hotfix
Updating db8ebff..ef34ef4
Fast-forward
 file1.txt | 1 +
 1 file changed, 1 insertion(+)
 
# push
yegang@yegangs:~/hello-git-cli$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 312 bytes | 312.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/yeganghwang/hello-git-cli.git
   db8ebff..ef34ef4  master -> master
yegang@yegangs:~/hello-git-cli$

hotfix 커밋의 내용은 버그 수정이었기 때문에 이 내용을 현재 개발중인 브랜치인 feature1에도 반영하여야 한다. 그런데 feature 브랜치와 master 브랜치는 서로 다른 분기로 진행되고 있다.

yegang@yegangs:~/hello-git-cli$ git log --oneline --graph --all
* ef34ef4 (HEAD -> master, origin/master, hotfix) hotfix
습
| * 247cb34 (feature1) 새로운 기능 1 추가
|/
* db8ebff (tag: v0.1) mybranch1의 두 번째 커밋

다른 가지로 빠졌기 때문에 빨리감기 병합은 불가능하므로 3-way 병합을 진행해야 한다.

3-way 병합을 한다고 해서 무조건 충돌이 발생하는 것은 아니지만, 이 실습에서는 file1.txt 파일을 모두 건드렸으므로 충돌이 발생한다. master 브랜치에는 "핫픽스"를, feature1 브랜치에는 "기능 1 추가"를 작성하였기 때문이다.

우선 병합을 진행해본다.

# feature1 브랜치로 체크아웃 후 로그 확인
yegang@yegangs:~/hello-git-cli$ git checkout feature1
Switched to branch 'feature1'
yegang@yegangs:~/hello-git-cli$ git log --oneline --all -n2
ef34ef4 (origin/master, master, hotfix) hotfix 실습
247cb34 (HEAD -> feature1) 새로운 기능 1 추가

# master 브랜치와 병합 시도
yegang@yegangs:~/hello-git-cli$ git merge master
Auto-merging file1.txt
CONFLICT (content): Merge conflict in file1.txt
Automatic merge failed; fix conflicts and then commit the result.

# 로그 확인
yegang@yegangs:~/hello-git-cli$ git status
On branch feature1
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")

# 파일 수정
yegang@yegangs:~/hello-git-cli$ cat file1.txt
hello test
second
third - mybranch1
fourth - mybranch1
<<<<<<< HEAD
기능 1 추가
=======
핫픽스
>>>>>>> master

yegang@yegangs:~/hello-git-cli$ vi file1.txt
yegang@yegangs:~/hello-git-cli$ cat file1.txt
hello test
second
third - mybranch1
fourth - mybranch1
기능 1 추가
핫픽스

병합에 충돌이 발생하였기 때문에, 파일을 수정하였다.

이제 병합 커밋을 생성하기 위해 파일을 스테이징하고 상태를 확인해 보겠다.

yegang@yegangs:~/hello-git-cli$ git add file1.txt

yegang@yegangs:~/hello-git-cli$ git status
On branch feature1
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:
        modified:   file1.txt

모든 충돌이 해결되었고 병합 중에 있다고 나온다. 이제 커밋하여 병합을 완료할 수 있다.

yegang@yegangs:~/hello-git-cli$ git commit
[feature1 65352c8] Merge branch 'master' into feature1
yegang@yegangs:~/hello-git-cli$ git log --oneline --all --graph -n4
*   65352c8 (HEAD -> feature1) Merge branch 'master' into feature1
|\
| * ef34ef4 (origin/master, master, hotfix) hotfix 실습
* | 247cb34 새로운 기능 1 추가
|/
* db8ebff (tag: v0.1) mybranch1의 두 번째 커밋

댓글

가장 많이 본 글