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 상태
- master 브랜치는 그대로 있고 HEAD만 옮겨져 Detached HEAD 상태
git branch -f master
- master 브랜치를 HEAD위치로 가져옴(이미 있는 것이기 때문에 -f 옵션)
- master 브랜치를 HEAD위치로 가져옴(이미 있는 것이기 때문에 -f 옵션)
git checkout master
- master 브랜치로 checkout
3-way 병합
- 두 브랜치가 서로 다른 작업 흐름(분기)에 있을 때는 3-way 병합을 해야 함.
- 3 -way라고 불리는 이유는 base와 각 브랜치가 2개가 참조하는 커밋을 기준으로 병합을 진행하기 때문
merge를 진행했을 때 conflict가 뜰 수 있다.
git status를
통해 어떤 파일이 충돌이 났는지 확인할 수 있다.
git merge --abort
명령을 통해 merge 취소 가능
파일로 가서 오류를 해결한 후 다시 해당파일을 스테이지에 올리고 커밋해 준다.
rebase 사용하기
- git log 트리를 깔끔하게 사용하려면 rebase를 사용할 수 있음
- 원리
- HEAD와 대상 브랜치의 공통 조상을 찾는다.
- 공통 조상 이후에 생성한 커밋들을 대상 브랜치 뒤로 재배치한다.
위에 3-way 병합 실습을 할 때 사용했던 상태를 한 단계 되돌려서 병합 시 충돌이 나는 상태로 되돌렸다.
그 상태에서 branch1로 체크아웃 후 main 브랜치와 rebase를 진행하자
merge conflict와 함께 밑에 hint들이 떴다.
git status로 충돌대상을 확인한다.
충돌대상 파일로 들어가 충돌을 해결한 후 add 명령어를 이용해 파일을 스테이지로 올린다.
그 후 git rebase --continue를
이용해서 Rebase를 계속한다.
그러면 branch1이 main브랜치에 재배치된다. 이후 merge를 하면 빨리 감기가 된다.
rebase 주의사항
- rebase와 git의 동작원리를 잘 이해하기 전까지는 원격에 존재하지 않는 로컬 브랜치에만 적용
→ 원격 저장소에 푸시한 브랜치는 rebase 하지 않는 것이 원칙
3-Way 병합 vs rebase
- 3 way 병합
- 특징 : 머지 커밋 생성
- 장점 : 한 번만 충돌 발생
- 단점 : 트리가 약간 지저분해짐(커밋 로그가 추가됨)
- rebase
- 특징 : 현재 커밋들을 수정하면서 대상 브랜치 위로 재배치
- 장점 : 깔끔한 히스토리
- 단점 : 여러 번 충돌이 발생할 수 있음