티스토리 뷰
Git의 rebase --interactive (또는 간단히 rebase -i) 기능은
브랜치의 커밋 히스토리를 재정렬하거나 수정할 수 있는 강력한 도구입니다.
이를 통해 커밋을 수정, 삭제, 합치기, 분할하거나 순서를 바꿀 수 있습니다.
주요 명령어는 6가지
- pick: 커밋을 그대로 유지합니다.
- reword: 커밋 메시지를 수정합니다.
- edit: 커밋을 수정합니다. 이를 선택하면 해당 커밋에서 작업을 멈추고 수정할 수 있습니다.
- squash: 이전 커밋과 합칩니다. 두 커밋의 메시지를 병합할 수 있습니다.
- fixup: 이전 커밋과 합치되, 커밋 메시지는 유지하지 않습니다.
- drop: 커밋을 삭제합니다
[ Fork ]
GUI 툴인 Fork 로 실습을 해보겠습니다.
pick 은 유지이기 때문에 실습에서 제외하겠습니다.
Rebase 는 원하는 커밋의 이전 커밋 (parent) 을 지정해서 하는데,
포크는 원하는 커밋을 선택하면 알아서 이전 커밋으로 위치 지정을 해주는 단축메뉴를 제공합니다.
위처럼 단축메뉴 사용해도 되고
원칙적으로 이전 커밋 눌러서 Interative Rebase 눌러줘도 동일합니다.
[1] fixup > 커밋 흡수시키기
상황)
뉴진스앱 만든다고 해보자.
공통으로 쓰는 MemberView 를 추가하고 MinjiView 를 추가했다.
근데 MemberView 의 폰트변경이 필요해서 추가커밋했다.
폰트변경 히스토리를 리뷰어가 알 필요가 없다.
'MebmerView 추가 커밋' (f20918a) 으로 'MemberView 의 폰트변경 커밋' (dbb37a2) 을 넣어버리자.
수정할 커밋 바로 아래의 커밋을 기준으로
Interactive Rebase 를 누른다.
Fixup 은 Previous 커밋에만 가능하기 때문에
커밋을 아래로 이동시켜주고 (드래그드랍)
Fixup 을 선택해준다.
Rebase 버튼 눌러주면 원하는 커밋 히스토리로 잘바뀐 것을 볼 수 있다.
커밋 ID는 바뀌고 메타 정보 (시간) 은 남아있다.
그 위의 커밋도 다시 쌓아주는 셈이라서 ID가 같이 바뀌지만 메타 정보는 그대로다.
(아래 실습하는 다른 명령어들도 모두 동일하게 위의 커밋 ID들이 다 바뀐다.)
[2] squash > 커밋 합치기
상황) padding 커밋 여러개를 하나로 합치고 싶다.
바로 아래 커밋에서 Interactive Rebase 를 선택해주고
스쿼시도 떨어져있는 커밋은 안되기 때문에
trailing padding 커밋의 위치를 이동해주고 3개 squash, 가장 밑은 reword 를 선택해서 통합 커밋 메세지를 작성해준다.
(참고로 fixup과 다르게 commit description 에 합친 커밋 메세지들이 쭉 나오는데 저는 지운 것임!)
깔끔하게 하나로 잘 합쳐짐!
[3] Drop > 커밋 삭제
상황)
중간에 있는 커밋을 제거하고 싶다.
Interative Rebase 창 열어주고 Drop 누르면
잘 지워짐.
[4.1] edit > 커밋 작업내용 바꾸기
상황) MemberView 커밋이 중간에 있다. 해당 커밋의 작업내용을 바꾸고 싶다!
Interative Rebase 창 열어주고 Edit 누르면
작업내용, 커밋메시지를 다 변경할 수 있도록 나온다.
여기서 Circle 을 Rectangle 로 바꾸고
Amend Last Commit > Continue Rebase 를 눌러주면
아무일 없었다는 듯이 중간 커밋의 작업내용이 잘 바뀌었다.
[4.2] Edit > 커밋 쪼개기
상황) 마음을 바꿔서 padding 커밋을 horizontal, veritcal 로 나누고 싶다
Interative Rebase 창 열어주고 Edit 누르고
첫번째 커밋은 vertical 로 커밋메시지 바꾸고 ammend commit
두번째 커밋은 horizontal 로 커밋메세지 해주고 commit (amend 선택하면 이전 vertical 수정사항까지 다 나와서 안눌러줌!)
Continue Rebase 해주면
커밋 잘 나눠진 것을 볼 수 있음.
[5] Reword > 커밋 메세지 변경하기
상황)
커밋 메세지에 오타있어서 수정하고 싶음
[ 정리 잘된 블로그 ]
https://wormwlrm.github.io/2020/09/03/Git-rebase-with-interactive-option.html#edit
'💻 > Git' 카테고리의 다른 글
[Git] local/remote/merged 브랜치 목록 조회 명령어 (0) | 2021.04.01 |
---|---|
[Git] Gitignore 파일 만들기 (1) | 2020.12.04 |
[Git] remote repository를 특정 커밋으로 초기화시켜주기 (0) | 2019.06.29 |
[Git] Merge vs Rebase 커밋내역 비교 (0) | 2019.05.28 |
[Git] 명렁어 정리 (0) | 2019.03.31 |
- Total
- Today
- Yesterday
- DRF APIException
- Dart Factory
- 플러터 얼럿
- SerializerMethodField
- 구글 Geocoding API
- PencilKit
- Python Type Hint
- flutter build mode
- ipad multitasking
- 장고 Custom Management Command
- 플러터 싱글톤
- flutter 앱 출시
- 장고 URL querystring
- Flutter Clipboard
- Flutter getter setter
- flutter deep link
- Flutter Text Gradient
- Flutter Spacer
- Django Firebase Cloud Messaging
- Django Heroku Scheduler
- Django FCM
- cocoapod
- github actions
- Watch App for iOS App vs Watch App
- drf custom error
- flutter dynamic link
- METAL
- Sketch 누끼
- ribs
- Flutter 로딩
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |