자바스크립트를 활성화 해주세요

d006 Git에서 Unstage하는 7가지 방법

 ·  ☕ 3 min read

아마도 습관처럼 git add -A를 사용했다면 넣고 싶지 않은 파일도 staged되어 있을 겁니다. 빼내야 겠네요. 어떻게 하죠?

git stage

우선 git add명령은 아는데, git stage명령은 처음본다는 분들이 계신다만,

  • git stage 명령은 git add명령과 완전히 동일합니다.
  • synonym 입니다.

git reset

가장 간단하면서도 고전적인 방법입니다. 모두 unstage하고 다시 처음부터 stage하면 되는 거죠. 현재의 branch의 HEAD로 되돌아 갑니다. 변경된 파일은 그대로 남아있죠.

변형된 방법으로 다음과 같은 활용법도 있습니다.

  • git reset HEAD
  • git reset HEAD <file>
  • git reset HEAD@{1}

간혹 .gitconfig 파일에 alias 설정을 해 두기도 합니다.

[alias]
    unstage = reset HEAD

git rm <filename> --cache

이것도 예전부터 있던 건데요, stage된 상태에다가 지워버리라고 하는 내용도 함께 stage해버리는 거죠. 역시 변경된 파일은 남습니다. git reset과 다른 점은 다른 사람들이 이 커밋을 pull하게 되면, 이미 그들의 커밋에 파일이 남아 있을 경우 그것도 함께 지워버린다는 거죠.

git checkout -- <file>

이건, 파일을 checkout 한 상태로 되돌려 버리는 겁니다. 변경을 잃어버립니다. 잃어버릴 것 같으면, git reset --hard -- <file>과 다를 것도 없겠네요. 주로 실컷 파일을 수정해 보다가, ‘아 이건 아니네… 처음으로 돌려서 다시해보자’ 하는 경우에 사용합니다.

‘처음에 어떻게 생겼었지?’ 를 살펴보는 명령도 많이 사용합니다.

  • git diff -- <file>

git rm <filename>

로컬 디스크에서도 지우고, 레포지토리에서도 지웁니다. 지우므로 파일은 없어지고 당연히 변경도 잃어버립니다.
recursive하게 디렉토리를 지우려면 -r을 사용합니다.

git rm -r <dirname>

If we want to remove a file from the repository but keep it on disk, say we forgot to add it to our .gitignore file then use –cache:

git restore --staged

versions 2.23 이상이면 이런 명령도 사용할 수 있습니다.
--staged--stage를 사용할 수 있습니다.

  • git restore --stage <file>

git reflog

reflog는 reference log인 것 같습니다. 이건 복구할 때 사용하는 방법이라.. unstage와는 조금 다른데요, 커밋이나 브랜치는 삭제될 수가 있습니다. 삭제한 브랜치, 삭제한 커밋으로 되돌리기 위해, 또는 reset, revert, rebase한 것도 취소하고 되돌리고 싶은 경우에 전부 리스트업 해서 커밋아이디를 알아낼 때 사용하는 방법입니다. 몇 번째 떨어진 커밋인지 확인한 후에, 다음과 같이 복구하는 것이 가능합니다.

  • git reset --hard HEAD@{1}
  • git reset --hard <commit hash id>
  • git checkout -b <삭제한 브랜치명> <commit hash id>

명령으로 복구하는 것이 가능합니다. 또, reflog명령은 다음의 명령과 완전히 동일합니다.
git log -g --abbrev-commit --pretty=oneline

# git reflog 는 날짜를 표시해 주지 않기 때문에 혼자 사용하는 repository는 커밋메세지에 그냥 날짜를 넣어서 사용하고 있습니다.

git reflog를 실행한 출력결과는 다음과 같습니다.

PS C:\Users\Administrator\blog> git reflog

3773a20 (HEAD -> master, origin/master) HEAD@{0}: commit: 20200719 1436
02ab828 HEAD@{1}: reset: moving to HEAD
02ab828 HEAD@{2}: commit: 20200719 1044
1afe27f HEAD@{3}: commit: 20200719 1032
c5d139d HEAD@{4}: pull: Fast-forward
e5154f4 HEAD@{5}: pull: Fast-forward
2ae010b HEAD@{6}: commit: 20200718 0902
49c2cef HEAD@{7}: pull: Fast-forward
7af97e5 HEAD@{8}: commit (initial): 20200716 2240
PS C:\Users\Administrator\blog>

모든 커밋이 tree가 아닌 순서별로 출력되는 것을 알 수 있습니다. 이로써 필요로하는 커밋을 찾아서 이동하는 것이 가능합니다.

레퍼런스

공유하기

tkim
글쓴이
tkim
Software Engineer