Ch 9. 작업 되돌리기

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

 

1. 빔 편집기에서 hello.txt 파일을 엽니다. 그리고 숫자 '3'을 'three'로 수정한 후 저장하고 편집기를 종료합니다.

$ vim hello.txt

 

2. hello.txt 파일의 상태를 알기 위해 git status 명령을 사용합니다. hello.txt가 수정되었지만 아직 스테이지에 올라가 있지 않습니다. 두 번째 괄호 안의 메시지를 보면, 작업 디렉터리의 변경 사항을 취소하려면 restore 명령을 사용하라고 되어있습니다. 

 

 

3. hello.txt의 수정 사항을 취소하기 위해 git restore 명령 다음에 한 칸 띄고 파일 이름을 씁니다.

$ git restore hello.txt

 

4. restore 명령이 정상적으로 처리되었다면 화면에는 아무것도 나타나지 않습니다. cat 명령을 사용해 파일 내용을 확인해봅니다. 앞에서 수정한 'three'가 사라지고 '3'이 그대로 남은 것을 확인할 수 있습니다.

$ cat hello.txt

 

 

스테이징 되돌리기 - git restore --staged

 

1. 빔을 사용해서 hello2.txt를 수정하겠습니다. 기존 내용을 삭제하고 대문자 A,B,C,D를 입력한 후 저장하고 편집기를 종료합니다.

$ vim hello2.txt

 

2. git add 명령으로 hello2.txt 파일을 스테이지에 올린 후 git status 명령으로 파일 상태를 살펴봅니다. 

$ git add hello2.txt
$ git status

 

3. 상태 메시지에서 괄호 안의 내용을 보면, 스테이지에서 내리려면 git restore --staged <file> 명령을 사용하라고 되어있습니다.

 

 

4. 스테이징을 취소할 때는 restore 명령 뒤에 --staged 옵션을 붙이는데, 이 옵션만 사용하면 스테이지에 있는 모든 파일을 한꺼번에 되돌릴 수 있고, --staged 옵션 뒤에 파일 이름을 넣으면 해당 파일만 골라서 되돌릴 수 있습니다.

 

$ git restore --staged hello2.txt

 

5. git status 를 사용해서 파일 상태를 확인해봅니다. 파일이 아직 스테이지에 올라가기 전으로 돌아온 것을 확인할 수 있습니다.

 

 

 

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

 

1. 빔을 열고 대문자 E를 끝에 추가한 후 저장합니다.

 

$ vim hello2.txt

 

2. git commit 명령을 사용해 스테이징과 커밋을 함께 실행합니다. 커밋 메시지는 message4로 합니다.

 

$ git commit -am "message4"

 

3. git log 명령을 사용해서 제대로 커밋되었는지 확인해봅니다. 

 

 

4. 최신 커밋을 되돌리려면 git reset 명령 다음에 HEAD^를 붙입니다. HEAD^는 현재 HEAD가 가리키는 브랜치의 최신 커밋을 가리킵니다. git log 명령을 실행했을 때 가장 최신 커밋에 (HEAD -> main) 표시가 되어있습니다. 이렇게 되돌리면 main의 최신 커밋도 취소되고 스테이지에서도 내려집니다. 작업 트리에만 파일이 남는 것입니다.

 

$ git reset HEAD^

 

5. hello2.txt 파일의 커밋이 취소되고 스테이지에서도 내려졌다는 메시지가 나타납니다.

 

 

6. git log 명령으로 메시지가 message4인 커밋이 사라진 것을 볼 수 있습니다. 이 방법으로 커밋을 취소하면 커밋 전에 했던 스테이징도 함께 취소됩니다.

 

 

 

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

 

1. git reset 명령을 연습하기 위해 커밋을 몇 개 만들겠습니다. 빔을 사용해 hello-git 디렉터리에 rev.txt를 만듭니다. 간단하게 영문자 'a'를 입력한 후 저장합니다. 

 

$ vim rev.txt

 

2. rev.txt를 스테이지에 올린 후 커밋 메시지 R1을 붙여 커밋합니다.

 

$ git add rev.txt
$ git commit -m "R1"

 

3. rev.txt를 한 번 더 수정해서 영문자 'b'를 추가하고, R2 메시지와 함께 커밋합니다.

 

$ vim rev.txt
$ git commit -am "R2"

 

4. 같은 방법으로 rev.txt에 영문자 'c'를 추가한 후 R3 메시지와 함께 커밋하고, rev.txt에 영문자 'd'를 추가한 후 R4 메시지와 함께 커밋합니다. 지금까지 커밋을 모두 4번 했습니다.

 

 

5. git log 명령을 사용해 지금까지 만든 커밋을 확인해보겠습니다. 커밋이 4개 있고 커밋마다 커밋 해시가 함께 있습니다. 

 

 

6. 커밋 4개 가운데 R2라는 메시지가 붙은 R2 커밋으로 되돌려 보겠습니다. 즉, R3 커밋과 R4 커밋을 삭제하고 R2 커밋을 최신 커밋으로 만들 것입니다. 

