본문 바로가기
관리자

Programming-[Base]/git

Git Commit 취소 : Reset, Revert 개념 이해하기

728x90
반응형

개요(참조)

참조할 많은 글들이 있다. 요약 정리만 해둔다. Working Directory, Index, HEAD 및 HEAD point, commit에 대한 이해가 없다면 먼저 git 공식 사이트를 보고 원리를 이해하는 것이 좋다.

 

1. git 공식 사이트

https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0

 

2. 명령어 모음

https://danidani-de.tistory.com/27

 

3. reset, revert 비교 

https://velog.io/@njs04210/Git-reset%EA%B3%BC-revert-%EC%95%8C%EA%B3%A0-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

 

 

 


 

개념

 

3가지 트리 개념

  • working directory : 내가 local에서 작업 중인 파일이다. 원본에 수정이 가해졌다면 그 기록이 여기에 남는다.
  • index : local에서 remote로 올리기 전에 변경 사항을 임시 확정짓는 stage이다. '$git add .' 명령어처럼 변경사항을 stage에 추가하면 여기에 기록된다.
  • HEAD : index의 내용이 commit되면 HEAD에 기록된다. '$git commit' 명령어로 기록한다.

 

아래 그림의 상단에 HEAD -> master -> eb43bf8은 현재의 HEAD pointer가 가르키는 branch 및 commit 기록을 도식화한 것이다. 'master' branch에서 작업하고, 'eb43bf8' 이라는 커밋을 남겼다는 뜻이 된다. 이때는 3가지 트리 모두 file.txt v1 상태이지만, 이후 내 로컬에서 file.txt의 원본을 조금이라도 수정(edit file)하면 working directory에 변경사항이 감지된다.

참조1의 그림

 

 

reset 개념

HEAD, Index, Working Directory의 내용을 과거 commit 내용으로 바꿀 수 있는 기능이다. 옵션별 동작은 하기와 같이 동작하며, 기본 옵션은 --mixed이다.

 

  • soft : HEAD만 바꾼다. 아래 도식에서 맨 마지막 file.txt v3에서 명령어를 실행했을 때, file.text v2로 HEAD Point가 옮겨가고 HEAD Tree의 정보가 이전 커밋 정보로 변경된 것을 볼 수 있다.
  • mixed : soft에 더해 Index 정보도 file.txt v2로 바꾼다. 즉, 과거 commit으로 돌아가면서 현재 local의 stage에 과거 commit의 내용을 올린다.
  • hard : mixed에 더해 working directory 정보도 과거 파일로 바꾼다. 즉, 현재 local의 파일을 아예 바꿔버린다. 따라서 file.txt v3은 완전히 제거된다. 완전히 기록을 삭제할 것이 아니라면 사용하지 않는 것이 좋다.

 

 

 

revert 개념

revert는 기존 commit 기록들은 놔두고, 특정 commit 들을 되돌리는 commit을 다시 하는 것을 의미한다. reset과의 비교는 참조 3의 그림을 보면 될 것 같다.

 

참조3.의 그림. Reset
참조 3.의 그림. Revert

 

 

주의사항

reset은 commit 기록을 삭제해버릴 수 있으므로 다른 사람과 협업 중인 branch에서는 revert만 적용한다. 보통은 내 작업만 들어가 있는 브랜치를 새로 따서 작업한 경우가 많다. 이런 경우라면 reset을 해서 commit 기록을 바꾸면 된다.

 

참고사항

git reset을 활용하여 내 브랜치의 remote에 push한 commit 기록을 날리고 싶은 경우라면 git reset 후 --force 옵션으로 push 해야한다. 왜냐하면 상기 참조 3.의 그림.Reset에서 내 로컬에서는 B점에 와있는데, remote는 D라면 remote에 push할 때 과거로 돌아가는 것이므로 warning이 뜨기 때문이다. 자세한 원리는 참조1에 나와있다.

 

 

*** force push 시에 id와 Pwd를 묻는다. id는 본인의 github Id 값을 넣으면 되지만, pwd는 github에서 settings -> development -> personal access token의 Key 값을 넣어줘야한다. 기 생성했다면 생성했던 Key를 넣어주면 된다. 따로 기록해놓지 않았다면 새로 generate해야한다.


명령어

 

 

$git log --oneline

이전 commit 기록들을 1개 라인으로 보여준다. 각 commit의 ID 값을 확인하기 편하다.

 

$git reset [--soft, --mixed, --hard] HEAD~

바로 직전의 commit을 reset한다.

 

$git reset [--soft, --mixed, --hard] HEAD~N

N개 전의 commit을 reset한다.

 

$git reset [--soft, --mixed, --hard] HEAD {특정 commit 해시값(0f21fkq)}

0f21fkq commit주소로 reset한다.

 

$git reset [--soft, --mixed, --hard] commit 번호

commit 번호의 commit으로 reset한다.

728x90
반응형