-
특정 commit 삭제하기⏰ 오늘의 공부/기타 2022. 1. 21. 22:15
사건의 발단
- 회사에서 모 작업을 하고 PR을 올렸는데 거기에 들어가면 안되는 요상한 파일 하나가 들어있었음
- 심지어 그 파일이 들어간 커밋이 최신 커밋도 아니고 중간에 끼인 커밋이었음
- 내가 원했던 것
- 특정 커밋을 삭제하면서 잘못 올라간 파일만 삭제한다.
- 그리고 삭제하려는 커밋에서 변경한 다른 파일의 경우 최신 커밋의 내용을 유지한다.
Git rebase
- 브랜치 병합 전략 중 하나
- 브랜치의 공통 조상이 되는 base를 다른 브랜치의 커밋 지점으로 바꾸는 것
rebase 원리
- HEAD(feature)와 대상 브랜치(master)의 공통 조상(base)을 찾는다.
- 공통 조상에서 시작해서 HEAD가 가리키는 커밋까지의 diff 를 차례대로 만들어 임시공간인 Patch에 저장
- HEAD를 대상 브랜치로 변경
- 공통 조상 이후에 생성한 커밋들을 대상 브랜치(master) 뒤(마지막 커밋)로 재배치한다.
- 리베이스 완료된 커밋들은 체크섬이 바뀐 새로운 커밋
브랜치 병합: Merge vs Rebase- Merge에서 히스토리란 작업한 내용의 사실을 기록한 것
- Merge로 브랜치를 병합하게 되면 커밋 내역에 Merge commit이 추가로 남게됨
- 따라서 Merge를 사용하면 브랜치가 생기고 병합되는 모든 작업 내용을 그대로 기록하게 된다.
- Rebase의 경우 브랜치를 병합할 때 Merge commit을 남기지 않으므로, 마치 다른 브랜치는 없었던 것처럼 프로젝트의 작업 내용이 하나의 흐름으로 유지된다.
- 즉, rebase는 기록(commit)을 변경하며, merge는 기록을 있는 그대로 사용
⭐️ Git rebase -i (궁극적으로 commit 삭제를 위해 사용한 것)- git rebase의 원래 용도는 브랜치 병합이지만 commit 내역 수정/삭제 할 때도 사용됨
- 앞서 rebase는 기록을 변경한다고 했는데 그래서인지 변경을 위한 옵션이 많이 존재한다.
실제로 test- 저 빨간 박스에 해당하는 커밋 삭제하려고 함
- test1 파일은 삭제하고 test파일 내용은 최신 커밋인 d86789f 의 내용으로 유지하고 싶다!
git rebase -i HEAD~4 (HEAD로부터 4개 이전 커밋이 기준 커밋이 됨)
삭제하려는 커밋 drop 키워드로 바꿔줌
처음에는 conflict 발생해서 rebase 되지 않음
→ d86789f (삭제커밋 이후) 의 test 파일 내용과 현재 HEAD 의 내용 충돌conflict 해결한 후 git add test.js 로 conflict resolved 되었다고 명시
그 후, git rebase —continue 명령어 실행결과
완전한 이해를 위해 그려본 flow
특정 commit 삭제- 최근 n개의 커밋 확인 (-i 옵션은 interactive 모드를 의미)
git rebase -i HEAD~n
- drop 키워드 사용하면 해당 커밋 삭제 가능
commit message 수정할 때
- 최근 n개의 커밋 확인 (-i 옵션은 interactive 모드를 의미)
git rebase -i HEAD~n
- 커밋 내역 중 pick 키워드 → reward 키워드로 바꿔주면 메세지 변경 가능 (메세지 뿐 아니라 내용까지 수정하려면 edit 키워드)
참고:
'⏰ 오늘의 공부 > 기타' 카테고리의 다른 글
Spark (0) 2020.03.02 Spark - RDD (0) 2020.02.01 Promise & async / await (0) 2020.01.27 Redis (0) 2020.01.24 Proxy 설정 (0) 2020.01.24