※ Git은 커밋하지 않고 잃어버린 것은 절대로 되돌릴 수 없다.
Git 되돌리기(Undo) : (재커밋, Staged->Unstaged, Modified->Unmodified)
- ※ 매우 주의 ※ : 한 번 되돌리면 복구할 수 없기에 주의해야 한다.
Git을 사용하면 우리가 저지른 실수는 대부분 복구할 수 있지만 되돌린 것은 복구할 수 없다.
CASE1) 커밋 후 바로 재커밋하기 : $ git commit -amend
ㄴ> 방금 커밋한 사항에 대해 바로 수정작업이 필요할 때,
수정작업을 하고 Staging Area에 추가 후 $ git commit --amend 명령을 사용하면 재커밋된다.
ㄴ> 마지막으로 커밋하고 나서 수정한 것이 없다면(=커밋하자마자 바로 이 명령을 실행하는 경우)
이전에 한 커밋과 모든 것이 같고, 커밋 메시지만 수정된다.
ㄴ> ※ 이전의 커밋은 일어나지 않은 일이 되는 것이고 당연히 히스토리에도 남지 않는다.
ㄴ> 위 명령어 실행시켜 편집기가 실행되면 이전 커밋 메시지가 자동으로 포함되며,
이 메시지를 수정하지 않고 그대로 커밋해도 기존의 커밋을 덮어쓴다.
ㄴ> ex) 커밋을 했는데 Stage 하는 것을 누락한 경우 아래와 같이 고칠 수 있다.
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
CASE2) Staged 파일 되돌리기 : $ git reset HEAD <파일>
ㄴ> 파일 상태를 Unstage로 변경하기 (=Staging Area에서 파일 빼기->Working directory로 돌려보내기)
ㄴ> 'HEAD' : 현재 브랜치를 가리키는 포인터
ㄴ> ※ git reset 명령의 일부 옵션은 Working directory의 파일까지 수정되므로 위험하다! (--hard 옵션과 함께 사용하면 더더욱 위험)
하지만 옵션 없이 사용하면 워킹 디렉토리의 파일은 건드리지 않는다.
ㄴ> ex) 따로따로 커밋하려고 했지만, 실수로 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
ㄴ> git이 친절히 "Changes to be commited 밑에 git reset HEAD <file>… "로 알려준다.
② 추가하지 않으려 했던 CONTRIBUTING.md 파일을 Stagine Area에서 빼기
$ 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
CASE3) Modified 파일 되돌리기 : $ git checkout -- <파일>
ㄴ> Modified상태 파일을 최근 커밋한 상태(또는 clone했을 때 상태)로 되돌리기
ㄴ> ※ 주의 : 수정한 내용은 전부 사라지므로 위험하다.
+) [권장] 변경한 내용을 쉽게 버릴수는 없고 하지만 당장은 되돌려야만 하는 상황이라면 Stash와 Branch를 사용
ㄴ> Ex▼) 수정한 CONTRIBUTING.md파일(Unstaged상태)을 수정 전으로 되돌리기
$ 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
$ git checkout -- CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
END!
스터디 도움 참조 블로그 (References)
- 버전 관리(VC) 위키백과 https://ko.wikipedia.org/wiki/%EB%B2%84%EC%A0%84_%EA%B4%80%EB%A6%AC - 누구나 쉽게 이해할 수 있는 Git 입문 https://backlog.com/git-tutorial/kr/ /입문편/Git의 기본/이력을 관리하는 저장소 https://backlog.com/git-tutorial/kr/intro/intro1_2.html - git--distributed-even-if-your-workflow-isnt (Pro Git Book) https://git-scm.com/book/en/v2 - git--distributed-even-if-your-workflow-isnt (Pro Git Book) / ch2.4 https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0 |