초보 개발자

2 - 3 작업 되돌리기 본문

깃 & 깃허브

2 - 3 작업 되돌리기

taehyeki 2021. 9. 13. 22:56

작업 트리에서 수정한 파일 되돌리기 - git checkout

스테이지에 올렸던 파일을 내리거나 커밋을 취소하는 등 각 단계로 돌아가는 방법에 대해 알아보자

 

파일을 수정한 뒤 소스가 정상적으로 동작하지 않는 등의 이유로 수정한 내용을 취소하고 가장 최신버전 상태로 되돌려야 할 때가 있다. 이럴 때 일일이 수정한 소스를 찾아서 직접 되돌리면 참 번거러울 것이다.

이럴 때 checkout이라는 명령어를 사용하면 작업 트리에서 수정한 내용을 쉽게 취소할 수 있다.

 

hello.txt를 열어 3rd line을 three로 변경해보겠다.

git status를 해본다면 hello.txt는 커밋에 올라가 있기 때문에 tracked상태일 것이고, 수정이 되었기 때문에

changes not staged for commit 과 modified: hello.txt가 나올 것이다.

git checkout -- hello.txt

위와 같이 입력을 해보자 정상적으로 처리 된다면 화면에는 아무것도 나타나지 않는다.

그리고 cat hello.txt를 해보면 우리가 수정했던 내용이 사라지고 3rd line이라고 다시 적혀있는 것을 확인할 수 있다. 

커밋 된 상태의 파일(버전관리 중)을 수정 내역을 되돌리고 싶을 때(unstaged 상태) git checkout -- 이라는 명령어를 적으면 된다.

하지만 git 2.23버전 이후 업데이트 된 것에 의하면 restore을 사용해도 된다.

checkout은 restore와 switch로 나뉘어 졌다,

checkout으로 되돌린 내용은 다시 복구할 수 없다.

 

변경 이전
git checkout -- hello2.txt

변경 이후
git restore -- hello2.txt

 

 

스테이징 되돌리기 - git reset HEAD 파일 이름

앞에서는 파일의 수정을 취소하고 원래대로( tracked상태 이지만 스테이징 하지 않았을 때) 되돌렸습니다. 이번에는 수정된 파일을 스테이징했을 때, 스테이징 취소하는 방법을 알아보자.

hello.txt의 파일에서 기존내용을 삭제하고 대문자 A,B,C,D를 입력 저장한 뒤 

git add hello2.txt
git status

를 해보면 tracked상태 이기때문에 modified라고 뜨는 것으 확인할 수 있다. tracked되지 않으면 new file 일 것이다.

 

콘솔 창에서는 스테이징에서 내리려면 git restore --staged hello2.txt를 하라고 나와있지만 

책의 내용을 보면 git reset HEAD hello2.txt를 하라고 나와있다. 책의 내용대로 해보자

( git 2.23 버전 업데이트 이후 git restore을 사용한다. 우리는 현재 2.33)

HEAD 다음에 파일 이름을 지정하지 않으면 스테이지에 있는 모든 파일을 되돌린다고 한다.

Unstaged changes after reset: 수정된 hello2.txt가 스테이지에서 내려졌다는 메시지가 나타났다.

다시 git status를 해보면 Changes not staged for commit: 이라는 메시지가 뜨는 것을 확인할 수 있다.

여기서

git checkout -- hello2.txt

git restore -- hello2.txt 를 하면 수정한 내용 또한 되돌아간다.

 

콘솔에 나와있는대로 스테이징 되어 있는 녀석을 git restore --staged hello2.txt해도 위와 똑같이 잘 스테이징에서 내려가는 것을 확인할 수 있다.

중간에 오타가 났다.

 

최신 커밋 되돌리기 - git reset HEAD^

이번엔 수정된 파일을 스테이징하고 커밋까지 했을 때, 가장 마지막에 한 커밋을 취소하는 방법을 알아보자

 

hello2.txt 수정해보자 "A,B,C,D,E"

git commit -am "message4" 를 해주어 git add 스테이징 과정을 생략하고 바로 커밋을 해주었다. ( tracked상태이기에 가능 )

최신 커밋을 되돌리려면 git reset HEAD^를 붙인다. HEAD^는 현재 HEAD가 가리키는 브랜치의 최신 커밋을 가린다.

HEAD -> master이 붙은 것이 가장 최신 커밋이다.

이렇게 되돌리면 커밋도 취소되고 스테이지에서도 내려진다. 취소한 파일이 작업트리에만 남는다.

수정 된 상태로만 남는 것을 확인할 수 있다.

참고로 최근 n개의 커밋을 취소하려면

git reset HEAD~5

와 같이 사용한다.

git reset --soft HEAD^ 최근 커밋을 하기 전 상태로 작업트리를 되돌림

git reset --mixed HEAD^ 최근 커밋과 스테이징을 하기 전 상태로 작업트리를 되돌림

git reset --hard HEAD^ 최근 커밋과 스테이징, 파일 수정을 하기 전 상태로 작업 트리를 되돌림( 복구 불가 )

이해는 잘 가지 않는다.. 차차 알아보도록하자

 

정리를 해보면

 

우리가 작업트리에서 커밋된 내용을 수정했을 때 (Changes not staged for commit: & modified ) 다시 원래대로 돌리려면 2가지 방법이 있다.

git restore -- 파일이름
git checkout -- 파일이름

-> 수정 전 내용으로 돌아감

 

우리가 스테이징을 한 뒤 스테이징에서 내릴 때 ( Changes to be commited & modeified

git restore --staged 파일이름
git reset HEAD 파일이름

-> 스테이징 전으로 돌아감 ( 작업트리에서 수정은 된 상태 )

 

우리가 최신 커밋을 취소할 때

git reset HEAD^

-> 최신 커밋된 상태를 취소함 + 스테이징 전으로 돌아감 ( 작업트리에서 수정은 된 상태 )

 

만약 a라는 파일에서(a만 적힘) bc를 추가 한 뒤 commit 을 해보자 message는 +bc

여기서 git reset HEAD^를 하면 과연 a파일에 a만 남아있을까?? 아니다 

작업트리에 수정된 상태로 abc가 남아 있다. 

 

근데 git reset --hard HEAD^를 하면  작업트리에 수정되지 않은 상태인 a가 그대로 남아있게 된다.

 

'깃 & 깃허브' 카테고리의 다른 글

3 - 1 깃과 브랜치  (0) 2021.09.14
2 - 4 특정 커밋으로 되돌리기  (0) 2021.09.13
2 - 2 깃 버전과 상태  (0) 2021.09.13
2 - 1 깃 저장소 만들기 (add, commit)  (0) 2021.09.13
git....github...  (0) 2021.09.13