[Git] git 되돌리기

2663 단어 gitgit

git을 사용하다보면 커밋을 잘못하거나, 푸시를 잘못하거나, 커밋 메시지를 잘못 작성하는 등의 실수를 합니다. 이번 기회에 이러한 실수를 복구하는 방법을 알아봅니다.

1. 푸시 전 커밋 메시지 변경

$ git log --online # 나의 로컬에 들어 있는 커밋 메시지 확인
# 로그를 확인해보니 커밋 메시지가 잘못 들어갔음을 파악합니다.
$ git commit --amend -m 'new Message' # 커밋된 파일은 하나도 바뀌지 않고 대신 커밋 메시지만 바꿉니다.

2. 이미 작성한 커밋에 파일 추가

이미 커밋을 했는데, 이 커밋에 포함되면 좋을것 같은 파일을 추가하는 방법입니다.

$ git add newFile
$ git commit --amend -m 'newMessage'

3. 스테이지에 올린 파일 취소

$ git reset HEAD fileName # 스테이지에 잘못 올린 파일을 untracked 상태로 변경

or

$ git reset . # 스테이지에 올린 모든 파일을 untracked 상태로 변경

4. 푸시 하기 전 커밋 취소

로컬에서 작업한 커밋 내역 취소 방법입니다.

$ git reset HEAD~3 #HEAD로부터 세번째 커밋 취소

or

$ git log --oneline # 커밋 로그를 체크하여 commitId 파악
$ git reset commitId = git reset --mixed commitId
  • soft : 커밋 이후 파일들을 staged 상태의 working 디렉토리에 모두 보존합니다.
  • mixed : 커밋 이후 파일들을 unstaged 상태의 working 디렉토리에 모두 보존합니다. [default]
  • hard : 커밋 이후 파일들을 모두 삭제합니다.

reset —hard로 지워진 커밋 복구하기

잘못해서 git reset --hard 옵션을 사용하여 그동안 공등일 작업물이 날라갔습니다. 아직 grabage collection이 되지 않았다면 기회가 남아있습니다.

$ git reflog # 그 동안의 커밋 내역을 모두 확인합니다.
$ git reset --hard commitId # 복구할 commitId를 표시합니다.

5. 이미 푸시한 커밋 취소

잘못 작성한 커밋을 푸시한 상황에서, reset을 해도 로컬에서만 취소됩니다. 그렇다고 로컬에서 reset을 수행하고 푸시를 할려면 히스토리가 꼬여서 푸시가 제대로 되지 않을 수 있습니다.

-f 옵션으로 강제 푸시를 하면 로컬의 히스토리로 리모트 서버가 강제로 덮여씌워집니다. 푸시한 커밋을 취소할 수는 있지만, 이미 잘못 올린 커밋을 pull 해서 쓰고 있는 팀원이 있다면 그 사람의 히스토리와도 엇나가게 되므로 권장하지는 않습니다. 즉, 해당 브랜치를 혼자쓴다면 reset을 쓸 수는 있지만 브랜치를 공유하는 팀원이 있다면 사용을 지양해야합니다.

git revert

$ git rever commitId

취소하고 싶은 커밋 해시를 로컬에서 작성 후, push하면 해당 커밋을 지우는 커밋이 올라갑니다. 이 커밋이 올라가면, 다른 팀원들도 취소 커밋을 내려받게 되기 때문에 히스토리가 꼬일 일이 없습니다.

6. 다른 브랜치의 커밋 복사

다른 브랜치의 커밋을 자신의 브랜치에서 사용하고 싶은 경우 cherry-pick을 사용합니다.

$ git log --oneline # 가져오고 싶은 커밋 해시 값을 확인합니다.
$ git cherry-pick commitId # 복사할 커밋 해시를 가져옵니다.

7. 과거 커밋에서 다시 시작

과거의 특정 커밋으로 되돌아가 작업할 때 필요합니다.

$ git log --oneline # 돌아가고 싶은 커밋 해시 값 확인
$ git checkout commitId
$ git checkout -b branchName # 새로운 브랜치에서 작업 진행

# 추후 브랜치 병합(merge) 진행

8. 이미 푸시한 git ignore 파일 변경

git ignore 해야 할 파일인데 실수로 이미 push할 때 사용합니다. 단 이미 올라간 과거 커밋 이력에는 해당 파일 내용이 남아있습니다.

# .git ignore 파일을 올바르게 수정
$ git rm -r --cached .
$ git add -A
# commit -> push

좋은 웹페이지 즐겨찾기