1. 병합하고자 하는 두 브랜치가 공통 커밋을 조상으로 갖고 있는데, 한쪽 브랜치에만 이후의 커밋이 있을 때 2. 이 둘을 병합하기 위한 다른 커밋을 만들지 않고 3. 커밋이 없는 브랜치의 HEAD를 커밋이 있는 브랜치의 마지막 커밋으로 옮김 4. 병합된 브랜치는 삭제 5. 하지만 병합이 진행 된 이후, 어떤 브랜치를 사용했고 언제 병합했는지 기록이 남지 않음 6. 기록이 남지 않는 것을 피하는 병합 방법(Fast-forward 사용하지 않기)
git merge --no-ff (병합할 브랜치명)
1. 병합하고자 하는 두 브랜치가 모두 한개 이상의 커밋을 갖고 있는 경우 2. 하나이상의 파일에 두 브랜치가 다른 변경사항을 갖고 있는 경우 충동 해결 또는 변경사항 선택이 필요 3. 이 과정에서 어떤 브랜치의 작업인지 확인하기 위해 4. 조상인 공통 커밋과 두 브랜치의 커밋, 총 3번의 비교를 통해 어떤 브랜치의 커밋인지 확인
git cherry-pick (가져올 커밋의 해시)
cherry-pick 을 통해 가져온 커밋은 별개의 커밋
git rebase --onto (도착 브랜치) (출발 브랜치) (이동할 브랜치)
도착 브랜치에 이동할 브랜치 fast-forward
git switch (도착 브랜치) git merge (이동할 브랜치)
git rebase --onto main fruit citrus git switch main git merge citrus
rebase --onto 를 사용하고 git reflog 를 통해 내역을 살펴보면 아래와 같이 여러 내역들이 진행 됨
reset 은 브랜치별로 이루어지므로, rebase --onto 작업을 되돌리기 위해서는 작업에 영향을 받은 모든 브랜치들에서 하나하나 리셋을 진행해주어야 함 or 다시 옮겨 붙이기
main 브랜치는 이동된 브랜치(citrus) 로 fast-forwarnd 된 것이 마지막 작업이므로, reflog 기록상에서 그 이전 기록으로 reset --hard 해주면 됨
방법 1
이동된(citrus) 브랜치는 해당 브랜치가 옮겨지기 전 마지막 커밋의 해시를 reflog 에서 찾아 해당 위치로 reset --hard 해주면 됨
방법 2
다시 rebase --onto 를 사용해서 이동된(citrus 브랜치) 커밋들을 도착(main) 브랜치로부터 도로 출발(fruit) 브랜치의 원래의 브랜치 시작 위치 커밋 으로 옮겨주면 됨
1. 원래 브랜치 시작 위치의 커밋으로 checkout
2. 해당 위치에 새로운 브랜치 만들기 (temp 라 가정)git reabse --onto temp main citrus
위 명령어로 이동된 브랜치 옮겨 붙여 준 후 temp 브랜치 삭제