반응형

What is Interactive Rebase [Advanced Tutorial]

https://youtu.be/JkpYvXdbnfQ

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가 장점이 많은 기능이지만 단점이 없는 것은 아니니 조심해야 한다. 그 주의사항은 아래 한 문장으로 표현할 수 있다.이 지침만 지키면 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

반응형

+ Recent posts