Git Rebase( + 충돌 해결)
Git Rebase란?
현재 브랜치의 base를 타겟 브랜치의 최신 커밋으로 변경합니다.
위 사진은 C1을 베이스로 feature브랜치에서 새로운 기능을 개발중에 있을 때 main브랜치에도 여러 작업이 쌓여 C6에 가있는 상황입니다.
이 때, feature브랜치의 base를 main브랜치의 최신 commit으로 재설정 하고자 할 때 rebase기능을 이용합니다.
(merge를 할 수도 있지만 의미없는 merge commit이 섞이게 되어 히스토리를 알아보기 힘들게 만듭니다. - 장단점이 있음)
HEAD를 feature로 이동시킨 후 git rebase main 명령어를 입력하면
위와 같이 커밋 트리가 재정렬됩니다. 이는 즉 현재 작업하는 브랜치를 대상 브랜치의 HEAD에서 분기된 브랜치로 간주하겠다는 뜻이기도 합니다.
이 상태에서 main branch의 헤드를 fast-Forward하여 feature로 옮겨주면 됩니다.(main merge feature)
유의사항 - 1
내가 작업하고 있는 branch의 base를 공유되고있는 브랜치로 변경시키는 것은 가능하지만
공유되고 있는 base를 내가 작업하고 있는 브랜치의 뒤로 이동시키면 안됩니다.
이와 같은 상황에서 main브랜치의 base를 feature브랜치로 이동시키면 안된다!!
큰일난다!
유의사항 - 2
원격 저장소에 Push된 커밋에 대해서는 Rebase하면 안된다.
[Git] Branch 병합 전략(Merge, Rebase, Squash) 개념/예제 (tistory.com) 의 설명내용을 좀 더 자세하게 표현해보았습니다.
remote을 클론하여 커밋 2번을 했을 때 상황입니다. 팀원이 remote를 클론하여 브랜치작업을 진행합니다.
브랜치작업을 main에 merge한 뒤 remote에 push합니다. git pull을 통해 remote를 가져와 새 커밋을 생성합니다.
이 때, 팀원이 remote에 push한 merge한 커밋을 되돌리고 rebase하고 다시 push합니다.(이 경우가 아니라도 rebase에 의해 커밋 순서가 변경되거나 추가삭제가 되는 등 커밋 히스토리가 변경됩니다.)
팀원이 변경한 remote를 다시 pull했을 때 local은 위와 같은 구조 가지게 됩니다. A3와 A3'는 내용이 겹치게되고 A5는 삭제된 커밋인데 존재하게 됩니다.
conflict Test
일단 충돌을 내기 위해 main브랜치와 feature브랜치에서의 작업 도중 같은 파일을 건드립니다.
Feature브랜치의 Main.java 파일의 내용은 // feture이고
Main브랜치의 Main.java파일의 내용은 // main입니다.
Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
feature브랜치의 base를 main의 최신커밋으로 rebase하려고 하면 위와 같은 메시지가 뜰텐데 세 가지 선택지가 존재합니다.
1. 충돌을 해결한 뒤 git rebase --continue를 입력한다.
2. "git rebase --abort" : rebase를 취소한 뒤 호출 이전의 분기 상태로 되돌린다.
3. "git rebase --skip" : 커밋을 완전히 건너뛴다.
해결하기 위해 git status를 입력해보면 충돌이 발생한 파일을 알려주는데 이를 열어보면
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
<<<<<<< HEAD
// main
=======
// feature
>>>>>>> fa9301b (feature)
}
}
다음과 같이 <<<<<<<<<< ===============로 표시해줍니다.
Intellij에서는 이런 충돌 파일을 고치기 쉽게 기능을 제공해줍니다.
위 창에 충돌난 파일과 Resolve 라고 파란색 글씨가 보일겁니다. 클릭하면 아래 화면으로 넘어갑니다.
가운데 본 파일에 최종반영할 내용을 입력하여 해결하면 됩니다!
충돌을 해결한 뒤 git rebase --continue를 입력합니다.
위 과정을 반복하여 충돌을 해결합니다.(git status로 다음 충돌을 확인)
-> 하나하나 순차적으로 해결해야함
[Git] Branch 병합 전략(Merge, Rebase, Squash) 개념/예제
이번 포스팅에서는 Git 브랜치 병합 전략에 대해 포스팅하려 한다. 평소에 Git을 사용하며 Merge만 거의 사용해서 브랜치를 합쳤는데 이렇게 하니 히스토리가 지저분해진 것을 보고 Rebase와 Squash에
cjw-awdsd.tistory.com