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 하지 말아야 한다.
- 먼저 초기의 상황이다. 내가 서버에서 데이터를 받아 몇 개 커밋했다.
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
|
'SCM > Git' 카테고리의 다른 글
18. Git 허브 (0) | 2020.01.28 |
---|---|
17. Git 브랜치 태깅하기 - git tag (0) | 2020.01.28 |
15. Git 브랜치 합치기 - git merge (0) | 2020.01.23 |
14. Git 브랜치 만들고 이동하기 - git branch, git checkout (0) | 2020.01.23 |
13. Git 완료된 커밋과 비교 - git diff (0) | 2020.01.23 |