문서의 수정 내용을 기록해 둔 커밋 메세지를 잘못 입력했다면 커밋을 만들자마자 즉시 수정할 수 있다.
가장 최근 커밋 메세지를 수정하려면 git commit 명령에 --amend를 붙인다. ( amend : 개정하다 ,수정하다 )
git commit --amend
명령을 입력하면 기본 편집기가 실행되면서 원래 커밋 메세지가 위에 나타난다.
수정 후 wq로 저장하고 나가면 된다.
커밋 메세지가 수정된 것을 확인할 수 있다.
작업 되돌리기
여러 버전들을 만들고 수정하다보면 이전 버전으로 되돌려야하는 상황이 오지 않을까?
수천 줄이 넘는 코드를 수정하다 수정한 것을 취소하고 이전 버전으로 돌아가야 하는 상황이 왔을 때, 일일이 코드를 뒤지면서 수정했던 것을 다시 되돌리는 것은 힘들 것이다.
하지만 이미 '거인'들이 다 미리 방법을 만들어 놨다.
hello.txt '3'을 'three'로 변경.
git status로 확인해보니 스테이지에 올라가있고 워킹 디렉터리에서 변경된 것을 discard하려면 'git restore'를 사용하라고 알려주고 있다.
'git restore hello.txt'를 실행하면 아무런 변화도 없는데 hello.txt를 확인해보면 'three'로 변경한 내용이 이전 '3'으로 돌아가 있는 것을 확인할 수 있다.
위의 방법은 스테이징하지 않은 상태에서 수정하고 수정을 취소하는 방법이다.
이번에는 수정된 파일이 스테이징 단계까지 갔을 때 취소하는 방법을 실습해보자.
hello2.txt 의 'a'를 지우고 A B C D를 입력한다.
'git add'로 스테이징하고 'git status'로 상태 확인.
스테이징 된 상태를 취소하려면 restore 뒤에 --staged 옵션을 붙이는데, 이 옵션만 사용하면 스테이지에 있는 스테이지에 있는 모든 파일을 한꺼번에 되돌릴 수 있고, --staged 옵션 뒤에 파일 이름을 넣으면 해당 파일만 골라서 되돌린다.
git status로 확인해보면 파일이 아직 스테이지에 올라가기 전으로 돌아온 것을 확인할 수 있다.
이번에는 수정된 파일이 스테이징에 올라갔고, 커밋까지 되었을 때 가장 마지막에 한 커밋을 취소하는 방법을 실습해보자.
커밋을 취소하면 커밋과 스테이징이 같이 취소된다.
hello2.txt 에 'E'를 추가.
'git commit -am '을 사용하여 스테이징과 커밋을 동시에 실행.
이제 이 커밋을 취소시키고 되돌려보자.
'git log'로 기록들을 보면 맨 위 내가 최근에 커밋한 내용이 보인다.
최신 커밋을 되돌리려면 'git reset HEAD^' 를 사용한다.
git reset HEAD^
'Unstaged changes after reset' 이 나타난다.
HEAD^는 현재 HEAD가 가리키는 브랜치의 최신 커밋을 가리킨다. 'git log'를 실행하면 최신 커밋에 (HEAD -> main) 표시가 있다. 이렇게 되돌리면 main의 최신 커밋이 취소되고 스테이지에서도 내려간다. 워킹 디렉터리에만 파일이 남는다.
git reset 옵션은 위와 같다.
staged 냐 unstaged 이냐의 차이이다.
그렇다면 최신 커밋 취소가 아닌 특정 커밋으로 되돌리고 싶다면 어떻게 해야할까?
분명 되돌리고 싶은 버전으로 돌아가고 싶은 상황이 훨씬 더 많을 것이다.
특정 버전으로 되돌려 놓고 그 이후 버전을 삭제할 수도 있다.
git reset 명령 다음 커밋 해시를 사용한다.
rev.txt 에 'a' 를 입력한다.
vim rev.txt
git add rev.txt
git commit -m 'R1'
스테이징 후 커밋 메세지 R1을 붙여 커밋한다.
vim rev.txt
rev.txt를 연 다음 b를 추가한다.
그 후 커밋하여 버전을 만들어준다.
commit -am 으로 스테이징과 커밋을 동시에 했다.
그 후 c추가 커밋, d추가 커밋을 해서 버전 4개를 만든다.
'git log'로 확인한 4개의 R 버전.
이제 R2 버전의 커밋으로 되돌려보는 실습을 해보자.
R3 커밋과 R4 커밋을 삭제하고 R2 커밋을 최신 커밋으로 만드는 작업이다.
reset에서 커밋 해시(커밋 ID)를 사용해 되돌릴 때는 조심해야할 점이있다. 예를들어 reset A를 입력한다면 이 명령은 A 커밋을 리셋(삭제)하는 것이 아니라 최근 커밋을 A로 리셋하는 것이다. 즉 A 커밋 이후에 만들었던 커밋을 삭제하고 A 커밋으로 이동(최신 커밋을 A로)하는 것이다.
그래서 R3 커밋과 R4 커밋을 삭제하려면 그 이전 커밋인 R2 커밋을 최신으로 만들어야하고, 이는 reset R2로 하면 된다는 걸 의미한다.
R2 커밋을 복사하자.
그리고 'git reset' 명령어 실행. ( --hard 옵션 사용 )
git reset --hard 커밋ID
HEAD is now at eb4302c R2 라는 메세지가 나온다. 성공적으로 최신 커밋이 R2 커밋 메세지가 있던 커밋으로 변경되었다.
rev.txt를 확인해보면 R2 버전에 수정했던 b까지만 txt 파일이 변경되어 있는 것을 볼 수 있다.
특정 커밋으로 되돌릴 때 수정했던 것 내용들이 삭제되어도 괜찮다면 git reset --hard로 밀어버려도 되지만, 나중에 사용할 것을 대비해 커밋을 취소하더라도 커밋했던 기록을 남겨두고 싶을 때가 있을 것이다.
변경된 내용만 취소하고 커밋했던 것은 남겨 두는 상황이다. 변경했던 파일도 남겨두고 ! 그 이전 파일에서 새 출발하고 싶다! 이런 상황. 버전 관리( 발표ppt_최종_최최최종 ) 하다보면 이런 상황은 무조건 만나게 될 거라는 생각이 들었다.
이럴 경우 'git revert' 명령어를 사용한다. ( revert : 본래 상태로 돌아가다 )
지금 rev.txt 에는 a b가 입력되어있다.
여기에 e를 추가하고 'R5' 라는 커밋 메세지로 커밋해서 새로운 버전을 만든다.
R2로 되돌린 커밋 위에 R5가 최신 버전으로 되어있다.
R5를 취소하고 R2로 돌아가자. 이 때 R5 버전은 남겨두고 R2로 돌아가는 상황이다.
이런 상황에서는 revert 명령 사용 뒤 취소할 버전의 커밋 해시를 지정한다. reset 명령을 사용할 때는 돌아갈 커밋 해시를 입력했지만(최신 커밋으로 만들고 싶은 해시) revert는 취소할 커밋 해시를 지정해야한다.
R5의 커밋 해시를 복사 후 명령 실행.
git revert 취소하고 남길 커밋 해시
명령어를 입력하면 편집 화면이 나타난다.
커밋 메세지를 입력할 수 있다.
R5를 revert한 새로운 커밋이 생겼다. 기존의 R5도 사라지지 않았고. R5 커밋 버전을 지우지 않고, R5에서 변경했던 내용만 취소하고 R5를 취소했다는 커밋을 새로 만든 상황이다.
rev.txt 의 내용에서 e는 사라져있고 R2의 a b 만 들어가 있는 것을 확인할 수 있다.
'Git' 카테고리의 다른 글
[Git] github 활용 (0) | 2023.12.10 |
---|---|
[Git] branch (1) | 2023.11.22 |
[Git] 커밋 확인하기 (0) | 2023.11.11 |
[Git] 버전 만들기 (0) | 2023.11.11 |
[Git] 시작하기 / 기본 (0) | 2023.08.17 |
댓글