반응형
기본 설명
merge commit
- A 브랜치에서 B 브랜치를 생성
- A 브랜치와 B 브랜치 각각 별도의 추가 커밋이 발생
- A 브랜치에 B 브랜치를 Merge
- A, B 브랜치의 최신 커밋을 포함하는 새로운 커밋을 생성함
- A, B 브랜치 포인터 모두 merge commit으로 이동함
- 이 과정에서 생성된 새로운 커밋이 바로 merge commit
fast forward
- A 브랜치에서 B 브랜치를 생성
- B 브랜치만 추가 커밋 발생
- A 브랜치에 B 브랜치를 Merge
- A 브랜치 포인터가 B 브랜치 포인터로(최신 커밋으로) 이동함
- 이러한 현상을 fast forward라 함
Merge와 Rebase 예시
병합 전 commit 상태
- 상태
- commit0 <- commit1 <- commit2 <- commit5(master)
- commit0 <- commit1 <- commit2 <- commit3 <- commit4(dev)
master로 dev를 Merge
- 상태
- commit0 <- commit1 <- commit2 <- commit5 <- commit6(master, merge commit)
- commit0 <- commit1 <- commit2 <- commit3 <- commit4 <- commit6(dev, merge commit)
- 특징
- 불필요한 commit(merge commit) 로그가 발생하므로 그래프로 파악하기 어려울 수 있음
- 충돌된 코드를 한번에 해결할 수 있어 좋음
- 언제 어떤 commit들이 병합되었는지 확인하기 쉬움
dev에서 master를 Rebase
- 상태
- commit0 <- commit1 <- commit2 <- commit5(master) <- commit3 <- commit4(dev)
- 특징
- 그래프가 단순해져서 파악하기 쉬움
- 충돌된 코드를 commit별로 하나씩 해결해야하는 어려움이 있을 수 있음
참고
Commit Merge의 위험성
시나리오
- master 브랜치와 develop 브랜치가 존재함
- develop에서 개발을 진행하고, 정기 배포시 develop → master로 commit merge 후 배포
- HotFix건이 발생하여 master에서 hotfix 브랜치를 따고 AAA.java 코드를 수정, hotfix → master로 commit merge 후 배포
- 그 이후 별다른 상황이 없으면 정기배포시에 develop → master로 commit merge 후 배포
위 상황의 위험성
- hotfix 브랜치에서 작업한 AAA.java 코드 내용은 master에서만 유지됨
- develop 브랜치에는 수정된 AAA.java 코드 내용이 영원히 반영되지 않음
- hotfix로 작업한 내용을 다시 develop에 merge를 해주면 문제 없지만, 매번 신경쓰기 어려움
rebase merge를 한다면?
- rebase develop onto master && develop → master merge 후 배포
- master에 있는 수정된 AAA.java 코드 내용이 develop에 반영된 다음 develop의 모든 내용이 master에 merge
- 모든 브랜치에 이상적인 코드 상태를 유지할 수 있음
Rebase Conflict 이상한 상황
이상 상황
- develop onto master로 rebase merge 진행시 master에 파일이 없고, develop에 있는 파일이 충돌되었다고 나오는 상황
- master에 그 파일이 있는것 처럼 보이고, 수정된 것처럼 보이는데 어떻게 된 상황일까?
시나리오
- master 브랜치에서 develop 브랜치 생성
- develop 브랜치에 develop.md 코드 추가
- master : develop.md 파일 X
- develop
### develop - version: 1.0.0
- develop 브랜치에서 develop-2 브랜치 생성
- develop-2 브랜치에 develop.md 코드 수정
- master : develop.md 파일 X
- develop
### develop - version: 1.0.0
- develop-2
### develop - version: 1.0.1
- develop 브랜치에 develop.md 코드 수정 (develop ↔ develop-2간 충돌 유발)
- master : develop.md 파일 X
- develop
### develop - version: 1.0.2
- develop-2
### develop - version: 1.0.1
- develop-2 → develop 머지 커밋 (develop.md 충돌 해결 후)
- master : develop.md 파일 X
- develop
### develop - version: 1.0.2
- develop onto master rebase merge 시도시 develop.md 파일에 대한 충돌 발생
결론
- develop 브랜치에 충돌 이력이 있는 커밋이 존재할 경우 master로 rebase merge시에 해당 충돌을 다시 해결해야 하는 상황이 생김
- rebase merge를 하려면 충돌 이력이 있는 커밋이 없도록 잘 관리되어야 함
반응형
'Development > Git' 카테고리의 다른 글
[GitHub] GitHub Pages Jekyll 테마 적용하기 (0) | 2019.05.25 |
---|---|
[GitHub] GitHub Pages 사용하기 (0) | 2019.05.25 |
[Git] 명령어 (0) | 2019.05.11 |
[Git] 설치하기 (0) | 2019.05.11 |
[Git] ssh 설정으로 로그인 없이 git 접근하기 (0) | 2019.01.03 |