아마도 습관처럼 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가 아닌 순서별로 출력되는 것을 알 수 있습니다. 이로써 필요로하는 커밋을 찾아서 이동하는 것이 가능합니다.