이번 프로젝트의 commit & push 규칙 중 눈여겨볼 사항이 있다.
팀원들과 같이 화면공유로 작업할 때 이번 단계에서 많이 헤맸기 때문에 본격적인 기능 개발에 들어가기 전에 연습장에 어떻게 해야 하는지 풀어볼 생각이다.
해당 실험은 깃, 깃허브, 리퍼지토리가 연동된 인텔리제이에서 진행한다.
깃 주소: https://github.com/2384320/TestGit
@SpringBootApplication
public class TestMergeApplication {
public static void main(String[] args) {
SpringApplication.run(TestMergeApplication.class, args);
}
}
해당 매인 Application class에서 주석으로 추가 및 수정 코드를 집어넣으면서 실험해볼 것이다.
@SpringBootApplication
public class TestMergeApplication {
public static void main(String[] args) {
SpringApplication.run(TestMergeApplication.class, args);
// main 브랜치의 추가 코드
// main 브랜치의 추가 코드 2
}
}
@SpringBootApplication
public class TestMergeApplication {
public static void main(String[] args) {
SpringApplication.run(TestMergeApplication.class, args);
// sub 브랜치의 추가 코드
// sub 브랜치의 추가 코드 2
// sub 브랜치의 추가 코드 3
}
}

이때 main 브랜치의 feat 2 commit의 경우 remote 상태의 commit, 즉 내가 아닌 누군가가 수정하여 이미 remote 상태로 올려둔 commit이다.
그렇다면 sub 브랜치와 main 브랜치를 merge하기 전에 main 브랜치를 최신 상태로 만들어야 한다.
현재 브랜치를 최신 상태로 변경한다.
그러므로 현재 브랜치 설정이 중요하다.
현재 브랜치를 main으로 둔 후 Update Project를 누르면 된다.

[현재 브랜치가 main이 아닐 때]
main 브랜치에 우클릭 > Checkout


우측 상단의 Update Project 클릭 > merge incoming changes into the current branch
만약 remote commit과 local commit이 충돌난다면 merge와 rebase 중 선택 가능함.
+) merge vs rebase
merge: 두 개 이상의 개발 히스토리를 하나로 합치는 작업
rebase: 브랜치의 베이스를 재설정화하여 다시 커밋을 재적용하는 작업
merge: 변경사항 충돌
rebase: 이미 원격에 저장된 브랜치 해결, 데이터 손실
-> 원격 저장소에 올라간 커밋은 리베이스 하지 말기
팀 규모가 커질수록 merge를 사용하는 것이 안정적이긴 하지만, 이 또한 답은 아님.
main 브랜치가 최신 상태가 되었으니, 이제는 sub 브랜치의 내용을 main 브랜치의 내용과 합칠 차례이다.

[현재 브랜치가 sub가 아닐 때]
sub 브랜치에 우클릭 > Checkout

main 브랜치에 우클릭 > Merge 'main' into 'sub'

만약 main 브랜치와 sub 브랜치에서 충돌이 발생하면 Conflicts 창이 뜨게 된다.
이때 merge하기 위해선 conflicts를 해결해야 한다.
Merge 클릭

다음처럼 가운데의 코드에 merge할 코드를 작성할 수 있으며, 양쪽의 코드를 이용해 작성이 가능하다.
conflicts 해결 후 Apply 클릭

해당 상태에서 sub 브랜치를 push하게 되면 merge한 코드가 sub 브랜치로 이동하게 됨.

push 진행
그리고 PR을 작성하여 sub 브랜치를 main 브랜치로 합치도록 한다.

해당 단계에서 sub 브랜치를 삭제하면 깔끔하게 main 브랜치만 남도록 할 수 있고, main 브랜치에는 sub 브랜치에서 수정한 내용이 담기게 된다.