11일차 - 깃 & 깃헙 (Detached HEAD, Restore, Reset, Revert)

Yohan·2024년 3월 6일
0

코딩기록

목록 보기
12/156
post-custom-banner

(4-3) 변경사항 취소 및 시간여행

Detached HEAD

특정 브랜치가 아닌 커밋에 직접 체크아웃한 상태

  • git checkout <commit-hash> 로 입력하며 switch 대신 checkout을 사용한다는 점을 주의

Detached HEAD 상태에서 고려할 수 있는 것

  • 단순히 이전 커밋 내역 둘러보기
    그냥 헤드를 분리시킨 상태로 이전 커밋의 파일들을 둘러볼 수 있다.
  • 새 브랜치 생성
    git switch -c <new-branch> 명령을 사용하여 현재 커밋을 기반으로 새 브랜치를 생성할 수 있습니다.
  • 작업 내역 저장 후 체크아웃
    git stash를 사용하여 변경사항을 저장한 다음, 원하는 브랜치로 체크아웃할 수 있습니다. 이후에 해당 변경사항을 다시 로드하여 작업을 계속할 수 있다.

git checkout HEAD~n

  • 현재 HEAD에서 이전의 커밋으로 체크아웃하는데 사용 !
  • HEAD~1이면 한 단계 이전, HEAD~2이면 두 단계 이전으로 이동

Git Restore

작업 디렉토리(add 전)나 인덱스의 변경사항(add 후 commit 전)을 특정 커밋의 상태로 되돌리는 데 사용

  1. 작업 디렉토리의 파일을 복원
    git restore <file>를 실행하면, 지정된 파일의 변경사항을 HEAD의 상태로 되돌린다. 즉, 최근 커밋 상태로 해당 파일을 복원한다. 이 경우, 아직 커밋되지 않은 변경사항은 제거된다.
  2. 스테이징한 파일 언스테이징하기
    -> 스테이징한 파일 (= add된 파일)
    git restore --staged <file>을 실행하면, 지정된 <file>의 스테이징 상태가 해제된다. 이 경우, 스테이징된 변경사항이 제거되지만, 작업 디렉토리의 변경사항은 그대로 유지된다.

git restore --source

git restore --source <commit-hash> <file> 명령은 지정된 <commit-hash>의 상태로 <file>을 복원한다. 즉, <file>의 내용을 <commit-hash>에서의 내용으로 변경


Git Reset

현재 HEAD를 특정 커밋으로 이동시키는데 사용된다. 주로 이전의 상태로 "되돌리고" 싶을 때 사용되는 명령어

  • git reset <commit-hash> 명령을 실행하면, 현재 브랜치의 HEAD가 지정된 <commit-hash>로 이동 -> 지정된 커밋 이후의 모든 커밋이 "사라지게" 됨 -> 완전히 사라지는 것은 아니고 Git 저장소에 남게되어 다시 되돌릴 수도 있음!

Git Reset 명령어

  • --hard
    • 커밋취소, 변경사항 전부 폐기
  • --soft
    • 커밋취소, 변경사항 유지, add 유지 (git status 초록불)
  • --mixed (default)
    • 커밋취소, 변경사항 유지, add 풀림 (git status 빨간불)
      -> soft, mixed는 커밋은 취소되지만 변경사항은 유지되기때문에 새로운 branch를 생성해서 변경사항을 따로 넣어주기도 한다.
  • git reset --hard ORIG_HEAD
    • reset을 잘못했을 때 취소하는 기능

Git Revert

Git에서 특정 커밋을 취소하는 데 사용되는 명령어
그러나 이 명령어는 단순히 이전 상태로 되돌리는 것이 아니라, 취소하려는 커밋의 변경 사항을 반대로 적용하는 새로운 커밋을 생성한다. 이는 기록을 유지하면서 변경 사항을 되돌리는 방법이므로, 공동 작업을 하는 환경에서 특히 유용하다.

  • 즉, Revert는 취소함과 동시에 변경사항 (잘못했었던 것) 을 커밋한다.

Reset vs Revert

  • 위 예시에서 4번째 commit을 취소하고 third commit으로 돌아가고 싶을 때
  1. Git Reset을 사용한 경우
  • third commit의 해시를 적는다. git revert 5d88de0 (Reset은 이후의 것이 삭제 되므로)
  1. Git Revert를 사용한 경우
  • 취소하고 싶은 커밋의 해시를 적는다. git revert 959932e 해시를 쓴다.
profile
백엔드 개발자
post-custom-banner

0개의 댓글