Github Commit 되돌리기, 취소하기

SeHun.J·2024년 1월 15일
0

Github Commit 되돌리기

원격저장소인 Github의 Commit을 되돌리는 건 중요합니다. 개발자가 Feat A, Feat B를 개발하고 각각 커밋을 한 이후, 내부 회의로 Feat B만 배포에 포함하기로 한 경우 Feat A에 대한 커밋은 취소해야 합니다.

Git Reset 명령어

첫번째로 reset 명령어가 있습니다. 해당 명령어는 commit 내역 자체를 삭제합니다. 하지만 reset 명령어는 협업 환경에서는 사용하기가 난감할 수 있는데요. 두 명의 개발자가 있고 Feat A,B 둘다 커밋이 된 상태에서 제가 reset 명령어로 해당 커밋을 리셋시킨다고 해도, 다른 한명의 개발자가 이미 Pull을 한 상태라면 그 개발자의 로컬에는 Feat A,B의 커밋내역이 남아있게 됩니다. 이 상태에서 작업을 마치고 Push를 하게 되면 되돌렸던 커밋이 다시 원격저장소에 추가되게 됩니다.

먼저, 명령어와 옵션에 대해서 알아보면

git reset [--hard | --mixed | --soft] [커밋 해시]
  • --soft: HEAD를 지정한 커밋으로 이동시키고(이전의 커밋들이 취소되고) 해당 변경사항을 스테이징 영역에 그대로 남겨둡니다.
  • --mixed (default 옵션): soft와 마찬가지로 HEAD를 지정된 커밋으로 이동시키지만, 추가로 인덱스(스테이징) 영역도 이 커밋의 상태로 되돌립니다. 작업 디렉토리에는 변경사항이 그대로 남아 있습니다.
  • --hard: HEAD, 스테이징 영역, 워킹 디렉토리 모두를 지정된 커밋의 상태로 되돌립니다. 작업 디렉토리와 스테이징 영역이 모두 초기 상태로 돌아갑니다.

--hard 옵션의 경우, 파일 시스템 또한 반영되기 때문에 주의해야 합니다.
git reset으로 해당 commit 시점으로 이동 후, 수정이 끝났다면 다시 push하면 됩니다. (기존 원격저장소와 충돌하므로 -f 옵션으로 강제 push를 해야 합니다.)

Git Revert 명령어

두번째로 revert 명령어입니다. 해당 명령어는 특정 커밋을 취소하고 이를 다시 커밋으로 기록합니다. 기존 커밋 히스토리를 건드리지 않고 커밋을 취소하기 때문에 동료 개발자에게 영향을 주지 않습니다.

git revert [--no-commit | --abort] [커밋 해시]
  • --no-commit (-n) : revert 할 때, 자동으로 커밋을 만들지 않고 스테이징 영역에만 변경 사항을 추가합니다. 이후에 수동으로 커밋을 생성해야 합니다. 여러 개의 커밋을 revert할 때 하나의 커밋으로 변경사항을 전부 반영하고 싶을 때 사용합니다. (해당 옵션이 없으면 자동으로 커밋을 만듭니다.)
  • --abort : abort 옵션은 git revert를 실행했을 때 충돌이 나면, revert 명령을 취소하고 원래대로 복구하는 옵션입니다. 보통은 HEAD부터 순서대로 commit을 revert 하지 않고, 중간에 있는 commit을 revert 할 경우 자주 발생합니다.
    revert conflict

reset과 revert 장단점 비교

reset을 이용해서 커밋을 되돌릴 경우, 원격저장소에도 깔끔하게 기록이 사라집니다. 실수로 Key가 담긴 파일을 원격저장소에 Push한 경우, reset으로 해당 커밋을 취소하고 다시 Push하면 커밋내역 자체가 사라지게 됩니다. 하지만 -f 옵션을 주고 push해야 하는 만큼, 신중하게 사용해야 합니다.

revert 명령어는 취소 자체를 커밋으로 기록하기 때문에 협업에 유용합니다. 하지만, 취소한 commit이 히스토리에 그대로 남기 때문에 Key가 노출된 경우에는 revert를 사용하면 안됩니다.

Revert 사용시 팁

revert를 할 때는 HEAD부터 순서대로 취소하게 될 경우, 커밋내역을 하나하나 취소해줘야 합니다. 이럴 경우 너무 번거롭습니다. 이때, 브랜치나 HEAD를 기준으로 범위를 지정할 수 있는데요. HEAD~3.. 이면, HEAD로부터 3개의 커밋내역을 동시에 처리하게 됩니다.

profile
취직 준비중인 개발자

0개의 댓글