이전 포스팅까지는 스테이징과 커밋의 과정을 살펴보았는데, 이번에는 스테이지에 올렸던 파일을 내리거나 커밋을 취소하는 과정 등에 대해 알아보자.
밑에 커밋 로그 기록에서 4th 와 5th를 4rd 와 5rd 로 잘못 기입했는데 너그러이 이해 바랍니다.
작업 트리에서 수정한 파일 되돌리기 ( git restore )
파일을 수정한 후, 어떠한 문제에 의해 수정 내용을 취소하고 가장 최신 버전의 상태로 복구해야 할 경우가 있다. 수천 수백 줄의 소스코드의 경우라면 일일이 수정하는 것이 매우 번거로운 작업일테지만, 깃의 도움을 받으면 쉽게 복구할 수 있다.
위의 사진처럼, hello.txt 파일의 내용을 일부 수정하였다. git status를 통해 살펴보니 작업 트리의 변경 사항을 버리려면 git restore를 사용하라고 되어있다.
$ git restore hello.txt
위의 명령을 입력해보자.
vim 을 통해 hello.txt 를 확인해보니 수정하기 전의 상태로 복구되었고, git status로도 확인해보니 working tree clean 이라는 문구가 나온다.
스테이징 되돌리기 ( git restore --staged 파일이름 )
위의 git restore 같은 경우에는 파일의 수정을 취소 후 원래대로 복구하는 작업이었다면, 이번에는 수정된 파일을 스테이징 했을 때, 스테이징을 취소하는 작업이다.
$ vim hello2.txt 를 통해 hello2.txt 파일의 내용을 일부 수정한 후,
$ git add hello2.txt
를 사용하여 hello2.txt 파일을 스테이지에 올렸다.
수정된 hello2.txt가 스테이지에 올라온 것을 확인할 수 있는데, 밑에 문구를 보니 git restore --staged 명령어를 쓰라고 한다. 사실, 깃이 새로운 버전으로 업데이트 되면서 원래 위의 작업 트리 되돌리기의 restore과 스테이징 되돌리기의 restore --staged 명령어로 바뀐 것이지 이전에는 각각 checkout 명령과 reset 명령이 존재했었다. 새 버전이 생기면서 굳이 둘을 따로 숙지해두지 않아도 restore과 그 뒤에 --staged 만 붙여주면 되니 훨씬 사용하기가 편리해졌다.
$ git restore --staged hello2.txt
명령을 사용하여보자.
스테이지에 올라갔던 hello2.txt 파일이 정상적으로 스테이지에서 내려온 것을 확인할 수 있다.
최신 커밋 되돌리기 ( git reset HEAD^ )
이번에는 수정된 파일을 스테이징하고 커밋했을 때, 가장 마지막에 한 커밋을 취소하는 방법이다.
위에서 스테이징 되었던 hello2.txt 파일을 스테이지에서 내렸지만 여전히 modified 그리고 tracked 인 상태이다. 이전 포스팅에서 tracked 되고있는 파일이 modified 되었을 때 스테이지에 올리지 않고 바로 커밋을 할 수 있는 명령어가 있다고 했었는데, git commit -am "커밋메시지" 였다. 이를 활용하여 hello2.txt 가 변경된 버전을 바로 커밋해보자.
$ git commit -am "5rd commit"
git log 명령을 통해 "5rd commit" 버전이 잘 커밋된 것을 확인할 수 있다.
최신 커밋을 되돌리기 위해서는
$ git reset HEAD^
명령을 사용한다. 아쉽게도 커밋이 된 버전을 이전 버전으로 되돌리는 명령어에는 restore가 적용이 되지 않나보다(적용이 된다면 알려주세요). 그래서 reset 명령어를 따로 숙지를 해둬야 할 것 같다.
HEAD^는 현재 HEAD가 가리키는 브랜치의 최신 커밋을 의미한다. 위의 명령을 사용하면 커밋도 취소되고, 스테이지에서도 파일이 내려간다. 수정된 그대로 작업 트리에만 남는 것이다.
정상적으로 커밋이 취소되고, 스테이지에서 파일이 내려갔으며 작업 트리에만 수정된 상태로 남아있음을 확인할 수 있다.
** git reset 명령의 옵션들
reset 명령은 사용하면 옵션에 따라 되돌릴 수 있는 단계가 다르다.
--soft HEAD^ : 커밋을 하기 전 상태로 작업 트리를 되돌린다. 즉, 스테이지에는 파일이 올라와있는 상태로 되돌린다.
--mixed HEAD^ : 최근 커밋과 스테이징을 하기 전 상태로 되돌린다. 즉, 파일이 modified 되었고, 스테이지에는 오르지 않은 상태로 되돌린다. git reset 명령 뒤에 아무 옵션 없이 사용할 경우 기본적으로 이 옵션이 작동한다.
--hard HEAD^ : 최근 커밋, 스테이징, 파일 수정을 하기 전 상태로 작업 트리를 되돌린다.
특정 커밋으로 되롤리기 ( git reset 커밋해쉬 )
앞에서 살펴본 git reset HEAD^ 명령으로 최신 커밋을 되돌릴 수도 있지만 특정 버전으로 되돌린 다음 그 이후 버전을 삭제할 수도 있다. 특정 버전의 커밋으로 되돌릴 때는 git reset 명령 뒤에 커밋 해쉬를 붙여준다.
vim을 이용해 새로운 텍스트 파일 rev.txt 를 만들고, rev.txt를 스테이징한 후 "R1"이라는 커밋 메시지와 함께 커밋한다.
그 후, rev.txt 파일을 수정 후 "R2"라는 커밋 메시지와 함께 커밋한다. 같은 방법으로 수정 후 "R3", 수정 후 "R4"라는 커밋 메시지와 함께 커밋한다. 현재까지 총 4번의 커밋을 했다.
git log 명령을 사용하여 지금까지 만든 커밋을 확인해보면, 각 커밋은 커밋 해쉬가 같이 나타나있다. 위의 커밋들 중 R2 커밋 버전을 최신 버전으로 만들어보자.
** reset을 이용하여 커밋 해시를 사용해 되돌릴 때 주의사항이 있다. 예를 들어 reset A를 입력하면 이는 A 커밋을 리셋하는 것이 아니라 최근 커밋을 A로 리셋한다는 것이다. 즉, A 커밋을 삭제하는 것이 아니라 A 커밋으로 최신 커밋이 리셋되고, 그 이후에 만들었던 커밋이 삭제된다는 것이다.
$ git reset --hard 커밋해쉬
명령을 사용한다.
위와 같이 R2가 최신 버전의 커밋이 되고 R3, R4는 삭제되었음을 알 수 있다.
커밋 삭제하지 않고 되돌리기 ( git revert )
위의 reset 을 하면 최신화된 커밋 이후의 커밋들은 삭제가 되었던 것을 알 수 있었다. 만약 커밋을 되돌리더라도 취소한 커밋을 남겨두고 싶다면 이 때는 git reset 이 아니라 git revert 명령을 사용해야한다.
rev.txt 파일을 수정한 후, "R5"라는 커밋메시지와 함께 커밋을 해보자. git log를 통해 확인해보면 R1, R2, R5의 3개의 커밋이 있을 것이다.
위에서 reset 명령을 사용하여 R2 버전을 최신 커밋으로 돌리고 싶을 때는 git reset 뒤에 R2의 커밋해쉬를 넣었지만 revert 명령의 경우는 revert 명령 뒤에 취소하려고 하는 버전, 즉 R5의 커밋 해쉬를 지정해주어야 한다.
$ git revert R5의 커밋해쉬
revert 명령을 실행할 때는 기본 편집기가 자동으로 실행되면서 커밋 메시지를 입력할 수 있다. 커밋 메시지의 맨 위에는 어떤 버전을 revert 했는지 알려주고, 아래와 같이 문서 맨 위에 revert 하면서 추가로 남겨둘 내용을 입력하고 저장할 수 있다.
$ git log를 통해 R5버전이 잘 revert 되었는지 확인해보자.
위의 로그를 살펴보면 R5를 revert한 새로운 커밋이 생겼다. 그리고 기존의 R5역시 사라지지 않았다. 즉, R5를 지우는 대신 R5에서 변경했던 이력을 취소한 새 커밋을 만든 것이다.
/ /문제제기 및 피드백 언제든지 감사히 받겠습니다.
'Computer Science > Git || Github' 카테고리의 다른 글
Git 파일 상태 (0) | 2021.08.31 |
---|---|
Git 입문 (스테이징과 커밋) (0) | 2021.08.31 |