[Github + GitKraken] GitKraken으로 브랜치 관리 및 Rebase + Conflict 해결 하기

Ogu·2024년 4월 10일
1

Git/Github + GitKraken

목록 보기
2/2

🦕 본 자료는 학교에서 운영중인 IT 서비스 개발 동아리에서 멘토링을 위해 제작한 자료입니다.
직접 Mybatis 프로젝트를 Github + GitKraken을 통해 협업하면서 발생한 Issue를 해결하는 과정에서 얻은 깨달음을 담으려고 노력했습니다.
https://coming-soon.oopy.io/2e1c3a96-f489-436c-bcc4-5a85b2b3ae7b

🗂️ 브랜치 관리하기

GitKraken 공식 문서 - Branching and Merging with GitKraken Client | Git Branching

🧩 브랜치 만들기


특정 브랜치 및 commit에서 파생 브랜치를 만들고 싶다면 해당 브랜치 또는 커 우클릭 → Create branch here 을 클릭합니다.

그럼 위와 같이 생성할 branch의 이름을 입력하면 내 local 환경에서 새로운 브랜치가 생성됩니다.

🧩 브랜치 기본 merge 하기


위와 같이 1. 오른쪽 마우스를 클릭하여 merge할 수도 있고, 브랜치를 드래그하여 merge할 수도 있습니다!

병합의 가장 기본 형태인 merge는 파생된 브랜치가 작업을 마치고 돌아오면 다른 브랜치와 합칠 때 커밋 이력 전체를 모두 남깁니다. (따라서 단순한 가장 기본 형태의 merge는 권장하지 않아요!)

💡 하지만 Merge만 사용할 경우 서로의 commit들이 얽히기 때문 커밋 그래프가 더 복잡해지고 확인이 어렵게 됩니다. 그래서 squash와 rebase로 커밋 그래프를 단순화 하고 깔끔하게 관리할 수 있습니다.

🧩 merge conflict결하기


만약 서로 다른 브랜치에서 같은 부분을 수정하고 합치려 한다면, 당연히 충돌 즉 conflict 가 발생할 것입니다.

conflict 는 한국어로 충돌 이라고 하는데, 한국말의 어감으로는 참 무섭고 피해야 할 것 같은 느낌이 듭니다. 하지만 협업에 있어 conflict는 불가피하고 당연한 일입니다. 두려워 하지 마세요!

GitKraken에서는 편리하게 이를 해결해 줄 수 있도록 하는데, 양쪽에서 어떤 부분에서 충돌이 났는지 보여줍니다. (깃크라켄 찬양해!!😆)

우리는 단지 파일을 처음부터 끝까지 천천히 살펴보며 살릴 부분을 체크하여 아래의 Output에 반영한 후 오른쪽 위의 Save 버튼을 누르면 됩니다.

🧩 rebase + conflict 해결하기


상황은 다음과 같아요.

A는 main 브랜치에서 feature/branch1 을 파생시켜 작업중이고, B는 main 브랜치에서 feature/branch2 를 따서 작업을 하고 있었어요.

그런데 A가 기능 개발이 먼저 끝나서 main 브랜치에 pull request를 보내 다시 main에 merge를 했습니다.

B는 이 A가 main에 merge한 기능을 자신의 브랜치에 당겨와서 작업을 하려 해요.

하지만 작업 중인 B의 local환경에서, feature/branch2 브랜치의 원천 브랜치인 main의 base는 아직 A가 merge하기 이전의 상태일거에요.

이렇게 remote main브랜치의 변경사항을 현재 내 local feature 브랜치에 반영해서 작업하고 브랜치 및 커밋 관리를 깔끔하게 하기 위해서 rebase를 사용해요.

(rebase는 말 그대로 내 브랜치의 파생 기원 브랜치의 base를 다시 설정하는 거에요.)

B는자신의 base를 A가 merge한 시점 이후로 옮기고 (rebase), 그 이후의 자신의 commit들을 merge하게 되는거죠.

⚠️ 이때 주의할 점은 내 local의 main을 remote환경의 main과 동기화한 상태에서 rebase를 해야겠죠?

  1. 우선 병합 대상 main 브랜치의 local 환경을 remote 환경과 동기화

    (main브랜치가 local환경의 노트북 모양과, remote 환경의 내 프로필 모양 두개가 있어요. 또한 브랜치 모양을 보면 나의 브랜치는 아직 이전 local main에서 파생되어 base가 A가 커밋하기 이전이죠? 즉 아직 A가 작업하여 merge한 이력을 내 local 브랜치에 당겨오지 못한 상태에요.)

위와 같이 main 브랜치의 local 환경을 remote와 동기화시키면 아래와 같이 main브랜치가 하나만 보이며, 노트북 모양과 내 프로필 사진 모양이 같이 나타나고 있어요.

  1. 다시 내가 병합시키고 싶은 내 작업 feature 브랜치로 체크아웃 하고, 병합 대상 브랜치 main 우클릭, Rebase {내가 병합할 브랜치} onto main 을 누릅니다. (내 브랜치의 base를 remote환경과 동기화시킨 local main브랜치 위로 옮긴다는 뜻이겠죠? 영어를 찬찬히 음미해보세용..)

헉, 그런데 A와 같은 부분을 작업하여 conflict가 일어났어요! A가 작업한 내용은 왼쪽이고, 제가 이번에 merge할 내용은 오른쪽이에요! 내가 작업한 내용으로 최종적으로 merge시킬 것이므로 오른쪽 박스를 선택하고 Save를 누릅니다.

Rebase는 커밋 단위로 merge돼요! 따라서 Rebase할 경우 각 커밋마다 충돌이 있으면 어떤 쪽을 선택할지 물어볼거에요! 내가 최종적으로 적용할 부분을 선택하여 저장해주면 됩니다~!

Continue Rebase를 눌러요~!

결과를 볼까요?

우리가 원했던대로 A 가 Merge한 이후의 시점으로 base를 옮겨(rebase) rebase하는데 성공했어요~!

아래 rebase 전후 브랜치 모양의 차이를 보면 이해가 확 될거에요~!

A의 merge내용 내 브랜치에 rebase(반영) 이전의 모습 🆚 rebase로 A의 merge내용 이후로 base를 위로 당긴 모습

rebase를 하고 merge를 하면 브랜치 모양이 여기저기서 뻗어나오지 않고 main브랜치 하나에서 작업이 된 것 처럼 깔끔하게 관리할 수 있어요.

🧩 squash 하기


여러개의 commit을 하나로 합치는 squash는 합치고 싶은 커밋들을 shift 또는 ctrl로 복수 선택한 후 오른쪽 마우스 → Squash N commits 를 눌러 합칩니다.

🔗 참고

GitKraken Client Support & Documentation

Git Squash with GitKraken Client | How to Git Squash

개발 협업에서 깃 & 깃크라켄 사용하기

[git] GitHub + GitKraken 작업환경

[Git] Merge, Squash, Rebase 이해하기

profile
私はゲームと日本が好きなBackend Developer志望生のOguです🐤🐤

0개의 댓글