작업을 하고 소스코드가 정상적으로 동작하지 않아 이전버전으로 되돌려야할때 수정한 내용을 하나하나 찾아서 다시 변경하기는 매우 번거롭습니다.
간판단 예제 코드면 또 모를까,, 코드가 길어지면 길어질수록 아주 번거롭겠죠?
이럴 때 checkout 명령을 사용하면 작업트리에서 수정한 내용을 쉽게 취소할수 있습니다.
1. 수정파일 되돌리기(checkout)
vim hello.txt
먼저 vim을 이용해 hello.txt파일의 3을 three로 변경하겠습니다.
git status
status명령으로 확인해보면 hello.txt는 수정되었지만 스테이징 되어있지 않습니다.
git checkout -- hello.txt
git checkout -- 명령어 뒤에 파일 이름을 적어주면 해당 파일이 이전상태로 되돌아 간것을 볼수 있습니다.
vim을 이용해서 다시한번 확인 해볼까요??
vim hello.txt
three로 바꾸었던 부분이 다시 333으로 돌아왔죠?
2. 스테이지 내리기(git reset HEAD)
이번에는 수정된 파일을 스테이징까지 했을때 스테이징을 취소하는 방법입니다.
vim을 사용해서 hello2.txt파일의 기존의 소문자들을 삭제하고 A, B, C, D를 입력해보겠습니다.
vim hello2.txt
git add 명령으로 스테이징 해보겠습니다.
git add hello2.txt $git status
이제 reset명령을 통해 스테이지에서 내려볼까요?
git reset HEAD hello2.txt
git reset HEAD명령을 이용하니 unstaged 메세지가 나타납니다.
스테이지에서 내려졌다는 의미입니다.
git status
다시한번 상태를 확인해보면 파일이 스테이지에 올라가기전 상태와 같네요!
3. 최근 커밋 되돌리기(git reset HEAD^)
이번에는 커밋된 파일중 최근에 커밋을 되돌리는 명령입니다.
vim을 이용해서 hello2.txt파일에 E를 추가해보겠습니다.
vim hello2.txt
수정했다면 git commit 명령을 통해 스테이징과 커밋을 함께 실행해보겠습니다.
git commit -a -m과 같이 -a 옵션과 -m 옵션을 따로 써도 되지만 -am 처럼 함께 써도 됩니다.
커밋 메세지는 "message111"로 하겠습니다.
git commit -am "message111"
커밋메세지 "message111"의 방금 커밋한 커밋내용이 있습니다.
git reset HEAD^
git reset HEAD^ 명령을 사용하면 최근 커밋을 되돌리게 됩니다.
HEAD^는 현재 HEAD가 가르키는 브랜치의 최신 커밋을 의미합니다.
git log 명령을 실행하면 가장 최근커밋에 (HEAD->master)표시가 있었습니다.
이렇게 되돌리면 커밋도 취소되고 스테이지에서도 내려집니다.
취소한 파일은 작업트리에만 남게 되는것으빈다.
또한 최근 3개의 커밋을 취소하려면 HEAD~3처럼 사용할수 있습니다.
git reset HEAD~3
다시한번 로그를 보면 "message111"의 커밋메세지는 사라진걸 볼수 있습니다.
git reset명령의 옵션
(reset 명령은 사용하는 옵션에 따라 되돌릴 수 있는 단계가 다릅니다.)
명령
|
설명
|
--soft HEAD^
|
최근 커밋 이전 상태로 작업 트리를 되돌립니다.
|
--mixed HEAD^
|
최근 커밋과 스테이징 이전 상태로 작업트리를 되돌립니다.
옵션 없이 git reset명령을 사용할 경우 이 옵션이 기본으로 작동합니다.
|
--head HEAD^
|
최근 커밋과 스테이징, 파일 수정을 하기 이전 상태로 작업트리를 되돌립니다.
이 옵션으로 되돌린 내용은 복구할수 없습니다.
|
4. 특정 커밋으로 되돌리기(git reset 해시)
최근 커밋을 되돌리는 방법도 있지만 깃을 사용하다 보면 수많은 버전들이 쌓이게 됩니다.
이런 버전들속에서 특정 커밋으로 되돌릴때는 git reset 명령 다음에 커밋 해시를 사용합니다.
테스트를 위해 vim을 사용해 rev.txt파일을 만들겠습니다.
vim rev.txt
a하나만 입력하고 저장해주세요!
git add rev.txt
git commit -m "R1"
이제 스테이징과 커밋까지 함께 하겠습니다.
커밋메세지는 "R1"으로 하겠습니다!
이번에는 rev.txt에 b를 추가해준뒤 "R2"를 커밋메세지로 하고 커밋을 하겠습니다.
vim rev.txt
git add rev.txt
git commit -m "R2"
이번에는 c문자를 추가하고 R3메세지로 커밋하겠습니다.
vim rev.txt
git add rev.txt
git commit -m "R3"
마지막으로 d를 추가하고 "R4"라는 이름으로 커밋하겠습니다.
vim rev.txt
git add rev.txt
git commit -m "R4"
이제 로그명령을 이용해서 커밋내역을 확인해볼까요??
git log
노란글씨의 commit 오른쪽에 나와있는 해쉬값을 이용해서 해당 커밋으로 되돌릴수 있습니다.
만약 A로 리셋을 한다면 A이전으로 돌아간 다는 의미가 아니라 A로 돌아간다는 의미입니다.
저는 R2로 되돌리기 위해 R2 옆에있는 해쉬값을 복사하겠습니다( Ctrl + C가 안된다면 우클릭해서 복사해주세요!)
git reset --hard 91e0cb8ee32178744825eedc3941b9fffbce0a0e
HEAD가 방금 복사한 해쉬값으로 옮겨갔습니다!
즉, 조금전 명령으로 인해서 되돌린 커밋내역이 가장 최신 커밋이 된것입니다.
git log
log를 이용해 확인해보면 R3와 R4의 기록은 완전히 사라졌습니다.
5. 커밋 삭제하지 않고 되돌리가(git revert)
reset명령을 이용하면 커밋을 되돌리더라도 삭제가 됩니다.
그러면 되돌린 이후에 복구가 안되지만 경우에 따라서 복구가 필요할 때도 있을 것입니다.
혹시나 삭제하지 않고 되돌릴수 있는 방법은 없을까요?
지금 현재 커밋은 R2가 되어있을겁니다.
e문자를 추가하고 저장해보겠습니다
vim rev.txt
그리고 "R5"로 커밋해보겠습니다.
git add rev.txt $git commit -m "R5"
그러면 R2 다음으로 R5가 커밋되어있습니다.
이제 R5를 지우지 않고 R2로 돌아가려면 revert 명령을 사용하면 됩니다.
가장 최근에 커밋한 R5를 취소하고 R2로 돌아가기 위해서는 R5의 해쉬값을 복사합니다.
reset의 경우에는 돌아가고 싶은 지점의 커밋을 복사했지만 revert의 경우는 취소하고자 하는 버전의 해시가 필요합니다.
git revert 57350b8921aabc22a7c94986f3bf9902d14d64b5
해당 화면이 나올텐데요 vim으로 텍스트편집을 하는것과 같이 I를 누르고 남겨둘 내용을 적어둘수 있습니다.
빠져 나올떄는 마찬가지로 ESC와 :wq를 입력하면됩니다.
git log
log로 확인해보면 "R5"가 삭제되지않고 "R5"를 제외한 새로운 커밋내역이 생겼습니다!
cat rev.txt
cat 명령으로 텍스트파일을 확인해보명 e가 사라진 R2의 내용인것을 확인할수 있습니다!
본 포스팅은 DO it! 지옥에서 온 문서 관리자 깃&깃허브 입문 도서를 참고하며 공부한 내용을 포스팅 하였습니다.
'Git > Github' 카테고리의 다른 글
[Git & GitHub] 브랜치(branch) 만들기 (0) | 2022.06.17 |
---|---|
[Git & GitHub] Branch?브랜치란? (0) | 2022.06.16 |
[Git & GitHub] 깃허브 방금 커밋한 메세지 수정하기 --amend (0) | 2022.06.14 |
[Git & GitHub] 깃허브 .gitignore 파일로 버전관리 제외하기 (0) | 2022.06.13 |
Git & GitHub_04 깃허브로 버전 관리하기(add, commit, diff, status, log) (0) | 2022.06.12 |