Git 사용법

자세한 Git 사용법 - 7 (병합과 충돌)

Everyday Growing Engineer 2022. 9. 25. 14:21
  • Fast-Forward 병합
  • 3-way 병합
  • rebase

1. Fast-Forward 병합

순차적 커밋 맞추어 병합.  브랜치 1에는 추가된것이 없고 브랜치 2에만 계속 진행된후 merge를 할경우를 Fast-Forward 병합이라고 한다. 

2. 3-way 병합

2.1 공통 조상

브랜치별로 각각 커밋하면 두 브랜치로 갈라짐. 이때는 3-way 방식을 이용해야 한다. (1)조상커밋 (2)브랜치1 커밋 (3) 브랜치2 커밋 - 브랜치가 3개 있다고 해서 3-way 병합이라고 한다. 

 

2.2 병합 커밋

병합을 성공적으로 완료한 후에는 새로운 커밋을 추가로 생성합니다. 새로 생성된 커밋을 병합 커밋이라고 합니다. 병합 커밋은 부모 커밋이 2개라는 특징이 있습니다. 

 

  • git reset --hard HEAD^ : 병합취소
  • git merge hotfix --edit : 병합 명령

3. 충돌

여러 사람과 개발 작업을 하다 보면 예상외의 충돌이 자주 발생

  • git merge 다른브랜치 : 병합.  병합중 충돌시 unmerge라고 뜸.
  • git merge --abort : 병합 명령 취소
  • git ls-files -u : 충돌한 파일들의 집합을 확인.

4. 브랜치 병합 여부 확인

  • git branch --merged : 병합이 완료된 브랜치
  • git branch --no-merged : 병합하지 않은 브랜치

5. 리베이스 (rebase)

브랜치를 합치는 방법은 2가지 (1) 병합(merge) (2) 리베이스(rebase). 리베이스는 커밋의 트리 구조를 재배열합니다. 실무에서는 merge 명령어보다는 커밋의 재배열하는 리베이스를 선호!!!

 

6. 리베이스 vs 병합

rebase 의 병합 기준 브랜치가 merge 명령어와 반대

  • 병합에서의 베이스 커밋은 두 브랜치의 조상 commit이다. 병합하는 두 브랜치는 순차적으로 커밋을 비교하면서 마지막 최종 커밋을 생성한다.
  • 리베이스 두 브랜치를 서로 비교하지 않고 순차적으로 커밋 병합을 시도
  • 리베이스는 커밋 위치를 재조정할 분 브랜치의 HEAD 포인터까지 옮겨 주지는 않습니다.  즉 rebase한 이후 master 위치를 옮기려면 merge 이용.(Fast-Forward)

  • $ git rebase 브랜치 
  • (위에 상황) $ git checkout feature -> $ git rebase master -> $ git checkout master -> $ git merge description
  • feature 브랜치 이동 -> rebase를 통해 합치고 -> master 브랜치로 이동 -> master 브랜치 포인터 뒤로 이동

7. rebase 충돌시

  • $git checkout menu -> $ git rebase master -> 코드 고치고 -> $ git add . -> $ git rebase --continue 

 

!!! rebase 주의사항 !!!

저장소를 외부에 공개했다면 공개된 순간부터 commit은 rebase를 사용하지 않는 것이 원칙

rebase는 외부로 코드를 푸시하거나 공개하기 전에 로컬에서만 실행하는 것이 좋습니다.