본문 바로가기
Front-End/git

rebase와 merge

by kk님 2023. 8. 20.

원격 저장소가 바뀌었는데도

그냥

git rebase origin/main

 을 하면 변화가 없다

 

git fetch origin

을 해야, 정보를 가져오고 그것으로 rebase를 진행

 

git merge

: A 브랜치를 B 브랜치로 합치려 할 땐, A 브랜치를 체크아웃(들어감) 상태에서 git merge B를 입력

 

처음 머지커밋 하실 때

jimin 브랜치에서

git merge hojin

충돌을 해결한 뒤

git commit을 하면 된다. => 머지 커밋이 생기는데, 이걸 수정하면 안됨! 그냥 놔둬야 한다.

(jimin|MERGING) 이 사라지게 된다.

 

내가 헷갈린 점

checkout한 브랜치가 B일 때(그러니까 지금 작업중인 브랜치가 B)

git rebase A를 하면

A 위에 B의 작업물(commit)이 쌓이게 된다. (이전에는 두루뭉술하게 A와 B가 합쳐진다고, 혹은 B에 쌓인다고 생각했었는데..)

B의 커밋들은 재배치 된다.

A가 새로운 base가 되는 것

 

merge와 rebase 차이

1.일반 merge의 경우 merge commit이 생성되(기도 한다. upstream 코드와 conflict이 발생하면)

2. 머지커밋을 만들지 않으려고 rebase를 한다. rebase를 하면 머지커밋이 생성되지 않음

 

만약 브랜치에서 커밋을 2번 했다면??

 

15-t에서 16 commit
15-t에서 git rebase origin/main

-----

main에서 git rebase origin/main 한 상태


깃허브 PR을 merge할 때 merge 방식이 3가지가 있다. (merge, squash, rebase)

이때 (기본)merge를 하게 되면 merge commit 이 생성되면서, 위의 그래프 모양과는 다르게 그래프가 예쁘게 합쳐진다. 

나름대로 궁금증에서 내린 결론

1. 왜 main으로 간 다음 rebase를 하는 것일까

git switch main

git fetch upstream

git rebase upstream/main

하는 이유.. 일단 메인을 최신화.한다. 작업을 시작할 때 최신것으로 작업 하기 위해

그리고 내가 작업하다가 다른분이 작업 후 내가 받은 upstream/main이 변경된다면 rebase를 다시 해야된다.

 

2. PR 후에, conflict가 발생했다. merge commit을 생성하고 싶지 않아..... 그럼 방법이?

git fetch upstream

git merge upstream/main

우선 이렇게, merge를 하면 upstream에 변경분이 있는데 내 코드와 conflict가 발생했을 때 merge commit이 생성된다.

merge conflict를 해결한 후, git commit을 하면서 Merge에 관한 커밋이 새로 생성되기 때문

이는 PR에서 바로 보인다.

앗 나의 머지 커밋

 

git rebase upstream/main

그렇지만 rebase를 하면 upstream에 변경분이 있더라도 conflict를 수정하기만 하면 그냥 merge commit 없이 잘 반영된다.