$git merge feature master (컴공에서는 항상 A <- B 이런식이다) 즉, feature에 master를 갖다붙임
git merge가 git rebase에 비해 non-destructive method이라 여겨지는데, 왜냐하면 기존의 브랜치들이 영향을 받아서 바뀌지 않기 때문이다.
하지만, 이 방법은 master가 만약 active하게 계속 업데이트가 되는 상황이라면, 계속 feature브랜치가 새로운 커밋을 git merge해야하기 때문에 나중에 브랜치 히스토리를 복잡하게 만들 수 있다. git log 명령어로 조금 덜 복잡하게 만들 순 있지만 다른 개발자들에게 직관적인 브랜치 히스토리를 주지 못한다. (리뷰할때)
Rebasing
Merging의 대안으로rebasing 명령을 사용하여feature 브랜치를master브랜치로리베이스 할 수 있습니다.
git rebase를 하면 마치 순차적으로 master를 업데이트 하고 있던 것 처럼 보이게 만들 수 있습니다.
아래 그림과 같이 feature를 master 뒤에 연결함으로써 마치 처음부터 순차적으로(sequentially)하게 작업한 것과 같은 타임라인을 지니게 할 수 있습니다. 대신 commit history가 하나로 묶여지게 되죠. (마스터로 )
c3' 라는 복사본이 main의 위에 (main의 tip) 연결이 되고 c3는 희미하게 트리에 기록이 남아있습니다. 하지만 이 작업은 내 로컬 PC에만 작용이 된 것이기 때문에 remote에도 반영을 해줘야 합니다.
이렇게 main으로 checkout한 뒤에 rebase를 진행해줍니다.
그럼 아래 그럼과 같이 main과 bugFix가 같은 마지막 커밋 위치(HEAD)로 이동함을 알 수 있습니다.
즉, main이 앞으로 fast-forward되었습니다. (fast-forward는 아래 참조)
fast-forward란?
bugFix 브랜치를 만들고 작업하면서 그동안 master에 아무런 변화가 없었다면 master 브랜치의 HEAD를 bugFix 브랜치에 간단히 옮기기만(2가지 방법이 있음: git merge or git rebase) 해도 아무런 충돌없이 진행이 가능합니다. 그저 master 브랜치를 이동시키기만 해도 된다고 하여 fast-forward라고 부릅니다. 이동시키는 방법은 bugFix에서 $git rebase master 또는, $git merge master 를 하면 됩니다. 그럼 알아서 master의 HEAD를 옮기기만 합니다.
여기서는 내 정리)
하지만, 만약 master 브랜치가 계속 업데이트가 되어 바뀌었다면 fast-forward가 되지를 않습니다. 그래서 merge나 git rebase를 하게 되면 commit이 발생하게 되어 commit message를 입력하여야 합니다. 밑에 글 (스크롤 내려서) 참조: 서로 다른 브랜치 병합하기 부제목
Pull 을 해도 충돌 에러가 발생하면 아래와 같이 Synchronize 탭을 열어서 수동으로 코드를 병합해주고 (오른쪽이 remote에서 받아온 코드인데 이걸 왼쪽에 복붙해서 합쳐주고 저장) 이제 add to index -> commit (commit message 입력) -> pull 받으면 정상으로 해결이 된다.