<Git Chapter 10> - Branch 보다 깊이 알기 1

심우열·2023년 1월 6일
0

Git

목록 보기
19/27

1. Git 의 두가지 merge 전략

1. Fast-forward

1. 병합하고자 하는 두 브랜치가 공통 커밋을 조상으로 갖고 있는데, 한쪽 브랜치에만 이후의 커밋이 있을 때
2. 이 둘을 병합하기 위한 다른 커밋을 만들지 않고
3. 커밋이 없는 브랜치의 HEAD를 커밋이 있는 브랜치의 마지막 커밋으로 옮김
4. 병합된 브랜치는 삭제
5. 하지만 병합이 진행 된 이후, 어떤 브랜치를 사용했고 언제 병합했는지 기록이 남지 않음
6. 기록이 남지 않는 것을 피하는 병합 방법(Fast-forward 사용하지 않기)
git merge --no-ff (병합할 브랜치명)

2. 3-way-merge

1. 병합하고자 하는 두 브랜치가 모두 한개 이상의 커밋을 갖고 있는 경우
2. 하나이상의 파일에 두 브랜치가 다른 변경사항을 갖고 있는 경우 충동 해결 또는 변경사항 선택이 필요
3. 이 과정에서 어떤 브랜치의 작업인지 확인하기 위해 
4. 조상인 공통 커밋과 두 브랜치의 커밋, 총 3번의 비교를 통해 어떤 브랜치의 커밋인지 확인

2. 다른 브랜치에서 원하는(cherry) 커밋만 따오기

git cherry-pick (가져올 커밋의 해시)

cherry-pick 을 통해 가져온 커밋은 별개의 커밋

3. 다른 브랜치에서 파생된 브랜치 옮겨 붙이기

git rebase --onto (도착 브랜치) (출발 브랜치) (이동할 브랜치)

도착 브랜치에 이동할 브랜치 fast-forward

git switch (도착 브랜치)
git merge (이동할 브랜치)

예시) fruit 브랜치에서 파생된 citrus 브랜치를 main 브랜치로 옮겨 붙이기

git rebase --onto main fruit citrus
git switch main
git merge citrus  

rebase --onto 를 되돌리는 방법

rebase --onto 를 사용하고 git reflog 를 통해 내역을 살펴보면 아래와 같이 여러 내역들이 진행 됨

reset 은 브랜치별로 이루어지므로, rebase --onto 작업을 되돌리기 위해서는 작업에 영향을 받은 모든 브랜치들에서 하나하나 리셋을 진행해주어야 함 or 다시 옮겨 붙이기

1. 도착(main) 브랜치

main 브랜치는 이동된 브랜치(citrus) 로 fast-forwarnd 된 것이 마지막 작업이므로, reflog 기록상에서 그 이전 기록으로 reset --hard 해주면 됨

2. 이동된(citrus) 브랜치

방법 1
이동된(citrus) 브랜치는 해당 브랜치가 옮겨지기 전 마지막 커밋의 해시를 reflog 에서 찾아 해당 위치로 reset --hard 해주면 됨

방법 2
다시 rebase --onto 를 사용해서 이동된(citrus 브랜치) 커밋들을 도착(main) 브랜치로부터 도로 출발(fruit) 브랜치의 원래의 브랜치 시작 위치 커밋 으로 옮겨주면 됨
1. 원래 브랜치 시작 위치의 커밋으로 checkout
2. 해당 위치에 새로운 브랜치 만들기 (temp 라 가정)

git reabse --onto temp main citrus

위 명령어로 이동된 브랜치 옮겨 붙여 준 후 temp 브랜치 삭제

profile
Dev Ops, "Git, Linux, Docker, Kubernetes, ansible, " .

0개의 댓글