Git에서 커밋, 변경사항들을 되돌리는 명령어가 많아서 헷갈리는 부분이 있다. 이를 정리해보고자 한다!
git reset, git revert, git commit --amend, git restore를 정리한다.
추가적으로 편의를 위해 커밋ID 대신에 커밋메시지를 적을테니 혼동이 없었으면 좋겠다.
git reset 명령은 커밋을 삭제하는 명령이다.
옵션에 따라 --soft --mixed(기본) --hard로 나뉘는데,
커밋을 하기 까지의 과정을 아래처럼 나타낸다면,
파일수정 -> 스테이징하기(git add) -> 커밋하기(git commit)
라고 이해하면 편하다!
즉, soft와 mixed는 커밋만을 삭제하고, hard는 파일의 수정내용도 삭제한다.
각각 살펴보자.
먼저 soft이다. 커밋만을 삭제하고 파일수정 내용을 스테이징 해놓는다.
전 :
커밋메시지 : 1 - 2 - 3
파일시스템 : 1 - 2 - 3후 :
커밋메시지 : 1 - 2
파일시스템 : 1 - 2 - 3
스테이징 영역 : 3
이 상태에서 바로 git commit을 통해 커밋을 날릴 수도 있다.
mixed이다. 커밋만을 삭제하고 파일수정 내용은 스테이징 되어있지 않다.
전 :
커밋메시지 : 1 - 2 - 3
파일시스템 : 1 - 2 - 3후 :
커밋메시지 : 1 - 2
파일시스템 : 1 - 2 - 3
스테이징 영역 :
이 상태에서는 git add 후 git commit을 해야 커밋을 날릴 수 있다.
hard는 파일 커밋과 파일수정 내용도 모두 삭제한다. 따라서 스테이징할 것도 없다.
전 :
커밋메시지 : 1 - 2 - 3
파일시스템 : 1 - 2 - 3후 :
커밋메시지 : 1 - 2
파일시스템 : 1 - 2
파일을 수정하기 전 상태로 되돌린다. 수정내용이 모두 사라지니 조심해서 사용하자.
git revert 명령은 수정내용만을 되돌리고, 새로운 커밋을 생성하는 명령이다.
시각적으로 보는 것이 더 빠르다.
전 :
커밋메시지 : 1 - 2 - 3
파일시스템 : 1 - 2 - 3후 :
커밋메시지 : 1 - 2 -3 - 4
파일시스템 : 1 - 2 - 3 - 2
즉, 파일은 수정하되, 수정했다는 내용의 커밋을 하나 새로 생성한다.
커밋 히스토리가 지저분하게 남아서 나는 많이 사용하지 않는 것 같다.
가장 최근 커밋을 수정하는 명령이다.
기능이 2개가 있는데, 먼저 첫번째 기능인 '커밋메시지 수정하기'를 보면,
커밋메시지 : 1 - 2 - 3'
파일시스템 : 1 - 2 - 3
요런식으로 가장 최근의 커밋 메시지를 수정할 수 있다. 커밋 메시지를 잘못 입력했을 때 아주 사용하기 편할 것 같다.
다음으로는 두번째 기능, '깜빡하고 커밋하지 못한 파일 같이 커밋하기'이다. 이는 기존의 내용을 조금 다르게 구성해서 설명해보겠다.
파일은 두개 있다. A와 B
기존 :
커밋메시지 : 1 - 2 - 3
파일시스템 : A1 - A2 - A3git commit --amend 후 :
커밋메시지 : 1 - 2 - 3'
파일시스템 : A1 - A2 - A3, B
이렇게 커밋에 포함시키지 못했던 파일을 같이 커밋할 수 있다.
이렇게 같이 커밋하고 싶을 때는 꼭 해당 파일을 스테이징 해두고 git commit --amend를 해야한다.
이런식으로 진행될 것 같다.
git add A
git commit -m "3"
"아놔, B를 깜빡했네..."
git add B
git commit --amend
커밋 메시지 입력
지금까지의 모든 스테이징과 커밋은 다음과 같은 순서를 가졌다.
파일시스템 -> 커밋
근데 이 흐름을 바꿀 수 있는게 git restore다.
즉, git restore를 사용하면
커밋 -> 파일시스템(git restore)
으로 파일시스템을 수정할 수 있다.
이런식으로 진행된다.
git add A
git commit -m "A 수정"
...시간이 좀 흐른 후...
"아, 실수로 파일 A를 삭제해버렸네 어떡하지?"
git restore A
"휴 다행이다."
다만, 기본의 파일시스템 내용을 모두 덮어씌우고 무조건 돌아가기 때문에 변경사항도 다 날라가버린다. 조심해서 사용하자.
이 명령은 위의 명령과 아예 다른 느낌이다.
스테이징된 내용을 언스테이지한다.
이런식으로 진행된다.
git add A
git add B
...시간이 좀 흐른 후...
"A는 이번 커밋에 필요없겠는데"
git restore --staged A
git commit -m "B 수정했습니다."
git에는 유용한 명령어가 너~무 많아서 어렵다. 헷갈리고 비슷한 것들도 있으나, 온전한 버전관리를 위해서는 다 숙지해야할 내용인 것 같다. 공부를 더하자.
(언젠가는 누군가 추상화를 정말 잘해서 마우스로 딸깍딸깍 버전관리할 수 있을까?)