git rebase --interactive

박세영·2022년 8월 24일
0

Issues 🤔

  1. git의 특정 커밋 히스토리에 mongo url, 계정, 비밀번호 제거하기
  2. .gitignore.env를 추가한 이후에도 git 히스토리에 남아있는 .env 파일 제거하기

git rebase를 이용한 커밋내역 정리하기 ✨

지금까지 rebase를 merge와 같이 두 개의 branch를 병합하는 용도로만 알고 있었다. 하지만, -i옵션을 통해 같은 브랜치 내에서 pointer를 이전으로 변경해 커밋 히스토리를 정리하는 용도로도 사용할 수 있다는 것을 알게 되었다.

git rebase -i origin/main~{n} main

-i 옵션은 --interactive의 단축으로, 대화형으로 커밋 히스토리를 정리할 수 있다. 위 명령어를 실행하면 터미널에 vim 에디터가 다음과 같이 열린다.

pick 9a54fd4 commit의 설명 추가
pick 0d4a808 pull 설명을 추가

# Rebase 326fc9f..0d4a808 onto d286baa
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

각 라인은 [명령어] [커밋 해시] [커밋 메시지]로 구성되어 있다. 에디터를 통해서 커밋의 순서를 바꾸거나, 특정 커밋에 수행하고 싶은 명령어를 지정해주면 된다.

대화형 rebase 명령어📕

  • pick
    해당 커밋을 수정하지 않고 그대로 사용하겠다라는 의미이며, 대화형 rebase를 실행할 때의 default가 된다.

  • reword
    커밋 메시지를 수정한다.

  • edit 👍
    git의 포인터를 해당 커밋 시점으로 되돌려, 작업 내용을 수정할 수 있다.
    커밋을 수정한 다음에는 git rebase --continue를 통해 다음 작업으로 넘어간다.
    edit 명령어를 통해 이번 문제를 해결했다.

  • squash
    해당 커밋을 이전 커밋과 합친다.

  • fixup
    squash와 같은 작업을 수행하지만, 커밋 메시지는 남겨둔다.

  • exec
    뒤에 따라오는 shell 명령어를 실행한다.

원격 저장소에 변경내역 반영하기

rebase를 통해 커밋 히스토리가 변경되면서 원격 저장소에 push를 하면 에러가 발생하거나 원하는 대로 반영이 안될 수 있다. 그렇기 때문에, --force 옵션 혹은 + 옵션을 통해 원격 저장소에 강제적으로 push해 주어야 한다.

💡 git push에서 --force와 +의 차이

git push--force 옵션은 모든 ref에 대해 강제적으로 push하는 반면 +{Branch}옵션은 해당 브랜치에 한정해서 강제적으로 push한다.

.gitignore이 적용되지 않을 때

rebase를 통해 .env파일을 제거해 주었음에도 불구하고 원격 저장소에는 해당 파일이 그대로 남아있었다.

이러한 경우에는 .git 내부의 캐시에서 파일을 직접 삭제해 주어야 한다.

git rm .env --cached

0개의 댓글