작업 트리에서 수정한 파일 되돌리기 — git restore
1. 먼저 빔 편집기에서 hello.txt 파일을 열고 숫자 ‘3’을 ‘three’로 수정한 후 저장하고 편집기를 종료
$ vim hello.txt
2. git status 명령을 사용해 보면 hello.txt가 수정되었지만 아직 스테이지에 올라가 있지 않음
그리고 두 번째 괄호 안의 메시지를 보면, 작업 디렉터리의 변경 사항을 취소하려면 restore 명령을 사용하라고 되어 있음
3. hello.txt의 수정 사항을 취소하려면 git restore 명령 다음에 한 칸 띄고 파일 이름을 쓰면 됨
$ git restore hello.txt
4. restore 명령이 정상으로 처리되면 화면에는 아무것도 나타나지 않음
cat 명령을 사용해 파일 내용을 확인해 보면 앞에서 ‘3’을 지우고 ‘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. 상태 메시지에서 괄호 안의 내용을 보면 스테이지에서 내리려면(to unstage) git restore --staged <file> 명령을 사용하라고 함
4. 스테이징을 취소할 때는 restore 명령 뒤에 --staged 옵션을 붙이는데, 이 옵션만 사용하면 스테이지에 있는 모든 파일을 한꺼번에 되돌릴 수 있고, --staged 옵션 뒤에 파일 이름을 넣으면 해당 파일만 골라서 되돌릴 수 있음
$ git restore --staged hello2.txt
5. git status를 사용해 파일 상태를 확인해 보면 파일이 아직 스테이지에 올라가기 전(not staged)으로 돌아온 것을 확인할 수 있음
최신 커밋 되돌리기 — git reset HEAD^
1. 다시 한번 hello2.txt 문서를 수정하기 위해 빔을 열고 대문자 E를 끝에 추가한 후 저장
$ vim hello2.txt
2. git commit 명령을 사용해 스테이징과 커밋을 함께 실행하고 커밋 메시지는 message4로 함
$ git commit -am "message4"
3. git log 명령을 사용해서 제대로 커밋되었는지 확인해 보면 마지막 커밋 메시지는 message4
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 명령을 연습해 보기 위해 커밋을 몇 개 만들어야 함
빔을 사용해 hellogit 디렉터리에 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 커밋의 커밋 해시를 선택
마우스 오른쪽 버튼을 눌러 [Copy]를 선택
7. git reset 명령 다음에 --hard 옵션까지 입력한 후 복사한 커밋 해시를 붙여 넣고 {{ Enter }}를 누름
$ git reset --hard 복사한 커밋 해시
8. 방금 복사해서 붙인 커밋 해시 위치로 HEAD가 옮겨졌다고 나타남
즉, 방금 복사해서 붙인 커밋이 가장 최신 커밋이 된 것
9. git log 명령을 사용해서 로그 목록을 살펴봄
의도했던 대로 R4 커밋과 R3 커밋은 삭제되고 커밋 해시를 복사했던 커밋, 즉 R2 커밋이 최신 커밋이 됐음
10. cat 명령을 사용해서 rev.txt 파일을 확인해 보면 내용에 ‘b’까지만 있음
R4 커밋은 rev.txt에 ‘d’를 추가한 것이고, R3 커밋은 ‘c’를 추가한 것, 그리고 R2 커밋은 ‘b’를 추가한 것이었음
‘c’와 ‘d’를 추가했던 R4 커밋과 R3 커밋이 사라지고, R2 커밋이 최신 커밋이 되었기 때문에 ‘b’까지만 남은 것
커밋 변경 이력 취소하기 — git revert
1. 앞의 내용을 따라왔다면 rev.txt라는 파일에는 영문자 a와 b가 있고 커밋은 R2까지 만들어져 있음
rev.txt 파일을 한 번 더 수정해서 영문자 ‘e’를 추가
$ vim rev.txt
2. 수정한 rev.txt를 R5라는 메시지와 함께 커밋
$ git commit -am "R5"
3. git log를 입력해 버전을 확인해 보면 rev.txt 파일에 대해 R1과 R2, R5라는 버전 3개가 만들어졌음
4. 가장 최근에 커밋한 R5 버전을 취소하고, R5 직전 커밋인 R2로 되돌아가려고 함
여기에서는 취소하는 R5 버전을 삭제하지 않고 남겨 두려고 함
이럴 때는 revert 명령을 사용하고 명령 뒤에 취소할 버전, 즉 R5의 커밋 해시를 지정
먼저 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 명령을 사용하면 커밋 자체를 삭제하지 않으면서도 변경한 이력을 취소할 수 있음
'Git,GitHub' 카테고리의 다른 글
깃(Git) - 브랜치 (0) | 2023.01.03 |
---|---|
Git 명령어 정리 및 복습 (0) | 2023.01.02 |
깃(Git) - 커밋 내용 확인하기 - 03, 버전 만드는 단계마다 파일 상태 알아보기 - 04 (0) | 2023.01.02 |
깃 - 커밋 만들기 (연습) (0) | 2023.01.02 |
깃(Git) - 깃 버전 만들기 - 02 (0) | 2023.01.02 |