보통 git 명령어를 사용하다 보면 git add를 잘못해서 뒤로 돌려야 하는 경우가 심심찮게 일어난다.
단순히 수정해서 다시 올려야 하는 경우에는 수정하고 다시 git add를 하면 되지만, 아직 staging 할 준비가 안됐다면 다시 unstaging 상태로 되돌려야 한다. 그러할 때 사용하는 유용한 명령어가 있다.
git reset
git reset 명령어는 유용하기도 한데 상당히 위험한 명령어일 떄도 있다. 기존에 수정하던 작업들을 전부 뒤로 돌릴수도 있는 명령어이기 때문이다. git reset --hard는 특히나 더 위험하므로 함부로 사용하지 않는 것으로 한다. 우선 우리는 git add를 되돌리는 것에 대해 알아야 하기 때문에 나머지는 추후 포스팅에서 남겨보기로 한다.
처음 참고 사이트에서 git add를 되돌리는 방법에 대해서는 한가지만 알고 있었는데, 두가지 방안이 보이는 것 같아 둘다 포스팅해본다.
1. git reset HEAD <file name>
git add를 한개만 해야하는데 전부 해버렸다고 가정해보자.
$ git add .
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
modified: test.txt
나는 test.txt만 staging 하고 싶은데 현재는 둘다 stage되어있는 상태이다.
이때 test.txt 파일만 unstage 상태로 되돌려보자.
$ git reset HEAD test.txt
Unstaged changes after reset:
M test.txt
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.txt
이렇게 git reset HEAD <file name>을 입력하면 해당 file은 unstaging 상태로 돌아옴을 알 수 있다.
2. git restore --staged <file name>
원래는 git reset 만 알고 잇다가 친절한 git bash의 설명 덕에 알게 된 명령어다. stage 상태인 파일 목록 위에 "
(use "git restore --staged <file>..." to unstage)" 라는 문구가 적혀있다. 이대로 진행해보려 한다.
아까와 동일한 상황으로 git status 상황을 만들어보자.
$ git add .
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
modified: test.txt
이 상태에서 아까와 같이 test.txt만 unstaging 해본다.
$ git restore --staged test.txt
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: README.md
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: test.txt
아까와 동일하게 test.txt 파일만 unstaging 된 상태임을 알 수 있다.
git reset HEAD 과 git restore --staged 의 차이
git reset 과 git restore의 명확한 차이는 아직 잘 모르겠지만, 명령어를 실행시키고 나면, git reset HEAD는 실행 후 변경 목록이 나오는 반면, git restore --staged는 아무런 출력 결과가 나오지 않는다.
어떤 사이트에서는 restore는 워킹트리 파일을 복원한다고 하고, reset은 현채 HEAD를 지정도니 상태로 재설정한다고 되어있는데, 아직 체감상 큰 차이를 느끼진 못하겠다. (아시는 분은 댓글 남겨주세요...)
----------
※ stage 상태가 아닌 파일을 git restore <file name> 명령어를 입력하면 수정된 내용의 이전 상태로 돌아간다. 다시 수정한 상태로 돌리는 건 불가능 한 것 같으니 조심해야 할 듯 하다. (이렇게 보면 git reset과 다를 바 없어보인다...)
어찌되었건 stage 상태의 파일을 다시 워킹 디렉토리로 옮기는 방법을 알아보았다.
참고 사이트
'Code > Git' 카테고리의 다른 글
[git] git push reject error 해결 (0) | 2020.11.24 |
---|---|
[Git] git commit 취소하기, git commit 수정하기 (0) | 2020.11.20 |
[Git] git bash 한글이름 파일 깨짐 해결 (0) | 2020.11.19 |
[Git] git commit 히스토리 조회하기 (0) | 2020.11.19 |
[Git] Staging이 뭐지?? - Git에서 파일의 상태 알기 (0) | 2020.11.18 |