Git의 온갖 되돌리기들

돔푸·2024년 6월 12일

Git에서 커밋, 변경사항들을 되돌리는 명령어가 많아서 헷갈리는 부분이 있다. 이를 정리해보고자 한다!
git reset, git revert, git commit --amend, git restore를 정리한다.
추가적으로 편의를 위해 커밋ID 대신에 커밋메시지를 적을테니 혼동이 없었으면 좋겠다.

git reset

git reset 명령은 커밋을 삭제하는 명령이다.

옵션에 따라 --soft --mixed(기본) --hard로 나뉘는데,
커밋을 하기 까지의 과정을 아래처럼 나타낸다면,
파일수정 -> 스테이징하기(git add) -> 커밋하기(git commit)

  • 파일수정 전으로 돌리는게 hard
  • 스테이징 전으로 돌리는게 mixed
  • 커밋 전으로 돌리는게 soft

라고 이해하면 편하다!

즉, soft와 mixed는 커밋만을 삭제하고, hard는 파일의 수정내용도 삭제한다.
각각 살펴보자.

git reset --soft [커밋ID]

먼저 soft이다. 커밋만을 삭제하고 파일수정 내용을 스테이징 해놓는다.

전 :
커밋메시지 : 1 - 2 - 3
파일시스템 : 1 - 2 - 3

후 :
커밋메시지 : 1 - 2
파일시스템 : 1 - 2 - 3

스테이징 영역 : 3

이 상태에서 바로 git commit을 통해 커밋을 날릴 수도 있다.

git reset [커밋ID]

mixed이다. 커밋만을 삭제하고 파일수정 내용은 스테이징 되어있지 않다.

전 :
커밋메시지 : 1 - 2 - 3
파일시스템 : 1 - 2 - 3

후 :
커밋메시지 : 1 - 2
파일시스템 : 1 - 2 - 3

스테이징 영역 :

이 상태에서는 git add 후 git commit을 해야 커밋을 날릴 수 있다.

git reset [커밋ID]

hard는 파일 커밋과 파일수정 내용도 모두 삭제한다. 따라서 스테이징할 것도 없다.

전 :
커밋메시지 : 1 - 2 - 3
파일시스템 : 1 - 2 - 3

후 :
커밋메시지 : 1 - 2
파일시스템 : 1 - 2

파일을 수정하기 전 상태로 되돌린다. 수정내용이 모두 사라지니 조심해서 사용하자.

git revert [커밋ID]

git revert 명령은 수정내용만을 되돌리고, 새로운 커밋을 생성하는 명령이다.
시각적으로 보는 것이 더 빠르다.

전 :
커밋메시지 : 1 - 2 - 3
파일시스템 : 1 - 2 - 3

후 :
커밋메시지 : 1 - 2 -3 - 4
파일시스템 : 1 - 2 - 3 - 2

즉, 파일은 수정하되, 수정했다는 내용의 커밋을 하나 새로 생성한다.
커밋 히스토리가 지저분하게 남아서 나는 많이 사용하지 않는 것 같다.

git commit --amend

가장 최근 커밋을 수정하는 명령이다.
기능이 2개가 있는데, 먼저 첫번째 기능인 '커밋메시지 수정하기'를 보면,

커밋메시지 : 1 - 2 - 3'
파일시스템 : 1 - 2 - 3

요런식으로 가장 최근의 커밋 메시지를 수정할 수 있다. 커밋 메시지를 잘못 입력했을 때 아주 사용하기 편할 것 같다.
다음으로는 두번째 기능, '깜빡하고 커밋하지 못한 파일 같이 커밋하기'이다. 이는 기존의 내용을 조금 다르게 구성해서 설명해보겠다.

파일은 두개 있다. A와 B

기존 :
커밋메시지 : 1 - 2 - 3
파일시스템 : A1 - A2 - A3

git 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 restore를 사용하면
커밋 -> 파일시스템(git restore)
으로 파일시스템을 수정할 수 있다.

이런식으로 진행된다.

git add A
git commit -m "A 수정"
...시간이 좀 흐른 후...
"아, 실수로 파일 A를 삭제해버렸네 어떡하지?"
git restore A
"휴 다행이다."

다만, 기본의 파일시스템 내용을 모두 덮어씌우고 무조건 돌아가기 때문에 변경사항도 다 날라가버린다. 조심해서 사용하자.

git restore --staged

이 명령은 위의 명령과 아예 다른 느낌이다.
스테이징된 내용을 언스테이지한다.

이런식으로 진행된다.

git add A
git add B
...시간이 좀 흐른 후...
"A는 이번 커밋에 필요없겠는데"
git restore --staged A
git commit -m "B 수정했습니다."

마치며

git에는 유용한 명령어가 너~무 많아서 어렵다. 헷갈리고 비슷한 것들도 있으나, 온전한 버전관리를 위해서는 다 숙지해야할 내용인 것 같다. 공부를 더하자.

(언젠가는 누군가 추상화를 정말 잘해서 마우스로 딸깍딸깍 버전관리할 수 있을까?)

profile
나중에 또 모를 것들 모음

0개의 댓글