What is Interactive Rebase [Advanced Tutorial]
Interactive Rebase란?
병합하기 위한 방법 중 하나. (다른 하나는 Merge)
git rebase
git rebase -i
- -i : interactive 옵션
- rebase는 자동으로 작업을 해주는데 -i 옵션을 사용하면 편집이 가능하다.
Interactive Rebase 의 종류
- Pick
- 대상 커밋 선택 (Default)
- Reword
- 커밋 메시지를 변경할 수 있다.
- Squash
- 이전 커밋에 병합
- Drop
- Rebase를 수행하고자 하는 커밋들 중에 선택한 커밋을 삭제할 수 있다.
- Reorder
- Pick하고자 하는 커밋의 순서를 변경할 수 있다.
실습
- 목표 : 여러개로 나눠져 있는 커밋을 합치고자 함.
- 환전 기록 Page UI 및 동작 추가
- 환전 기록 firestore CRUD 구현
- 환율, 날짜 Item 컴포넌트 추가
- 대상 커밋 선택 > Interactive Rebase 버튼 클릭
- 최종적으로 합치고 싶은
커밋 이전의 커밋을 선택하여 Interactive Base 버튼을 선택해야 함.
'환전 기록 Page UI 및 동작 추가'에 이후 커밋들을 squash하고 싶은 경우,
이전 커밋인 '환전 내역 Firestore에서 가져오도록 수정' 커밋 선택 후 Interactive Rebase 버튼 선택. - 원하는 Interactive Rebase 동작을 선택하여 수행
- 처음 화면
- 커밋을 합치고 싶기에
Squash
선택 - GitKraken에서 자동으로 병합되는 마지막 커밋 메시지를 정리해 줌.(Reword)
- 원래 커밋 메시지 (Reword 전)
squash
and 자동reword
후 커밋 메시지
- 'Start Rebase' 버튼 선택
그림은 없지만, 이후로 '환전 기록 Summary UI 및 동작 추가' 커밋을 '환전 기록 Page UI 및 동작 추가' 커밋으로 squash 한번 더 수행 함.
- Rebase 완료 후 커밋 내역
실습 (Advanced)
한번에 squash 작업을 수행
Interactive Rebase 결과물 Remote에 반영
remote git에 이전 커밋 내용들이 들어가 있고 local에서 Interactive Rebase한 후의 결과물을 반영하고 싶은 경우
- 이미 remote repository에 push 해버린 commit들 하나로 합치기
- 사실 권장하는 방법은 아닌걸로 보인다.
- Rebase 설명(git-scm.com) 중 Rebase의 위험성이라는 항목이 있고 그 내용은 아래와 같다.
- Rebase는 기존의 커밋을 그대로 사용하는 것이 아니라 내용은 같지만 다른 커밋을 새로 만든다. 새 커밋을 서버에 Push 하고 동료 중 누군가가 그 커밋을 Pull 해서 작업을 한다고 하자. 그런데 그 커밋을 git rebase 로 바꿔서 Push 해버리면 동료가 다시 Push 했을 때 동료는 다시 Merge 해야 한다. 그리고 동료가 다시 Merge 한 내용을 Pull 하면 내 코드는 정말 엉망이 된다.
- 이미 공개 저장소에 Push 한 커밋을 Rebase 하지 마라
Remote 브랜치 Git 내역
Local 브랜치 Git 내역 (Rebase 작업 결과)
Local 브랜치 'Push'
Local 브랜치는 Remote 브랜치 뒤에 있으니 Pull을 실행하여 Local 브랜치를 업데이트하라고 함.
- Pull (fast-forward if possible)
- Force Push
- Cancel
이런 경우, 'Force Push'를 통해 해당 내용을 업데이트 해줘야 하는데 주의할 점이 있음.
블로그 내용 발췌 (https://json.postype.com/post/209499)
블로그 내용이 오타같음.
아무도 squash '하기 전' commit 들을 pull 하지 않았다는 가정하에 이 작업이 수행되어야 한다.
로 적혀 있어야 할 것 같은데... (이해한게 맞는지 확인이 필요하구먼)
'Force Push 선택' > 경고 문구 표시 (※ 정말 주의해야 함!)
Force push is a destructive action and cannot be undone. Are you sure?
궁금증)
이전 커밋들 내용으로 PR을 요청한 상태인데,
이런 경우 force push를 하고 나면 PR 내용은 어떻게 표시될까?
→ 결론은 PR도 유지되고 변경된 내용도 잘 반영되어 보인다.
Rebase 이전 PR
Rebase 'Force Push' 이후 PR
'프로그래밍 > Git' 카테고리의 다른 글
[Git] Gitmoji를 사용해서 직관적인 커밋 로그를 남기자 (0) | 2021.01.08 |
---|