...
기존 코드를 날리고 싶지않으면
origin(깃헙)에다가 push를 해놓고 리셋해야 원격서버에 내가 작업한게 남는다.
로컬에선 다 사라지기 때문이다.
git add 취소하기 (파일 상태를 Unstage로 변경하기)
아래와 같이 실수로 git add * 명령을 사용하여 모든 파일을 Staging Area에 넣은 경우, Staging Area(git add 명령 수행한 후의 상태)에 넣은 파일을 빼고 싶을 때가 있다.
여기에 두가지 방법이 있다.
git reset HEAD
- HEAD가 가리키는 시점의 버전으로 파일을 unstage하고 되돌린다.
# CONTRIBUTING.md 파일을 Unstage로 변경한다.
$ git reset HEAD CONTRIBUTING.md
# 전체 취소
$ git reset HEAD
git restore --staged
$ git restore --staged 파일명
▼ ▼ ▼
git commit 취소하기
git reset HEAD^ (단계로 commit 취소)
- 커밋 기록 자체를 말소
- 꺽쇠 수만큼 이전으로 돌아가게 하는 명령
- ^ (한단계 앞)
- ^^ (두단계 앞)
- ~숫자 로도 가능
# [방법 1]
# commit을 취소하고 해당 파일들은 staged 상태로 워킹 디렉터리에 보존
$ git reset --soft HEAD^
# [방법 2]
# commit을 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에 보존
$ git reset HEAD^
$ git reset HEAD~1 # 마지막 commit을 취소. 하나를 되돌림
$ git reset HEAD^^
$ git reset HEAD~2 # 마지막 2개의 commit을 취소
# [방법 3]
# commit을 취소하고 해당 파일들은 unstaged 상태로 워킹 디렉터리에서 삭제
$ git reset --hard HEAD^
git reset 옵션
- –soft : index 보존(add한 상태, staged 상태), 워킹 디렉터리의 파일 보존. 즉 모두 보존.
- –mixed : index 취소(add하기 전 상태, unstaged 상태), 워킹 디렉터리의 파일 보존 (기본 옵션)
- –hard : index 취소(add하기 전 상태, unstaged 상태), 워킹 디렉터리의 파일 삭제. 즉 모두 취소. 작업내용 다 사라지니까 왠만하면 사용X
git reset <num> --hard (이전 commit 상태를 지정해 리셋)
- git reset HEAD로 하면 되돌아갈 위치를 숫자로 세어서 해야되는데, 해시아이디로 지정해서 커밋을 돌아간다
$ git add dog
$ git commit -m "add dog file"
$ git log
git log를 하면 방금 전에 커밋한 내용이 보이게 된다.
노란 줄의 commit 뒤에 나온 번호는 상태의 일련번호이고 이 번호를 통해 분기할 수 있게 된다.
이제 dog 파일을 생성하기 이전 상태로 되돌려 보자.
# git log를 통해 확인한 커밋번호의 앞 6자리를 이용해 이전 상태로 되돌릴 수 있다.
# git reset 커밋번호여섯자리 --hard
$ git reset a6f30a --hard
a6f30a 이전의 로그들과 작업들이 다 지워지고 a6f30a 상태로 되돌아 온다.
git revert <num> --hard (이전 commit 상태로 되돌리기)
이전 상태로 되돌리는 방법에는 두가지가 있다.
reset은 로그를 아예 지워버리기 때문에 미래로 되돌릴 수 없다.
하지만 revert는 로그를 덮어쓰는 것이므로 다시 미래로 되돌릴 수가 있다.
예를 들어 1단계에서 dog파일을 생성하고 add, commit 한 후, 2단계에서 cat파일을 생성하고 add, commit하였다고 가정해보자.
1단계에서 커밋 번호가 111111이고
2단계에서 커밋 번호가 222222이다.$ git reset 111111 --hard 는 11111커밋으로 강제 리셋 하라는 말이다.
명령을 실행 하게되면, 로그에는 111111의 커밋 상태만 남게되어 다시 222222의 상태를 가질 수 없다.
하지만 $ git revert 222222 을 하게되면 새로운 커밋상태 333333이 새로 생성되고, 111111과 동일한 상태를 가지게 되어,
222222상태로도 되돌아갈 수 있게 되는 것이다.
# [ git reset / revert 차이 ]
$ git reset <이전 커밋번호여섯자리>
# -- <이전 커밋번호여섯자리>로 리셋해라 (삭제)
$ git revert <현재 커밋번호여섯자리>
# -- <현재 커밋번호여섯자리> 에서 이전으로 되돌아가라 (생성 덮어쓰기)
✅ revert기능은 알겠는데 간편하게 reset하면 되지, 왜 로그를 남기느냐?
다른사람과 협업할때 필수이기 때문이다.
혼자 실수해서 reset해버리면 다른사람의 리포지터리와 커밋 로그가 일치하지 않게 되기 때문이다. 따라서 협업에서 커밋 로그 통일성을 위해 revert를 자주 애용하는 편이다.
테스트를 위해 마찬가지로 cat, mouse 파일만 있던 상태에
dog파일을 추가하고 add, commit을 한다.
이후, 다시 cat, mouse만 있던 상태로 만들려면 git revert d61bb9를 입력해주면 된다.
$ git revert d61bb9
이렇게 하면 dog파일은 삭제되고 처음에 cat, mouse 파일만 있던 상태로 돌아오게 된다..
그리고 기존의 로그 위에, revert한 로그 메세지가 추가 된다.
git commit --amend (commit message 변경하기)
commit message를 잘못 적은 경우, message를 변경할 수 있다.
$ git commit --amend
특정 commit 버젼 상태로 되돌리기
$ git restore --source=해시코드 파일명
$ git restore --source=HEAD~2 파일명 # HEAD와 같은 포인터도 사용가능
git push 취소하기
이 명령을 사용하면 자신의 local의 내용을 remote에 강제로 덮어쓰기를 하는 것이기 때문에 주의해야 한다.
되돌아간 commit 이후의 모든 commit 정보가 사라지기 때문에 주의해야 한다.
특히, 협업 프로젝트에서는 동기화 문제가 발생할 수 있으므로 팀원과 상의 후 진행하는 것이 좋다.
1. 워킹 디렉터리에서 commit 되돌린다.
# [ 최근의 commit을 취소하고 워킹 디렉터리를 되돌리는 법 ]
$ git reset HEAD^
# [ 원하는 시점으로 워킹 디렉터리를 되돌리는 법 ]
# Reflog(브랜치와 HEAD가 지난 몇 달 동안에 가리켰었던 커밋) 목록 확인
$ git reflog
# 또는
$ git log -g
# 원하는 시점으로 워킹 디렉터리를 되돌린다.
$ git reset HEAD@{number}
# 또는
$ git reset [commit id]
⚠️ 만일 현재 프로젝트가 협업을 하는 과정이라면,git reset명령어로 하면 작업을 취소하면 작업하던 사람들 부분이 모두 꼬여버리기 때문에, 반드시git revert명령어로 수행하기를 권고한다.
2. 되돌려진 상태에서 다시 commit을 한다.
$ git commit -m "new commit messages"
3. 원격 저장소에 강제로 push 한다.
$ git push origin [branch name] -f
# 또는
$ git push origin +[branch name]
# master branch를 원격 저장소(origin)에 강제로 push
$ git push origin +master
TIP) 경고를 무시하고 강제로 push 하기
[방법 1]
-f 옵션
–force 옵션과 동일하다.
[방법 2]
+[branch name]
해당 branch를 강제로 push한다.
untracked 파일 삭제하기
git clean
git clean 명령은 추적 중이지 않은 파일만 지우는 게 기본 동작이다.
즉, .gitignore 에 명시하여 무시되는 파일은 지우지 않는다.
# 옵션 -f: force, -d: diretory 포함
# 디렉터리를 제외한 파일들만 삭제
$ git clean -f
# 디렉터리까지 삭제
$ git clean -f -d
# 무시된 파일까지 삭제
$ git clean -f -d -x
-d 옵션
디렉터리까지 지우는 것
-x 옵션
무시된 파일(.DS_Store나 .gitignore에 등록한 확장자 파일들)까지 모두 지우는 것
Ex) .o 파일 같은 빌드 파일까지도 지울 수 있다.
-n 옵션
가상으로 실행해보고 어떤 파일들이 지워질지 알려주는 것
modified file 삭제
git restore 파일명
modified 내용 삭제한다.
즉, 수정한 내용을 없애버리고 기존 상태로 되돌린다.
$ git restore 파일명
파일 삭제
git rm
# 로컬, 원격저장소 모두 파일이 바로 삭제
$ git rm <fileName>
# 로컬에는 파일이 남아있지만 commit하면 원격저장소에서 해당 파일이 삭제가 된다.
# 만일 원격저장소에 없는 새로만든 파일이라면 단순히 untracked 처리가 된다.
$ git rm <fileName> --cached
# 참고자료
https://velog.io/@younoah/git-restore-clean-%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-%EB%A1%9C%EC%BB%AC-%EB%B3%80%ED%99%94-%EC%B7%A8%EC%86%8C%ED%95%98%EA%B8%B0-feat.-reset
https://gmlwjd9405.github.io/2018/05/25/git-add-cancle.html
https://ebbnflow.tistory.com/196
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.