본문 바로가기
PROGRAM

[Git 적응기] SVN의 Revert, Git에서는 checkout/reset

by ojava 2020. 10. 12.
반응형

SVN에서 Git으로 넘어온지 얼마 안된 Git어린이의 적응기

 

로컬 환경의 내용을 서버의 내용으로 돌리고자 할 때 자주 사용하던 Revert

- 수정하다가 다시 서버에 올려뒀던 내용으로 덮어쓰고 싶을 때
- 로컬에서 삭제한 파일을 다시 서버에 있는 내용으로 불러와서 살리고 싶을 때
- 새로 추가하겠다고 일단 add는 해놨는데 이 파일들이 실제 commit까지 갈 필요는 없을 때 등

 

Git의 경우도 크게 다르지 않겠거니하고 자연스럽게 Revert를 찾았는데 보이질 않는다.
그래서 일단 Re* 로 시작하는 다른 기능들을 찾아봤는데 다음과 같은 기능을 하는 것으로 보인다.

1) Rebase
merge랑 비슷한 역할을 하는 명령어로 한 브랜치의 변경 사항을 다른 브랜치에 적용할 수 있는 명령어다.
일단 revert랑은 전혀 관계가 없다.

2) Reset
최근에 일어난 commit 명령을 이전으로 되돌린다.
옵션에 따라 다르게 수행되지만, 기본적으로 서버의 커서 역할을 하는 HEAD를 이전 commit 이력으로 되돌리고 staging area 영역의 내용까지 HEAD가 가리키는 상태로 만든다.
(SVN으로 말하자면, 현재 바라보고 있는 최종 revision을 이전 revision으로 바라보도록 함. 이력은 유지)

여기서 --hard 옵션을 주게 되면, working directory에 있는 파일까지 다 엎어쓰게 되버린다.
되돌릴 수 없기 때문에 reset 명령어는 아주 주의해서 사용해야 한다. 사실 명령어 이름부터 좀 무섭다. 리셋이라니

3) checkout
Re* 로 시작되지는 않는데 Reset 공부하다보니 나와서 checkout에 대해서도 알아봤다.

Reset과 유사한 기능을 수행하지만 내부적으로는 완전 다르게 움직이고, 조금 더 안전한 명령어다.
Branch가 여러 개 일때 조금 더 유용할 듯 한 방식인데 Reset이 HEAD를 이전 commit 이력으로 돌리는 것을 기본으로 하고 있다면, checkout는 HEAD의 변화없이 브랜치를 이동시킨다. 

 

기본적으로 SVN과 Git의 구조가 일부 다르기 때문에 위와 같은 기능 분할이 필요한 것으로 보인다.

SVN의 경우는 로컬 영역에서의 Commit이 곧바로 중앙서버로의 전송을 의미하는 것이므로 Revert 기능 하나로 내가 원하는 기능을 다 처리할 수 있었으나, Git은 Working Directory에서 Staging Area (Commit 대기 장소, Index) 로 올리는 작업과 해당 대상을 Git Repository로 올리는 Commit & Push 과정으로 세분화되어 있기 때문에 더 상세한 기능 분리가 필요하다.
실제로는 Branch가 나뉘어 있어서 더 복잡해질 가능성이 매우 크다 ^_ㅜ

 

** 결론

나의 경우는 commit history 자체를 변경하는 게 아니라, 특정 파일에 대해서 되돌리고 싶은 경우라 HEAD가 뭘 가리키고 할 필요가 없이 특정 파일명 또는 디렉토리명을 명시해야 하므로 Reset, Checkout 둘 다 비슷한 역할을 한다.

ex. 수정한 내용을 다시 서버에 올려뒀던 내용으로 덮어쓰고 싶을 때, 로컬에서 삭제한 파일을 살리고 싶을 때
git checkout -- 파일명 

ex. 새로 추가하겠다고 일단 add는 해놨는데 이 파일들이 실제 commit까지 갈 필요는 없을 때 (unstaged 하고 싶을 때)
git reset HEAD 파일명

 

결론적으로 SVN의 Revert 기능을 수행할 수 있는 Git의 기능은 checkout / reset 이다.
각자 하는 역할이 조금씩 다르므로 원하는 방향에 맞춰 안전하게 일하자. 뭐든 덮어쓴다는 건 안전하기 힘들다는 점.

 

아래 참고자료에 Reset 기능과 Checkout 기능에 대해 아주 상세하고 그림으로도 잘 표기한 자료가 있으니 참고하면 큰 도움이 될 거라고 확신한다.

[참고] 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

 

Git - Reset 명확히 알고 가기

지금까지 reset 명령을 실행하는 기본 형태와 사용 방법을 살펴봤다. reset 명령을 실행할 때 경로를 지정하면 1단계를 건너뛰고 정해진 경로의 파일에만 나머지 reset 단계를 적용한다. 이는 당연한

git-scm.com

Git 공부에 있어서 튜토리얼 사이트만큼 좋은 곳이 없다.
물론 들어가서 심심할 때 보는 건 아니고 검색할 때마다 나와서 계속 보는 중 '^'

 

또한 Reset 보다 더 도움이 많이 된 내용은 되돌리기에 대해 작성된 부분
이 내용이 더 유용하게 자주 사용될 듯 하며, 여기서 reset / checkout 사용 방식도 안내되어 있으니 꼭 읽어보시길

git-scm.com/book/ko/v2/Git%EC%9D%98-%EA%B8%B0%EC%B4%88-%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0#_unstaging

 

Git - 되돌리기

이렇게 --amend 옵션으로 커밋을 고치는 작업은, 추가로 작업한 일이 작다고 하더라도 이전의 커밋을 완전히 새로 고쳐서 새 커밋으로 변경하는 것을 의미한다. 이전의 커밋은 일어나지 않은 일이

git-scm.com

 

반응형