본문 바로가기
Git&GitHub

[GIT 06] 작업 되돌리기

by 어쩌다개발 2023. 1. 19.
반응형

참고 : Do it! 깃&깃허브 입문

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

파일을 수정한 뒤 소스가 정상적으로 동작하지 않는 등의 이유로 수정한 내용을 취소하고 가장 최신 버전 상태로 되돌려야 할 때가 있다.
이 때, checkout 명령을 사용하면 작업 트리에서 수정한 내용을 쉽게 취소할 수 있다.

1) test.txt 파일에서 three를 적어준다.

vim test.txt

2) test.txt 파일을 수정 후 add 하지 않았으므로, 수정은 되었지만 스테이지에 올라가 있지 않다.
또한, use "git checkout -- <file>..." to discard changes in working derectory 라고 적혀있다.
작업 트리(directory) 의 변경 사항을 취소하려면 checkout 을 사용하면 된다.

3) 다음 명령어를 입력한다. 수정했을 때 입력한 three 대신 원래 적혀있던 3이 적혀있는걸 확인할 수 있다.

git checkout -- test.txt

 

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

수정된 파일을 스테이징했을 때, 스테이징을 취소하는 방법

1) vim으로 test2.txt 파일을 아래와 같이 수정한다.

vim test2.txt

2) git add 명령으로 test2.txt 파일을 스테이지에 올린 후 git status 명령으로 파일의 상태를 살펴본다.
스테이지에서 내리려면 git reset HEAD <file> 명령어를 사용하라고 되어 있다.

git add test2.txt
git status

3) git reset 명령어를 사용해 스테이지에서 test2.txt를 내린다. 수정된 test2.txt 파일이 스테이지에서 내려졌다는 메시지가 보인다.

git reset HEAD test2.txt

4) 다시 git status 를 사용해 파일의 상태를 확인해본다. 파일이 아직 스테이지에 올라가기 전으로 돌아온 것을 확인할 수 있다.

 

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

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

1) test2.txt 파일을 수정한 뒤 스테이징 및 커밋을 함께 실행한다.

vim test2.txt
git commit -am "test2.txt commit add"

2) git log를 이용해 커밋 메시지가 위와 같이 test2 commit add 인걸 확인할 수 있다.

git log

3) 최신 커밋을 되돌리려면 git reset 명령 다음에 HEAD^를 붙인다. HEAD^는 현재 HEAD가 가르키는 브랜치의 최신 커밋을 가르킨다.
이렇게 되돌리면 커밋도 취소되고 스테이지에서도 내려진다. 취소한 파일이 작업 트리에만 남는다.

git reset HEAD^

4) git log로 확인해보면 test2 commit add 가 사라진 걸 볼 수 있다. 이 방법으로 커밋을 취소하면 이 커밋 전에 했던 스테이징도 함께 취소된다.

reset option

--soft HEAD^ 최근 커밋을 하기 전 상태로 작업 트리를 되돌린다.
--mixed HEAD^ 최근 커밋과 스테이징을 하기 전 상태로 작업 트리를 되돌린다. 옵션 없이 git reset 명령을 사용할 경우 이 옵션을 기본으로 작동한다.
--hard HEAD^ 최근 커밋과 스테이징, 파일 수정을 하기 전 상태로 작업 트리를 되돌린다. 이 옵션으로 되돌린 내용은 복구할 수 없다.

 

특정 커밋으로 되돌리기 - git reset 커밋 해시

깃에는 파일을 수정하고 커밋할 때마다 저장된 버전들이 쌓여있다. git reset HEAD^ 명령으로 최신 커밋을 되돌리 수 있지만 특정 버전으로 되돌린 다음 그 이 후 버전을 삭제할 수도 있다.

1) vim rev.txt 명령어를 이용하여 파일을 생성하고, a, b, c, d 를 각각 넣은 뒤 R1, R2, R3, R4  네 개의 commit을 만든다. 

vim rev.txt
git add rev.txt
git commit -m "R1"
vim rev.txt
git commit -am "R2"
vim rev.txt
git commit -am "R3"
vim rev.txt
git commit -am "R4"

git log

2) git log로 R1 ~ R4 커밋을 확인한다. R2 메세지가 붙은 커밋으로 되돌린다고 가정하고 R2의 커밋 해시를 복사한다.

3) git reset 명령 다음에 --hard 옵션까지 입력한 후 복사 한 커밋 해시를 붙여넣는다.

4) reset R2은 R2를 리셋하는것이 아닌 최근 커밋을 R2로 리셋한다는 의미이다. 즉, R2 커밋을 삭제하는 것이 아니라 R2 커밋 이후에 만들었던 커밋을 삭제하고, R2 커밋으로 이동하겠다는 의미이다.

5) rev.txt 를 확인해보면 R2 커밋 시점의 내용으로 변경되어있다.

cat rev.txt

 

커밋 삭제하지 않고 되돌리기 - git revert

커밋으로 되돌릴 때 수정했던 것을 삭제해도 된다면 git reset 명령을 사용하면 되지만, 나중에 사용할 것을 대비해서 커밋을 되돌리더라도 취소한 커밋을 남겨두어야 할때가 있다. 이때는 git reset 이 아닌 git revert 라는 명령을 사용한다.

1) rev.txt 파일에 e 알파벳을 추가한 후 "R5" 메세지로 add 및 commit 해준다.

vim rev.txt

2) git log 명령어로 log를 R5가 추가된걸 확인한다.

git log

3) revert 명령어를 이용하여 가장 최근에 커밋한 R5를 취소하고, R5 직전 커밋인 R2로 돌아간다.

git revert [R5 커밋 해시]

4) revert 명령어를 실행하면 깃을 설치할 때 지정했던 기본 편집기가 자동으로 나타나고, 커밋 메세지를 입력할 수 있다.
커밋 메세지에 상위에 기본으로 어떤 버전을 revert 했는지 표시되어 있다. 추가로 내용을 입력하고 저장한다.

5) git log로 확인해본다. R5를 revert 한 새로운 커밋이 생겼다. 그리고 기존의 R5는 사라지지 않고 남아있다. R5를 지우는게 아닌 R5에서 변경했던 이력을 취소한 새 커밋을 만든것이다.

git log

6) rev.txt 를 확인해보면 R2 내용으로 돌아간 것을 확인할 수 있다.

cat rev.txt

반응형

댓글