Git - RollBack

2020. 3. 21. 16:33Git Study

코드를 작성하다 보면, 이미 커밋된 내용을 Undo하고 싶을 때가 있다. Git에서는 대부분의 실수를 복구할 수 있지만 이미 되돌린 것은 복구할 수 없다.

되돌리기

너무 일찍 commit 했거나 어떤 파일을 빠트렸을 때, 그리고 commit message를 잘못 적을때는 commit을 수정해야 한다. 먼저 파일을 수정하고, Staging Area에 추가한 다음 --amend 옵션을 주어 커밋을 재작성 할 수 있다.

$ git commit --amend

이 명령은 Staging Area를 사용하여 commit한다. 수정한 것 없이 사용한다면 commit message를 수정할 수 있다. 메시지를 수정하지 않고 그대로 commit해도 기존의 것을 re-write한다.
commit을 했는데, Stage하는 것을 빠트렸다면 다음과 같이 수정할 수 있다.

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

위와 같이 작성하면, 명령어 3개가 모두 1 commit으로 기록된다. 첫번째 것이 덮어씌워진다. 첫번째 것은 history에 남지않고 완전히 변경되는 것을 의미한다.

파일상태를 Unstage로 변경하기

여기에선 staging areaworking directory를 넘나드는 방법을 설명한다. 책에 있는 이상한 설명은 집어치우고, 파일 두개를 수정하고서 각각 commit 하려했지만, 실수로 git add *를 실행해버리면, 두 파일 모두 staging area에 들어가게 된다. 우선 확인부터 해보면,

$ git add *
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README
    modified:   CONTRIBUTING.md

해당 명령어를 실행하면 Changes to be commited 밑에 git reset HEAD <file> ... 이란 명령어를 제시해준다. 이것으로 Unstaged 상태로 변경할 수 있다. CONTRIBUTING.md를 Unstaged로 변경하려면 다음과 같이 작성하면 된다.

$ git reset HEAD CONTRIBUTING.md
Unstaged changes after reset:
M    CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    renamed:    README.md -> README

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   CONTRIBUTING.md

잘 동작하게 되고, CONTRIBUTING.md 파일은 Unstaged 상태가 된다. 실제로 git reset이 어떻게 정확하게 작동하는지는 다른 파트에서 참고하면 될거 같다.

정리하는 내용

변경한 내용을 쉽게 버릴 순 없고, 그러나 당장 되돌려야만 한다면 Stash 혹은 Branch를 쓰는 것이 유익하다. Git에서 Commit한 내용은 언제나 뭐든지 복구 할 수 있다. 그러나 커밋하지 않고 잃어버린 것은 절대로 되돌릴 수 없다.