티스토리 뷰

원격 저장소에 push하지않고(공유된 커밋x) 내 로컬에서만 관리되던 커밋을 기준으로 되돌리는 법을 작성하였습니다.

커밋을 변경하는 방법(git commit --amend)

  • 해당 방법은 가장 최신의 커밋을 변경하는 방법이다.
  • 이미 커밋한 내용을 수정하거나 커밋 메세지를 변경할 수 있다. 
  • 텍스트 편집기(vim)이 열리고, 수정할 수 있는 커밋 메세지가 표시된다. 원하는 대로 수정한 후 저장하면 커밋이 변경된다.

이전 커밋으로 돌아가는 방법(git revert 또는 git reset)

git revert HEAD #가장 최근 커밋을 스테이징 상태로 되돌린 후 vim(텍스트에디터)가 자동 실행된다.
git reset HEAD^ #포인터와 함께 가장최근 커밋을 언스테이징 상태로 되돌린다.
  • 이미 커밋한 내용을 삭제하거나 이전 상태로 되돌리는 방법이다.
  • 이미 커밋한 내용을 삭제하면서 기록을 유지하려면 `git revert`를 사용해야 한다. -> 즉, 원래ㅎ 커밋을 날리지 않고 스테이징 상태로 되돌리고 싶다면 revert 활용
  • git revert HEAD는 가장 최신의 커밋을 취소하고 새로운 커밋을 생성한다. 커밋 메세지를 작성하고 저장하면 새로운 커밋이 생성되며, 이전 커밋의 변경 내용이 취소된다. 
  • git revert HEAD와 git reset HEAD^는 거의 동일하게 동작하는 듯해보이나 revert는 덮어쓰는 새 커밋을 작성하는 것으로 다른 커밋에 영향을 미치지 않아 협업을 할때는 reset보다는 revert를 권한다. reset은 공유되지 않은 커밋(내 로컬에서 아직 원격저장소로 공유되지않은 커밋)이라면 사용해도될 거 같다.
it reset HEAD만 사용하면 변경사항이 있을 때, 동작하지 않았다. 여기서 변경사항이란 unstaged changes를 말한다. 하지만, 동일하게 unstaged changes가 있을 때, 포인터(^)와 함께 `git reset HEAD^` 명령어를 써주니 내가 원하는 대로 이전 커밋의 변경 파일도 되돌아오고 커밋 기록(log)역시 사라졌다.

결론적으로 revert 는 기록을 남기지만(커밋을 덮어쓰는 새 커밋을 작성하는 것이기 때문) 공유된 커밋일 경우 안전하게 처리가 가능하고, reset은 기록 역시 깔끔하게 지울 수 있지만 원격 저장소(gitHub)에 공유된 커밋일 경우는 안전하게 처리가 불가능하기 때문에 로컬에서만 다룬 커밋일 경우에 사용하면 좋을 거 같다.

내 커밋이 원격에 push된 적이 없고 로컬에서만 관리되던 커밋이라면 revert를 쓰든 reset을 쓰든 아무 상관 없다. 오히려 기록까지 안남기는 `git reset HEAD^`가 revert보다 개인적으로 좋아보인다.
  • 두 명령어가 커밋을 되돌렸을 때 변경된 파일 내역까지 사라지게 하는 것일까봐 걱정했으나 그렇지 않다. 

😈 `git revert`와 `git reset`은 이미 공유된 커밋 기록을 변경하는 것이므로 주의해야 한다. (여기서 말하는 공유된 커밋 기록이란 원격저장소인 github에 내 팀원들에게 공유된 commit을 말한다. 즉, 내 커밋을 원격 저장소에 push한 commit)

 

revert 명령어와 vim( git 텍스트 편집기)

revert의 경우, 명령어 실행 시, vim 텍스트 에디터를 실행하게 되는데 여기서 당황하여 :wq(저장 후 종료)명령어를 입력하게 되면 자동으로 commit이 되니 주의해야 한다. 

 

최신 커밋을 되돌리고 스테이징 상태로만 되돌리고싶다면 명령모드로 진입(esc키)하여 :wq가 아니라 :q! 명령어로 빠져나오면 된다.

 

vim 명령어 목록
i 현재 위치에서 편집 모드로 전환
Esc 편집 모드에서 명령 모드로 전환
:w  변경 내용 저장
:q  편집기 종료 (저장하지 않은 변경 사항이 있는 경우 종료되지 않음)
:wq 또는 :x  변경 내용 저장하고 종료
:q! 변경 내용을 저장하지 않고 종료(그냥 빠져나오기)



댓글