git merge(병합)
git merge는 두 개의 브랜치를 합칠 때 사용합니다. 아래 base와 target은 브랜치 이름이며 base가 current(현재), target이 incoming(머지 받은 것)이 됩니다. base에 target의 코드를 합치며 같은 부분에 수정 사항이 있으면 conflict(충돌)이 발생합니다.
git merge <base> <target>
git merge dev test
git merge origin dev origin test
git merge origin/dev origin/test
# 혹은
git checkout <base>
git merge <target>
머지를 실행하게 되면 IDE에 따라서 다르지만, 아래와 비슷한 화면을 볼 수 있습니다. Current가 머지가 실행되는 브랜치, Incoming이 코드를 가져온 브랜치라는 것을 이해하는 것이 제일 중요합니다.
merge 명령어를 통해서 각 부분을 병합하는 것은 실수를 야기할 가능성이 매우 크므로 다루지 않겠습니다! merge는 꼭 IDE나 다른 툴을 통해서 하는 것을 추천 드립니다. 위 상황에서 Accept Current Change를 누르면 아래와 같이 병합이 됩니다.
머지는 새로운 커밋을 생성하기도 하지만 충돌이 있어 머지가 완료되지 않으면 커밋이 생성되지 않습니다. 충돌이 없다면 아래와 같이
git add .
git push
명령어를 통해서 코드를 바로 올릴 수 있지만 충돌이 있다면 머지를 완료한 후
git add .
git commit -m "merge: test dev"
git push
커밋을 꼭 남겨줘야 push를 할 수 있습니다.
git rebase
merge는 병합이 되었다는 하나의 커밋을 생성하지만 rebase는 각 브랜치가 분리된 분기점 이후로 부터의 모든 커밋을 옮깁니다. 그렇기 때문에 각 커밋을 하나씩 병합하는 과정을 거칩니다.
아무 파일의 내용을 변경해서 test 브랜치와 dev 브랜치에 각각 커밋을 두 개씩 만들어주세요. 그러면 아래와 같은 화면을 볼 수 있습니다.
이제 dev 브랜치의 커밋을 test 브랜치로 가져와 보겠습니다. rebase는 아래와 같이 하는 것이 가장 안전합니다.
git checkout test # 가져올 커밋이 있는 브랜치로 이동
git rebase dev # 가져온 커밋이 추가될 브랜치 이름
충돌이 있기 때문에 아래와 같은 화면을 볼 수 있습니다.
rebase를 진행하는데 충돌이 생겼다는 의미입니다. rebase에는 세가지 옵션이 있습니다.
git rebase --continue # 다음 커밋을 병합합니다.
git rebase --skip # 현재 커밋은 건너뜁니다.
git rebase --abort # rebase를 취소합니다.
git rebase --continue 를 실행하면 아래와 같이 병합되는 모습을 볼 수 있습니다. 우리는 dev의 코드를 가져오고자 하는 것이므로 아래 Incoming을 선택해줍니다.
병합을 진행하지 않고 continue를 실행하면 아래와 같이 진행이 불가능합니다.
병합을 완료하고 나서 git add . 을 해주고 다시 continue를 해주면 아래와 같이 커밋을 작성하는 vi 편집기 화면을 볼 수 있습니다.
위 화면에서 메세지를 변경해주면 rebase시 생성되는 커밋의 메세지도 바꿔줄 수 있습니다.
이제 같은 과정을 반복해서 rebase를 완료하면 아래와 같은 화면을 볼 수 있습니다.
dev의 코드가 test로 옮겨졌으며 dev의 커밋 또한 test로 옮겨졌습니다.
! rebase는 위와 같이 이전 커밋에 가져올 커밋을 얹는 기능이기 때문에 이전 프로세스를 무시하는 일이 될 수 있습니다. 매우 주의해서 사용해주세요!
'GIT > GIT 배워보기' 카테고리의 다른 글
Revert, Cherry pick (0) | 2023.01.28 |
---|---|
Push, Pull (0) | 2023.01.28 |
Commit, Log, Status (0) | 2023.01.28 |
Config (0) | 2023.01.28 |
Stash, Clean (0) | 2023.01.28 |