반응형

기본 설명

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

+ Recent posts