호우동의 개발일지

Today :

article thumbnail

 

CLI를 이용한 빨리 감기 병합

빨리감기
빨리감기

branch1 브랜치가 master 브랜치보다 최신 커밋을 가리키고 있다.
그리고 두 브랜치는 같은 작업의 흐름에 있다.

  • master 브랜치로 checkout 후 master 브랜치와 branch1 브랜치를 merge(병합)하면?

빨리감기
빨리감기

새로운 커밋이 생성되지 않고 master 브랜치가 빨리 감기 된다.

 

예시
예시

HEAD가 branch1이고 main이 이전 커밋인 이런 커밋로그가 있다.
main 브랜치로 체크아웃하고 커밋을 해보겠다.

 

 

 

커밋

중간에 보면 Fast-forward라는 문구와 함께
branch1이 가리키던 커밋을 함께 가리키는 것을 확인할 수 있다.

 


origin/HEAD는 변하지 않았는데 아직 원격저장소에 Push 해주지 않았기 때문이다.

  • 빨리 감기(fast-forward) 상황에서 rebase 명령어를 수행하면 마찬가지로 빨리 감기를 실행

 

 

 

 

 

reset —hard로 브랜치 되돌리기

  • git reset --hard <이동할 커밋체크섬> : 현재 브랜치를 지정한 커밋으로 옮긴다.
    • 현재 브랜치를 지정한 커밋으로 옮긴 후 해당 커밋의 내용을 작업폴더에도 반영한다.
    • <이동할 커밋체크섬>은 너무 길어서 ‘HEAD~’ 또는 ‘HEAD^로 시작하는 약칭 사용

      • HEAD~<숫자> : HEAD는 헤드의 부모 커밋, HEAD~n은 n번째 위쪽 조상을 뜻함
      • HEAD^<숫자> : HEAD^n은 n번째 부모 커밋을 가리킴
        • 병합 커밋처럼 부모가 둘 이상인 커밋에서만 의미 있음

  • reset —hard는 세 가지 명령어를 합친 것 (n번째 브랜치로 reset 한다고 가정)
    • git checkout HEAD~n 
      • master 브랜치는 그대로 있고 HEAD만 옮겨져 Detached HEAD 상태

    • git branch -f master 
      • master 브랜치를 HEAD위치로 가져옴(이미 있는 것이기 때문에 -f 옵션)

    • git checkout master 
      • master 브랜치로 checkout

 

 

 

 

3-way 병합

  • 두 브랜치가 서로 다른 작업 흐름(분기)에 있을 때는 3-way 병합을 해야 함.
  • 3 -way라고 불리는 이유는 base와 각 브랜치가 2개가 참조하는 커밋을 기준으로 병합을 진행하기 때문

충돌 발생
컨플릭트 발생 가능

merge를 진행했을 때 conflict가 뜰 수 있다.

merge진행 후

 

 

conflict

git status를 통해 어떤 파일이 충돌이 났는지 확인할 수 있다.

  • git merge --abort 명령을 통해 merge 취소 가능

파일로 가서 오류를 해결한 후 다시 해당파일을 스테이지에 올리고 커밋해 준다.

 

 

 

 

rebase 사용하기

  • git log 트리를 깔끔하게 사용하려면 rebase를 사용할 수 있음


  • 원리
    1. HEAD와 대상 브랜치의 공통 조상을 찾는다.
    2. 공통 조상 이후에 생성한 커밋들을 대상 브랜치 뒤로 재배치한다.

충돌이 나는 상태

위에 3-way 병합 실습을 할 때 사용했던 상태를 한 단계 되돌려서 병합 시 충돌이 나는 상태로 되돌렸다.

 

그 상태에서 branch1로 체크아웃 후 main 브랜치와 rebase를 진행하자
merge conflict와 함께
 밑에 hint들이 떴다.

힌트들이 뜸

git status로 충돌대상을 확인한다.
충돌대상 파일로 들어가 충돌을 해결한 후 add 명령어를 이용해 파일을 스테이지로 올린다.

git add

그 후 git rebase --continue를 이용해서 Rebase를 계속한다.

 

그러면 branch1이 main브랜치에 재배치된다. 이후 merge를 하면 빨리 감기가 된다.

 

 

 

 

 

rebase 주의사항

  • rebase와 git의 동작원리를 잘 이해하기 전까지는 원격에 존재하지 않는 로컬 브랜치에만 적용
    → 원격 저장소에 푸시한 브랜치는 rebase 하지 않는 것이 원칙

 

 

3-Way 병합 vs rebase

  • 3 way 병합
    • 특징 : 머지 커밋 생성
    • 장점 : 한 번만 충돌 발생
    • 단점 : 트리가 약간 지저분해짐(커밋 로그가 추가됨)


  • rebase
    • 특징 : 현재 커밋들을 수정하면서 대상 브랜치 위로 재배치
    • 장점 : 깔끔한 히스토리
    • 단점 : 여러 번 충돌이 발생할 수 있음