git을 사용하다보면 커밋을 잘못하거나, 푸시를 잘못하거나, 커밋 메시지를 잘못 작성하는 등의 실수를 합니다. 이번 기회에 이러한 실수를 복구하는 방법을 알아봅니다.
$ git log --online # 나의 로컬에 들어 있는 커밋 메시지 확인
# 로그를 확인해보니 커밋 메시지가 잘못 들어갔음을 파악합니다.
$ git commit --amend -m 'new Message' # 커밋된 파일은 하나도 바뀌지 않고 대신 커밋 메시지만 바꿉니다.
이미 커밋을 했는데, 이 커밋에 포함되면 좋을것 같은 파일을 추가하는 방법입니다.
$ git add newFile
$ git commit --amend -m 'newMessage'
$ git reset HEAD fileName # 스테이지에 잘못 올린 파일을 untracked 상태로 변경
or
$ git reset . # 스테이지에 올린 모든 파일을 untracked 상태로 변경
로컬에서 작업한 커밋 내역 취소 방법입니다.
$ git reset HEAD~3 #HEAD로부터 세번째 커밋 취소
or
$ git log --oneline # 커밋 로그를 체크하여 commitId 파악
$ git reset commitId = git reset --mixed commitId
잘못해서 git reset --hard 옵션을 사용하여 그동안 공등일 작업물이 날라갔습니다. 아직 grabage collection이 되지 않았다면 기회가 남아있습니다.
$ git reflog # 그 동안의 커밋 내역을 모두 확인합니다.
$ git reset --hard commitId # 복구할 commitId를 표시합니다.
잘못 작성한 커밋을 푸시한 상황에서, reset을 해도 로컬에서만 취소됩니다. 그렇다고 로컬에서 reset을 수행하고 푸시를 할려면 히스토리가 꼬여서 푸시가 제대로 되지 않을 수 있습니다.
-f 옵션으로 강제 푸시를 하면 로컬의 히스토리로 리모트 서버가 강제로 덮여씌워집니다. 푸시한 커밋을 취소할 수는 있지만, 이미 잘못 올린 커밋을 pull 해서 쓰고 있는 팀원이 있다면 그 사람의 히스토리와도 엇나가게 되므로 권장하지는 않습니다. 즉, 해당 브랜치를 혼자쓴다면 reset을 쓸 수는 있지만 브랜치를 공유하는 팀원이 있다면 사용을 지양해야합니다.
$ git rever commitId
취소하고 싶은 커밋 해시를 로컬에서 작성 후, push하면 해당 커밋을 지우는 커밋이 올라갑니다. 이 커밋이 올라가면, 다른 팀원들도 취소 커밋을 내려받게 되기 때문에 히스토리가 꼬일 일이 없습니다.
다른 브랜치의 커밋을 자신의 브랜치에서 사용하고 싶은 경우 cherry-pick을 사용합니다.
$ git log --oneline # 가져오고 싶은 커밋 해시 값을 확인합니다.
$ git cherry-pick commitId # 복사할 커밋 해시를 가져옵니다.
과거의 특정 커밋으로 되돌아가 작업할 때 필요합니다.
$ git log --oneline # 돌아가고 싶은 커밋 해시 값 확인
$ git checkout commitId
$ git checkout -b branchName # 새로운 브랜치에서 작업 진행
# 추후 브랜치 병합(merge) 진행
git ignore 해야 할 파일인데 실수로 이미 push할 때 사용합니다. 단 이미 올라간 과거 커밋 이력에는 해당 파일 내용이 남아있습니다.
# .git ignore 파일을 올바르게 수정
$ git rm -r --cached .
$ git add -A
# commit -> push