Bleeding edge

Git pull request with [Rebase and merge] 본문

Git & Github

Git pull request with [Rebase and merge]

codevil 2023. 6. 18. 22:30

오 이런..

 

서론

개발자들이 협업을 하다보면 git conflict를 만나게 된다. 물론 정말 완벽한 순서대로 개발을 하면 문제가 안생길 수도 있지만 항상 완벽한 상황에서 개발을 할 수 있는 것이 아니기 때문에 이 글을 쓰게되었다.

 

Rebase and merge를 사용하는 이유

Pull request를 받는데는 merge, sqush and merge, rebase and merge 세 가지 방법이 있다. 이 방법을 설명하기이 앞서 우선 conflict이 발생하기 위한 상황을 미리 가정해보자. 현재 git log 상황이 다음과 같다고 가정하자.

merge는 F1, F2, M1, M2의 과정을 다시 합쳐주는 commit을 만들어준다.

sqush and merge는 f1, f2에 대한 과정을 모두 없애고 suqush merge라는 브랜치를 만든다

rebase and merge는 f1, f2에 대한 커밋을 모두다 유지하고 M1 M2 F1 F2 이런식으로 모든 commit을 유지한다.(base 만 바꿔서 진행한다.)

이해를 쉽게하기 위한 그림이 다음과 같이 있다.

각 Pull request에 대한 commit을 확인하고 단순한 merge에 대한 commit을 남기지 않기 위하여 rebase and merge를 사용할 것이다.

 

CLI로 Conflict를 가져오기

1. 우선 기능개발을 하고 있는 브랜치로 이동한다. 

2. main branch에서 pull을 받아온다. (이유, main branch와 기능 개발하고 있는 브랜치의 차이를 conflict시켜서 받기 위해서)

2-1. 충돌이 일어난 경우에 다음과 같이 설정한다. 만일 실행 중인 터미널을 끄지 않은 경우에는 config가 유지되는 경우도 있다.

git config pull.rebase true
git pull origin main

 

3. 코드에 표시된 모든 <<<가 섞인 코드(conflict가 일어난 부분에 있는 곳)를 정리한다.

4. 충돌이 변경된 사항을 스테이징한다. rebase branch에서 변경 안된 것을 수정하기 위해서 rebase continue로 추가적인 수정사항이 있나 확인한다.

git add .
git rebase --continue

5. rebase branch에서 feature 브랜치로 이동한 경우

git push origin <feature-branch> --force

브랜치로 강제로 push 한다

 

이미지 출처 : https://stackoverflow.com/questions/2427238/what-is-the-difference-between-merge-squash-and-rebase

 

What is the difference between merge --squash and rebase?

I'm trying to understand the difference between a squash and a rebase. As I understand it, one performs a squash when doing a rebase.

stackoverflow.com