마지막 commit 에 변경을 추가하지 않았을 때
상황
local Branch 에 작업을 commit 한 후에 일부 파일을 staging 하지 않았거나
Commit Message 에 세부 정보를 추가하지 않았다
해결방법
commit 에 누락된 파일을 Staging 한다
git commit --amend 를 입력해서 commit message 를 편집한다
commit message 를 수정할 필요가 없는 경우에는 git commit --amend --no-edit 를 사용해서 파일을 추가하고 메시지 편집은 생략한다
실수를 줄이는 방법
임시 Branch 를 활용하여 수시로 작게 Commit 을 하고 중요한 시점에 도달하면 임시 Branch 에서 git merge --squash 를 사용하여 하나의 깔끔한 Commit 으로 결과를 저장한다
로컬 마스터에 변경을 커밋했을 때
상황
변경 사항 commit 을 dev Branch 가 아닌 Master Branch 에 했을 경우
해결방법
1. 새로운 Branch 를 생성하고 git branch new-branch
2. Master Branch 의 상태를 Commit 직전으로 reset git reset HEAD~ --hard
여러 번 commit 한 경우에는 git reset HEAD~<n> --hard 로 <n> 은 되돌릴 commit 횟수 이다
Hash ID 를 알고 있으면 git reset <hashid> 를 사용해서 hash id 로 되돌리면 된다
3. 새로운 Branch 로 checkout 해서 다시 작업 진행한다 git checkout new-branch
실수를 줄이는 방법
new branch 를 생성해서 코딩하는 것을 습관화 하자
파일이나 디렉터리를 버렸을 때
상황
실수로 파일의 내용을 버린 다음 여러 번 커밋한 것을 알게 되었을 때
해결방법
1. 파일이 수정되기 전의 commit 에 대한 Hash ID 를 찾아낸다
git log 또는 IDE 에 설치된 git tool 들을 사용해서 Hash ID 를 찾는다
2. 해당 Hash ID 시점의 해당 파일만 checkout 한다
git checkout <hashid> -- /path/to/file 을 사용한다
Hash ID 없이 <n> 번 commit 전으로 하려면 git checkout HEAD~<n> -- /path/to/file 을 사용한다
파일의 전체를 checkout 하려면 git checkout HEAD~1 -- ./src/** 를 입력하여 src 디렉토리의 모든 파일을 복구한다
실수로 Branch 를 삭제했을 때
상황
Branch 전체를 실수로 삭제하는 경우
해결방법
A. 삭제된 Branch 가 병합된 경우
1. 마지막 commit 의 Hash ID 를 찾는다
git reflog 를 사용한다
2. 찾은 Hash ID 를 사용해서 새로운 Branch 를 만든다
git checkout -b restored-branch <hashid> 를 사용한다
B. 삭제된 Branch 가 병합되지 않고 git gc 를 실행한 적이 없는 경우
git fsck --full --no-reflogs --unreachable --lost-found 를 사용해서 삭제된 Branch 를 포함해서 모든 commit Hash 목록을 확인한다
unreachable commit 항목을 찾아서 new Branch 로 복원을 하고 문제의 Branch 인지 확인한다
아니면 다음 Branch 를 복원하고 확인하는 작업을 반복한다
실수를 줄이는 방법
Branch 를 강제 삭제를 하고 있다면 Branch 작업 습관을 강제 삭제하지 않는 형태로 변경해야 한다
git push 로 원격 Branch 를 손상시킨 경우
상황
실수로 로컬의 Master Branch 를 원격 Branch 로 Push 를 한 경우 git push --force
해결방법
1. remote Branch 의 이전 commit 으로 Reset 한다
git reset --hard <remote_repo>/<branch>@{1} 을 사용한다. origin 이라는 원격 리포지토리의 master Branch 와 연결할 경우 git reset --hard origin/master@{1} 을 사용한다.
2. 원격 리포지토리를 복원한다
git push -f <remote_repo> <branch> 을 사용해서 원격 리포지토리를 이전 상태로 복원한다
실수를 줄이는 방법
강제 push 를 막아놓는다
git config --system receive.denyNonFastForwards true
공개 리포지토리에 비공개 정보를 커밋해버렸을 때
상황
비밀번호를 push 해버린 경우 ( 특히 github 에 push 할 때 조심하자 )
해결방법
BFG Repo-Cleaner 라는 툴을 사용해서 지운다
참고사이트
'IT > Git' 카테고리의 다른 글
Git Commit Message 정리 (0) | 2022.08.26 |
---|---|
GIT commit message 규칙 (0) | 2022.08.12 |
fatal: refusing to merge unrelated histories (0) | 2020.02.18 |
git log 한글 깨짐 (windows) (1) | 2020.02.13 |
git 줄바꿈 문제 (warning: CRLF will be replaced by LF in .gitignore) (0) | 2019.10.17 |
git tag 사용하기 (0) | 2019.08.02 |
master (non-fast-forward) 강제로 push 하기 (0) | 2019.08.02 |
팀블로그에 글 작성하기 (github pull request) (0) | 2019.01.06 |