Issues 🤔
- git의 특정 커밋 히스토리에 mongo url, 계정, 비밀번호 제거하기
.gitignore
에.env
를 추가한 이후에도 git 히스토리에 남아있는.env
파일 제거하기
지금까지 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.
#
각 라인은 [명령어] [커밋 해시] [커밋 메시지]
로 구성되어 있다. 에디터를 통해서 커밋의 순서를 바꾸거나, 특정 커밋에 수행하고 싶은 명령어를 지정해주면 된다.
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한다.
rebase를 통해 .env
파일을 제거해 주었음에도 불구하고 원격 저장소에는 해당 파일이 그대로 남아있었다.
이러한 경우에는 .git 내부의 캐시에서 파일을 직접 삭제해 주어야 한다.
git rm .env --cached