Other

[Github] git commit 취소/삭제하기

푸고배 2021. 3. 17. 21:09

이미 push한 commit을 되돌리고 싶을 때가 종종 있다.

(ex. git push를 완료한 상태에서 작은 에러를 발생했을 때나 commit 메세지를 잘못 적었을 때)

 

로컬에만 commit한 경우라면 reset 명령어를 이용해서 해결이 가능하지만, repository에 commit한 경우라면 revert 명령어를 사용한다. (reset -> git push -f를 사용하는 방법도 있다)

 

 git reset 

reset하고자하는 commit으로 돌아간 후, 저장소는 해당 commit으로 재설정되고, 이후 commit을 전부 삭제

명령어는 아래와 같이 사용한다.

 

git reset [--option(hard/soft/mixed)] [commit]

 

option : 

  • hard : 돌아간 커밋 이후의 변경 이력을 전부 삭제
  • soft : 변경 이력 삭제, 변경 내용은 남아있음, 인덱스 초기화(git add가 안되어 있는 상태)
  • mixed : 변경 이력 삭제, 변경 내용은 남이있음, 인덱스도 유지(git add까지 되어 있음) 

현재 git log 상태

 

git reset --hard 2a333a43a947f205cc43fdea26a038ff126f2fdf

 

 

위와 같이 commit 이력은 commit message2로 돌아가있으며,

git status 시, 변경된 파일 내용도 commit message2으로 변경된다.

 

 

git reset --soft 2a333a43a947f205cc43fdea26a038ff126f2fdf

 

 

위와 같이 commit 이력은 commit message2로 돌아가있으며,

git status 시, 변경된 파일 내용은 commit message3으로 유지되어 있고 git add도 되어 있는 상태이다.

 

 

git reset --mixed 2a333a43a947f205cc43fdea26a038ff126f2fdf

 

 

위와 같이 commit 이력은 commit message2로 돌아가있으며,

git status 시, 변경된 파일 내용은 commit message3으로 유지되어 있고 git add로 변경된 파일 추가가 필요하다.

 

 

앞에서 git log를 확인해보면 알 수 있듯이, git reset은 로컬 저장소의 git commit만을 제어하지 저장소에 push한 commit은 해결하지 못한다.


  • Head : 현재 작업하고 있는 branch를 가리키는 포인터, branch에 담긴 commit 중 가장 마지막 commit을 가리킨다. (git checkout 명령어로 변경 가능)
  • main 또는 master : 로컬 저장소의 기본 branch이름 
  • origin/main 또는 origin/master : 원격 저장소의 기본 branch 이름

초기 git log (현재 원격 저장소에 commit3까지 push한 상태)

 

git reset --hard 명령어를 통해 commit2로 되돌린 상태

로컬 저장소의 commit 이력만이 변경된 상태로 원격 저장소의 commit 이력은 그대로 남아있다.

원격 저장소에 commit 이력을 적용하기 위해서 git push를 해보자.

 

git push -f origin main

 

 

위와 같이 원격 저장소의 commit 이력이 변경된 것을 확인할 수 있다.

 

하지만 git push -f(-force) 옵션의 경우 원격 저장소의 해당 브랜치 코드 변경 이력을 로컬 저장소의 코드 변경 이력으로 강제로 덮어쓰는 방식으로 협업환경에서 사용은 지양해야한다.

 

따라서, commit 이력이 남지않아 불필요한 commit 횟수를 줄일 수 있어 좋지만, 해당 branch를 혼자 사용하거나, 협업하는 동료들이 해당 branch를 pull하지 않은 상태라는게 보장될 때만 간편하게 사용할 수 있는 방법이다.

 

작업환경이 공유 branch로, history 안정성이 보장되어야 한다면, git commit 복구 이력을 원격 저장소의 history에 남기는 revert 명령어를 사용한다.

 

 git revert 

revert 명령어의 경우는 commit 변경 이력이 history로 남는다.

현재 상태에서 revert를 사용해 commit message2로 되돌아가본다.

 

git revert [commit]

 

 

git revert 2a333a43a947f205cc43fdea26a038ff126f2fdf

 

를 사용해 바로 revert를 진행해도 되지만, 변경된 내용에 의해 충돌이 발생할 수도 있다.

이 경우에는 git log -p를 통해 변경 내용을 확인하고 파일 수정 후 git add를 새로해주면 된다.

 

 

다른 한 가지 방법은, 되돌릴 commit까지 commit의 역순으로 revert를 수행하는 것이다.

 

git revert --no-commit 01c2265fc386976346a1357162989879436395d1

git revert --no-commit 7902e09122de46b2fac6cd53f19a440666fef85e

git revert --no-commit 2a333a43a947f205cc43fdea26a038ff126f2fdf 

 

이후 commit message를 설정하고, 원격 저장소에 push 해주면 된다.

 

git commit -m "revert commit"

git push -u origin main

 

 

그러면 commit은 하나 추가가 되지만 history 조작없이 commit message2의 상태로 commit 상태를 되돌릴 수 있다.

 

 

참고자료 :

 

원격 저장소에 올라간 커밋 되돌리기

Git으로 버젼 관리를 하며 개발하다보면, 작성한 커밋들을 되돌려서 다시 이전 상태로 원상복구하고 싶은 경우가 한번쯤 있을 것이다. 만약 로컬까지만 저장된 커밋인 경우는 $ git reset 명령어를

jupiny.com

 

반응형