[GIT] 히스토리 편집하기

마지막 커밋 수정하기

  • 마지막 커밋을 수정하는 것은 Git에서 자주 하는 작업 중 하나입니다.
  • 이를 통해 커밋 메시지를 수정하거나 수정한 파일을 마지막 커밋에 추가할 수 있습니다. 
  • 수정한 파일을 Staging Area에 넣고 git commit --amend 명령을 사용하여 커밋을 수정할 수 있습니다. 
  • $ git commit --amend
  • 이 작업은 주의가 필요하며, 이미 Push한 커밋은 수정해서는 안 됩니다.
  • 커밋을 고칠 때는 추가된 변경 내용이 커밋 메시지에 충실하게 담겼는지 확인해야 합니다. 
  • 때로는 --no-edit 옵션을 사용하여 커밋 메시지를 변경하지 않고도 커밋을 수정할 수 있습니다.
  • $ git commit --amend --no-edit

커밋 메시지 여러개 수정하기

  • git rebase 명령을 사용해서 커밋 메시지를 여러 개 수정할 수 있습니다.
  • $ git rebase -i HEAD~3
    pick 10317bb 7-1
    pick b173fae 6
    pick f8ca9b4 8
     
  • 커밋 순서는 오래된 커밋부터 보여집니다.
  • pick을 edit으로 표시 후 저장 후 해당 커밋으로 이동됩니다.
  • $ git commit --amend
  • 위에 명령어를 수행 후 커밋 메시지를 수정 후 종료합니다.
  • $ git rebase --continue
  • 위에 명령어로 넘어간 뒤 다시 git commit --amend로 수정하면 됩니다.

커밋 순서 바꾸기

  • $ git rebase -i HEAD~3
    pick b173fae 6
    pick 10317bb 7-1
    pick f8ca9b4 8
  • 위에 순서대로 커밋이 바뀝니다.

커밋 합치기

  • $ git rebase -i HEAD~3
    pick b173fae 6
    squash 10317bb 7-1
    squash f8ca9b4 8
  • 3개의 커밋이 합쳐집니다.

커밋 분리하기

  • $ git rebase -i HEAD~3
    pick b173fae 6
    edit 10317bb 7-1
    pick f8ca9b4 8
  • 저장 후 나가면 10317bb 커밋에서 stop이 됩니다.
  • git reset HEAD^ 명령으로 커밋 해제 후 원하는 커밋을 여러개 등록한 후 git rebase --continue를 실행하여 작업을 끝냅니다.

filter-branch를 이용한 전체 커밋 수정

  • $ git filter-branch --tree-filter 'rm -f README' HEAD
  • 전체 커밋에서 REAME를 제거할 수 있습니다.
  • --tree-filter 옵션은 커밋에 checkout한 후에 명령어 실행 후 그 결과를 다시 커밋합니다.
  • $ git filter-branch --subdirectory-filter trunk HEAD
  • turnk 디렉토리를 루트 디렉토리로 만듭니다.
  • $ git filter-branch --commit-filter '
            if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
            then
                    GIT_AUTHOR_NAME="Scott Chacon";
                    GIT_AUTHOR_EMAIL="schacon@example.com";
                    git commit-tree "$@";
            else
                    git commit-tree "$@";
            fi' HEAD
  • 커밋한 히스토리에서 이메일 주소를 수정합니다.