feature/dijkstra 브랜치에서 작업하던도중 전체적인 폴더 및 파일의 이름을 PEP 8 – Style Guide for Python Code에 맞춰 작성하기 위해 rename하려고 main 브랜치에서 변경하고 feture/dijkstra에도 적용하기 위해 Sourcetree에서 Rebase + Merge 로 깔끔한 브랜치 라인 유지하기를 참고해서 rebase, merge를 진행했는데 아래 사진처럼 feture/dijkstra와 origin/feature/dijkstra가 나눠지게 되어서 Pull, Push가 안되는 상황이 생겨서 검색하고 수정한 뒤 알게된 내용을 정리하고자 작성하게 되었습니다.

새로운 repository에서 테스트를 하기 위해
Github에 새로운 Repository를 하나 만들고 URL을 복사해서 Sourcetree에 Clone 합니다.


Sourcetree에서 직접 생성하고 원격에 업로드합니다.
위에 브랜치 버튼을 클릭하고 Local 브랜치를 생성합니다.

생성된 develop 브랜치에 우클릭하여 origin에 Push 합니다.


Github에 가서 확인해보면 remote branch가 생성되었습니다.

똑같이 feature/a와 feature/b 브랜치도 생성해줍니다.

예시로 알아보겠습니다.
다음과 같이 feature/a와 feature/b 그리고 develop으로 이뤄진 branch들이 있습니다.

rebase:
feature/a를 rebase해보겠습니다.
왼쪽 브랜치에서 a에 더블클릭하면 checkout되고 rebase할 위치를 우클릭해서 재배치(rebase)를 클릭합니다.

feature/a가 해당 위치로 rebase 되었습니다.

develop 브랜치에 merge 하기 위해서는
develop 브랜치로 checkout하고, feature/a에 우클릭하여 현재 브랜치로 feature/a를 병합을 클릭합니다.

feature/a가 develop에 merge되었습니다.

develop에 checkout하고 feature/b의 위치에 우클릭 후 병합(merge)을 클릭하고

fast-forwar가 가능해도 새 커밋으로 생성을 체크 한 후 확인 버튼을 클릭합니다.

빨간선이 사라지지 않고 그대로 merge됩니다.

다 사용한 브랜치 feature/a는 삭제해줍니다.
feature/a가 아닌 다른 브랜치로 checkout한 뒤 삭제합니다.


삭제되었습니다.

feature/b에서 feature/a와 dev에서 작업한 내용을 바탕으로 계속 작업해야 한다고 하자.
아래 사진을 보면 feature/b로 checkout된 상태에서 Pull 1개, Push 4개가 있다.
그리고 Local 저장소의 feature/b와 달리 원격 저장소인 origin/feature/b는 아직 그대로 있는 것을 확인할 수 있다.

Github repository의 원격 브랜치(origin/feture/b)를 확인해봐도 그대로 현재 b1 파일만 있는 상태이다.

그래서 원격 저장소에 Push를 해주려고 했더니 에러가 발생했다.


Rebase는 일반 Push로는 할 수 없고 강제로 Push 해야합니다.
Rebasing 변경 사항을 강제로 Push하는 이유는 Rebase 작업이 Commit history를 변경하고 새로운 Commit을 만들기 때문입니다.
강제 Push를 하기 위해서는 Sourcetree에 도구 - 옵션에 들어가서 강제 푸시 기능을 체크해줘야 한다.

Push를 누르고 강제 푸시를 체크하고 Push를 하게 되면 정상적으로 원격 저장소에 Push 된다.



Github repository의 원격 브랜치 (origin/feature/b)

그리고 강제 Push는 주로 개인 작업 브랜치에서 사용되고, 이미 공유된 브랜치에서는 주의해서 사용해야 합니다.
협업 중인 프로젝트에서는 가능한한 강제 Push를 피하고, 변경 사항을 다른 방법으로 공유하거나 협의하는 것이 좋습니다.
그래서 다시 강제 Push 옵션은 꺼놨습니다.
rebase는 새로 발생한 브랜치(feature)에 체크아웃 한 상태에서,
merge는 뼈대가 되는 중심 브랜치(develop)에 체크아웃 한 상태에서 진행해야 합니다.
지금 생각하면 아주 기본적인 내용인 branch와 merge에 관한 내용을 정리하고 이해하게 되서 기쁩니다.
branch에 관해 또 알게되는 부분이 있으면 공부하고 내용을 기록하겠습니다.
[Git] SourceTree 원격저장소 브랜치 사용법 (생성부터 병합까지!)