- 7.7 Git 도구 - Reset 명확히 알고 가기
- 2.4 Git의 기초 - 되돌리기
- [Git] 아흑.. 커밋을 잘못했네;; 세상에 푸쉬까지 해버렸는데… 어쩌지… : Whiteship's Epril
# 최근 하나 git reset HEAD^ # 최근 2개 git reset HEAD~2 # commit git commit -m ‘머라머라’ # push, + 경고 무시 git push origin +master
Git 이 관리하는 역활
- HEAD
- 마지막 커밋 스냅샷, 다음 커밋의 부모 커밋
- Index
- 다음에 커밋할 스냅샷
- 워킹 디렉토리
- 샌드박스
- HEAD
- HEAD는 현재 브랜치를 가리키는 포인터이며, 브랜치는 브랜치에 담긴 커밋 중 가장 마지막 커밋을 가리킨다. 지금의 HEAD가 가리키는 커밋은 바로 다음 커밋의 부모가 된다. 단순하게 생각하면 HEAD는 마지막 커밋의 스냅샷이다.
# cat-file와 ls-tree 명령은 일상적으로는 잘 사용하지 않는 저수준 명령이다. 이런 저수준 명령을 “plumbing” 명령이라고 한다. Git이 실제로 무슨 일을 하는지 볼 때 유용하다. git cat-file -p HEAD git ls-tree -r HEAD
- Index
- Index는 바로 다음에 커밋할 것들이다. 이미 앞에서 우리는 이런 개념을 ‘`Staging Area’라고 배운 바 있다. ``Staging Area'는 사용자가 git commit 명령을 실행했을 때 Git이 처리할 것들이 있는 곳이다.
# 워킹 디렉토리 마지막 Checkout 으로 채워지고, Commit 시 Index 는 새로운 commit로 변경된다. # 현재 index 상태 확인 git ls-files -s
- 워킹 디렉토리
- 위의 두 트리는 파일과 그 내용을 효율적인 형태로 .git 디렉토리에 저장한다. 하지만 사람이 알아보기 힘들기 때문에 워킹 디렉토리는 실제파일이 존재하기 때문에 사람이 편집하기 수월하다.commit 전에 Index에 올려놓고 얼마든지 편집이 가능하다.
- 워크플로
- Git의 주목적은 프로젝트의 스냅샷을 지속적으로 저장하는 것이다. 이 트리 세 개를 사용해 더 나은 상태로 관리한다.
- HEAD 이동
- Index 업데이트
- 워킹 디렉토리 업데이트
Git 관리 역활 설명
현재 로컬과 저장소 상태
rollback 동작
# 1. HEAD 이동 # 현재 브랜치(master)에서 HEAD가 9e5e6a4 를 가르킨다. git reset --soft HEAD~ git reset 9e5e6a4 # 2. Index 업데이트 # Index와 reset 명령으로 이동시킨 HEAD의 다른 점이 녹색으로 출력 git status # reset 명령은 여기서 한 발짝 더 나아가 Index를 현재 HEAD가 가리키는 스냅샷으로 업데이트할 수 있다. # 아무 옵션도 주지 않으면 기본적으로 --mixed 옵션으로 동작한다. git reset HEAD~ # git commit 명령도 되돌리고 git add 명령까지 되돌리는 명령이다. git reset [--mixed] HEAD~ # 3. 워킹 디렉토리 업데이트 # reset 명령은 세 번째로 워킹 디렉토리까지 업데이트한다. --hard 옵션을 사용하면 reset 명령은 이 단계까지 수행한다. # reset 명령을 위험하게 만드는 유일한 옵션. # reset 명령을 어떻게 사용하더라도 간단히 결과를 되돌릴 수 있다. 하지만 --hard 옵션은 되돌리는 것이 불가능하다. # 워킹 디렉토리의 파일까지 강제로 덮어쓴다. # commit 으로 보관되어 있다면 reflog으로 되돌릴 수 있지만, 보관되어 있지 않다면 복구하지 못한다. git reset --hard HEAD~
경로 rollback
reset 명령을 실행할 때 경로를 지정하면 1단계를 건너뛰고 정해진 경로의 파일에만 나머지 reset 단계를 적용한다.
HEAD는 포인터인데 경로에 따라 파일별로 기준이 되는 커밋을 부분적으로 적용하는 건 불가능하다. 하지만, Index나 워킹 디렉토리는 일부분만 갱신할 수 있다. 따라서 2, 3단계는 가능하다.
# 아래 명령어는 동일하다. # 1. HEAD의 브랜치를 옮긴다. (건너뜀) # 2. Index를 HEAD가 가리키는 상태로 만든다. (여기서 멈춤) # 해당 파일을 Unstaged 상태로 만든다. git add 와 반대. git reset file.txt git reset --mixed HEAD file.txt
결론 테이블
LEVEL | HEAD | Index | Workdir | WD Safe? | ||||
---|---|---|---|---|---|---|---|---|
Commit Level | ||||||||
reset --soft [commit] | REF | NO | NO | YES | ||||
reset [commit] | REF | YES | NO | YES | ||||
reset --hard [commit] | REF | YES | YES | NO | ||||
checkout [commit] | HEAD | YES | YES | YES | ||||
File Level | ||||||||
reset (commit) [file] | NO | YES | NO | YES | ||||
checkout (commit) [file] | NO | YES | YES | NO |
반응형
'vcs > git' 카테고리의 다른 글
Git을 이용한 백업 (0) | 2018.11.22 |
---|---|
Command Line Git Import (0) | 2018.03.02 |
Git config (0) | 2017.06.14 |
tig CUI git Browser (0) | 2017.05.03 |
centos git 1.7.1 upgrade (0) | 2017.04.18 |