ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 특정 commit 삭제하기
    ⏰ 오늘의 공부/기타 2022. 1. 21. 22:15

    사건의 발단

    • 회사에서 모 작업을 하고 PR을 올렸는데 거기에 들어가면 안되는 요상한 파일 하나가 들어있었음
    • 심지어 그 파일이 들어간 커밋이 최신 커밋도 아니고 중간에 끼인 커밋이었음

    • 내가 원했던 것
      • 특정 커밋을 삭제하면서 잘못 올라간 파일만 삭제한다.
      • 그리고 삭제하려는 커밋에서 변경한 다른 파일의 경우 최신 커밋의 내용을 유지한다.

    Git rebase

    • 브랜치 병합 전략 중 하나
    • 브랜치의 공통 조상이 되는 base를 다른 브랜치의 커밋 지점으로 바꾸는 것

    feature를 master에 rebase 한다 = feature와 master의 공통 조상인 base를 master로 변경한다.
    feature의 base를 b가 아니라 m2로 재설정(Rebase)하는 것

    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 키워드)

    참고:

    🎢 Git Rebase 활용하기

    https://gre-eny.tistory.com/301

    '⏰ 오늘의 공부 > 기타' 카테고리의 다른 글

    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

    댓글

Designed by Tistory.