본문 바로가기
IT/Git

Git 사용시 실수 대처법

by DOSGamer 2020. 2. 3.
반응형

마지막 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 라는 툴을 사용해서 지운다

 

참고사이트

반응형