vcs/git

Git Reset - Rollback

C/H 2017. 6. 28. 11:58

# 최근 하나
git reset HEAD^
# 최근 2개
git reset HEAD~2
# commit
git commit -m ‘머라머라’
# push, + 경고 무시
git push origin +master

Git 이 관리하는 역활

HEAD
마지막 커밋 스냅샷, 다음 커밋의 부모 커밋
Index
다음에 커밋할 스냅샷
워킹 디렉토리
샌드박스

Git 관리 역활 설명

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의 주목적은 프로젝트의 스냅샷을 지속적으로 저장하는 것이다. 이 트리 세 개를 사용해 더 나은 상태로 관리한다.

현재 로컬과 저장소 상태

rollback 동작

  1. HEAD 이동
  2. Index 업데이트 
  3. 워킹 디렉토리 업데이트
# 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