본문 바로가기

SCM/Git

16. Git 브랜치 합치기 - git rebase

 
Rebase
 
아래와 같이 Branch 가 두 가지로 뻗어 나간 경우
 
 
아래와 같이 rebase 한다.
 
$ git checkout experiment
$ git rebase master
  First, rewinding head to replay your work on top of it...Applying: added staged command
 
이 명령은 두 브랜치가 나뉘기 전인 공통 커밋으로 이동하고 나서
 
그 커밋부터 지금 Checkout 한 브랜치가 가리키는 Commit 까지 
 
diff 를 차례로 만들어서 어딘가에 임시로 저장해 놓는다.
 
그리고 rebase 대상이 되는 branch 에 이를 차례로 적용하고
 
이렇게 합쳐진 위치로 현재 branch 를 가리키게 한다.
 
 
그리고 나서 master branch 를 Fast-forward 시킨다.
 
$ git checkout master
$ git merge experiment
 
결과적으로 아래와 같이 된다.
 
 
 
 

Rebase 의 위험성
 
간단히 말하면 아래와 같다.
 
Push로 리모트에든 밖으로 내보낸 커밋에 대해서는 절대 Rebase 하지 말아야 한다.
 
 
  1. 먼저 초기의 상황이다. 내가 서버에서 데이터를 받아 몇 개 커밋했다.
 
 
2. 이 상황에서 Bob 이 이 데이터를 서버에 데이터를 올렸기에 내가 다시 fetch 해서 merge 했다.
 
 
3. 근데 Bob 이 Merge 한 것을 되돌리고 다시 Rebase 한다.
 
  그리고 서버의 히스토리를 git push --force 명령을 사용해 덮어씌웠다.
 
  이 상황에서 내가 fetch 받았다면 아래의 상황이 된다.
 
  
 
4. 결국 내 PC 에는 아무에게도 쓸모 없는 C4 , C6 가 남아있는 채로 fetch 되게 된다. 헬이다..
 
 
 

Merge vs Rebase
 
아래는 Merge 와 Rebase 의 차이점이다.
 
Origin
 
Merge
 
Rebase