본문 바로가기
Git

[Git 깃] git rebase 위험성

by 까망 하르방 2022. 5. 22.
반응형
Rebase 위험성

Rebase는 Merge 보다 commit history를 깔끔하게 해서 유용하지만

rebase 과정에서 생겨나는 커밋은 내용은 같지만 새로운 커밋이기에

다른 사람과 협업하는 경우 곤란해질 수 있다.

 

[Git 깃] git rebase

Rebase란? • rebase는 "re" + "base" 로 재배치 하는 것이다. • merge와 비슷한 개념이지만 commit history 결과 차이가 있다.    rebase가 commit history 깔끔하게 정리해주는 편이다. • rebase는 commit..

zoosso.tistory.com

 

 

시뮬레이션

[My Computer]에 원격 저장소를 clone 하였다.

[master]에서 C2C3 작업을 하였다. 

git rebase 위험성

 

 

다른 팀원들이 C4C5C6 작업하여 서버에 push 되었다.

(C6 은 merge commit 이다.)

서버에서 pull (fetch + merge) 하여 C7이 만들어졌다.

(C7은 merge commit 이다.)

git rebase 위험성 흐름

 

 

push 하였던 팀원이 C4C6 를 rebase 한다.

rebase 결과 C4' 를 git push --force하여 원격 서버에도 반영되었다.

[teamone/master]는 C4'를 바라보게 된다.

git rebase push

 

 

[master] git pull (fetch + merge)하여 C8 만들어진다.

git log로 보면 날짜/저자/메시지가 같은 C4C4' 가 보인다.

(C4 C4'는 내용물은 동일하지만 Hash 값이 다른 커밋이다.)

git rebase 위험 사례

rebase된 C4C6 는 모든 팀원이 포함하지 말아야 한다.

하지만 이대로 push 하게 된다면 혼란이 가중된다.

• 공개된 commit을 rebase 시 문제가 발생할 수 있다.

• rebase 해야 할 commit 들은 push 하기전에 로컬에서 처리하면 좋다.

• 비공개 작업 내용은 rebase 해도 문제 없다.

 

 

Rebase 한 것을 다시 Rebase

rebase 하였다면 다른 사람들도 해당 내용을 반영하면 좋다.

Git에서는 커밋 SHA 체크섬 외에도 커밋 patch 할 내용으로

SHA-1 체크섬을 한번 더 구한다. → patch-id 라고 한다.

 

한 팀원이 다른 팀원이 의존하는 커밋을 없애고

Rebase 한 커밋을 다시 Push 함 상황에서

merge 대신 git rebase teamone/master 명령을 실행해 볼 수 있다.

 

 

git rebase 해결방법

 

• 현재 브랜치에만 포함된 커밋을 결정 → C2, C3, C4, C6, C7

• merge 커밋이 아닌 것 결정  C2, C3, C4

• 이 중 merge할 브랜치에 덮어쓰이지 않은 커밋을 브랜치에 적용

     C4는 C4'와 동일한 Patch로 → C2, C3

     C4와 C4' 커밋 내용이 완전히 같을 때만 이렇게 동작

        커밋 내용이 아예 다르거나 비슷하다면 커밋이 두 개 생긴다

 

다른 방법으로는 git rebase --rebase 명령으로

 git fetch hgit rebase teamone/master 명령을 순서대로 가질수도 있다.

→ config설정으로 기본 설정도 가능하다.  git config --global pull.rebase true 

 

 

 

[까망] Git 목록

본 블로그에 작성된 Git 관련 내용 URL을 정리한 곳입니다. 목록 [Git] "git add -p" 를 활용하는 이유 [Git] .gitignore 설정 [Git] learngitbranching 답안 및 풀이 - 1 [Git] learngitbranching 답안 및 풀이 -..

zoosso.tistory.com

반응형

'Git' 카테고리의 다른 글

[Git 깃] git revert  (0) 2022.07.31
[Git 깃] git reset  (0) 2022.07.29
[Git 깃] git rebase  (0) 2022.05.17
[Git 깃] git config  (0) 2022.05.11
[Git 깃] git cherry-pick  (0) 2022.05.08

댓글