ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Github 커밋 하나로 합치기 (전체, 선택)
    Tips 2022. 6. 20. 20:34
    728x90
    반응형

     이것저것 개발을 하고 commit을 했는데 여태까지 커밋한 내역을 하나로 합쳐서 깔끔하게 남기고 싶은 경우 내역을 하나로 합칠 수 있다.

    아래 과정을 따라가다가 중간에 마음에 안 드는 작업을 했거나 아차 싶은 경우 git rebase --abort를 수행하면 작업이 초기화된다.

     

    1. 포인트를 rebase해준다. Rebase 해 주는 곳은 합칠 커밋의 바로 직전 커밋이다.

    $git rebase -i [포인트 할 커밋 번호 또는 HEAD~합칠 커밋의 수]

     a,b,c,d를 커밋했다고 가정했을 때, b,c,d의 커밋 내역을 하나로 합치고 싶을 경우

     

    - git rebase -i [a의 커밋번호]

    - git rebase -i HEAD~2

     

    로 수행할 수 있다. 두 명령어의 결과값은 같다.

     전체 커밋 내역을 하나로 만들 수는 없다. 왜냐하면 레포를 만드는 작업 자체가 하나의 커밋이기 때문이다. 따라서 합칠 커밋의 수를 전체 커밋의 수와 동일하게 지정하면 rebase할 커밋이 없다는 에러가 발생한다.

     따라서 작업 결과로 만들 수 있는 최소 커밋의 수는 2개(레포 만든 커밋 + 작업 내역 합친 커밋)이다. 전체 내역을 2개로 만들고 싶다면 rebase할 커밋 번호를 제일 첫 커밋번호로 지정해주면 된다.

     

    2. 합칠 커밋들을 squash 해준다.

     편집기에 다음과 같이 커밋 내역이 오래된 순서대로 뜬다 (제일 아래가 제일 최신 커밋). 아래에 주석으로 적혀있는 부분을 잘 읽어보면 어떻게 하라는지 잘 나와있다.

     

     처음 떴을 때는 커밋 내역의 앞에 모두 'pick'이라고 적혀있다. 이걸 'squash' 또는 'fixup'을 사용해 하나로 합칠 수 있다.

    i를 사용해서 편집 모드로 들어갈 수 있으며 혹시 바꾸고 싶은 내역이 너무 많은 경우 명령모드에서 s명령어를 사용할 수 있다. s명령어의 사용법은 다음과 같다.

     

    :(시작줄),(끝줄)s/찾을패턴/바꿀문자열/옵션

     

    전체 문서에서 pick을 abort로 바꾸고 싶은 경우 :%s/pick/squash 라고 입력하면 된다.

     

     커밋 내역을 합치는 옵션은 다음과 같다.

    • squash: b,c,d의 커밋 메세지를 합친 메세지가 표시된다. 위의 경우라고 했을 때 최종 표시되는 커밋 메세지는 'test deletion test slack notification'이 된다.
    • fixup: d의 커밋 메세지만 남긴다. 위의 경우라고 했을 때 최종 표시되는 커밋 메세지는 'test slack notification'이다.

    위처럼 수정하게 되면 test deletion과 test slack notification의 커밋 내역이 하나로 합쳐지고, 커밋 메세지는 test deltion test slack notification으로 나타난다.

     입력이 끝났다면 esc-> :wq를 눌러 편집 내용을 저장하고 종료해준다. 그러면 새로운 문서 창이 나타나는데 커밋 메세지를 바꾸고 싶다면 무시하면 안되는 부분이다.

     

    3. (option) 커밋 메세지를 변경해준다.

     커밋 메세지를 변경할 수 있는 새로운 창이 자동으로 뜬다.

     해당 문서에서 주석으로 표시되지 않은 부분은 모두 커밋 메세지로 반영된다. 따라서 이 문서를 수정하지 않고 그냥 종료할 경우 최종 커밋 메세지는 'test deletion test slack notification'이 된다. 수정하고 싶다면 i 눌러서 편집한 후 esc->:wq를 눌러주고, 수정 안하고 싶다면 그냥 :q를 눌러준다.

    요렇게 바꾸면 됨 (설마 커밋메세지를 진짜 final commit이라고 적는 사람은 없겠지)

    이 단계까지 완료하면 git에는 반영이 된 것이다. git log를 뽑아보면 다음과 같다.

    4. 리모트 브랜치에 반영해준다.

     이 작업을 하기 전에 이미 내역을 모두 원격 레포지토리에 push를 해버려 해당 내역을 반영해줘야 하는 경우도 있다. 간단히 강제 push 명령어로 반영할 수 있다.

    $git push origin [원격 레포지토리 브랜치 이름] -f

     

    728x90
    반응형

    댓글