reset에서 커밋 해시를 사용해 되돌릴 때 주의사항이 있습니다. 예를 들어 reset A를 입력한다면 이 명령은 A 커밋을 리셋하는 것이 아니라 최근 커밋을 A로 리셋합니다. 즉, A 커밋을 삭제하는 것이 아니라 A 커밋 이후에 만들었던 커밋을 삭제하고 A 커밋으로 이동하겠다는 의미입니다. 그래서 R3 커밋과 R4 커밋을 삭제하려면 그 이전 커밋인 R2 커밋을 최신 커밋으로 만들어야 합니다. 최신 커밋을 가리키는 HEAD를 A로 리셋한다고 생각하면 됩니다. 

R2 커밋으로 이동하기 위해 git log 명령의 결과 화면에서 R2 커밋의 커밋 해시를 선택합니다. 그리고 마우스 오른쪽 버튼 또는 Ctrl + Insert 버튼을 눌러서 [Copy]를 선택합니다. 

 

 

7. git reset 명령 다음에 --hard 옵션까지 입력한 후 복사한 커밋 해시를 붙여넣고 Enter를 누릅니다. 

$ git reset --hard 복사한 커밋 해시

 

8. 방금 복사해서 붙인 커밋 해시 위치로 HEAD가 옮겨졌다고 나타납니다. 방금 복사해서 붙인 커밋이 가장 최신 커밋이 된 것입니다. 

 

 

9. git log 명령을 사용해서 로그 목록을 살펴봅니다. R4 커밋과 R3 커밋은 삭제되고 R2 커밋이 최신 커밋이 되었습니다. 

 

 

10. 하나 더 확인해 볼 것이 있습니다. R4 커밋은 rev.txt에 'd'를 추가한 것이고, R3 커밋은 'c'를 추가한 것, 그리고 R2 커밋은 'b'를 추가한 것입니다. R2 커밋으로 되돌렸으니 rev.txt는 어떻게 되었을까요? cat 명령을 사용해서 rev.txt 파일을 확인해 보면 내용에 'b'까지만 있습니다. 'c'와 'd'를 추가했던 R4 커밋과 R3 커밋이 사라지고, R2 커밋이 최신 커밋이 되었기 때문에 'b'까지만 남은 것입니다. 

 

 

 

커밋 변경 이력 취소하기 - git revert

 

1. rev.txt 파일을 한 번 더 수정해서 영문자 'e'를 추가합니다. 

 

2. 수정한 rev.txt를 R5라는 메시지와 함께 커밋합니다.

 

$ git commit -am "R5"

 

3. git log를 입력해 버전을 확인해봅니다. rev.txt 파일에 대해 R1과 R2,R5 라는 버전 3개가 만들어졌습니다. 

 

 

4. 가장 최근에 커밋한 R5 버전을 취소하고, R5 직전 커밋인 R2로 되돌아가려고 합니다. 여기에서는 취소하는 R5 버전을 삭제하지 않고 남겨 두려고 합니다. 이런 경우에 revert 명령을 사용하고 명령 뒤에 취소할 버전의 해시를 지정합니다. 먼저 revert할 R5 커밋 해시를 복사합니다. 

 

5. revert 명령을 사용해서 R5 커밋을 취소합니다.

 

$ git revert 복사한 커밋 해시

 

6. 기본 편집기가 자동으로 나타나면서 다음과 같이 커밋 메시지를 입력할 수 있습니다. 커밋 메시지 맨 위에는 어떤 버전을 revert했는지 나타납니다. 커밋을 취소하면서 남겨둘 내용이 있다면 문서 맨 위에 입력하고 저장합니다. 

 

 

7. R5 버전이 revert되었다는 간단한 메시지가 나타납니다. 실제로 버전이 어떻게 바뀌었는지 확인하기 위해 git log를 입력합니다. 

 

$ git log

 

8. 로그에 R5를 revert한 새로운 커밋이 생겼습니다. 그리고 기존의 R5 역시 사라지지 않았습니다. R5 버전을 지우는 대신 R5에서 변경했던 내용만 취소하고, R5를 취소했다는 커밋을 새로 만든 것입니다.

 

 

9. 방금 취소한 R5 커밋은 rev.txt문서에 영문자 'e'를 추가한 것이었습니다. R5 커밋을 취소한 것이 문서에도 반영되었는지 확인해보겠습니다. 

 

$ cat rev.txt

10. 앞에서 추가한 'e'가 없어진 것을 볼 수 있습니다. revert 명령을 사용하면 커밋 자체를 삭제하지 않으면서도 변경한 이력을 취소할 수 있습니다.

 

 

 

이 글은 Do it! 지옥에서 온 문서 관리자 깃&깃허브 입문 책을 보며 공부한 글입니다. 

'Git&GitHub' 카테고리의 다른 글

Ch 11-2. 브랜치 정보 확인하기  (0) 2023.07.07
Ch 11. 브랜치 만들기 및 이동하기  (0) 2023.07.06
Ch 7. 커밋 내용 확인하기  (0) 2023.07.03
Ch 5. 깃 저장소 만들기  (0) 2023.06.30