git에서 커밋을 이미 한 경우라도 마지막 커밋의 문구를 바꾸거나 빠진 변경사항을 추가하고 싶다면 git commit --amend
를 사용할 수 있고 마지막 커밋이 아니더라도 git rebase -i SHA
를 실행하면 이전 커밋이라도 원하는 대로 수정이 가능하다. 하지만 이미 커밋한 내용에 절대적으로 지켜야 하는 전제가 원격저장소에 아직 PUSH 하지 않은 커밋에 대해서만 수정을 해야 한다는 것이다. 큰 실수라도 이미 PUSH를 했다면 이미 저질러진 일이므로 그냥 잊어야 한다.
하지만 커밋은 이미 저질렀으므로(PUSH까지 했으므로) 어쩔 수 없다고 하더라도 변경된 내용은 되돌려야 하는 경우가 존재한다. 아직 발견 못한 큰 버그로 인해서 아직 적용되면 안 된다거나 요구사항 등이 바뀌어서 릴리즈하지 않아야 한다는 등 다양한 경우가 있다. 이럴 때 사용하는 명령어가 git revert
다.
git revert
처음 git을 배울 때 revert 명령어를 시도했던 기억이 난다. Subversion을 사용할 때는 로컬의 변경사항을 제거할 때 svn revert
를 사용했었기에 git에서도 같게 시도했지만, 명령어가 다름을 곧 깨달았다. 내가 하고자 했던 작업은 git에서는 reset에 가까웠고 그 뒤로는 revert를 사용하지 않았지만, 시간이 지나니 또 사용할 일이 생겼다.(이젠 svn은 거의 다 까먹었다.)
위처럼 커밋을 하면서 작업을 하고 있다고 해보자.
$ git revert c09b802
[master f77a329] Revert "나중에 후회할 것 같은 작업"
1 file changed, 1 deletion(-)
delete mode 100644 mistake.txt
outsider@MBP15:~/projects/etc/revert (git:f77a329@master)
$ git graph -10
* f77a329 (HEAD, master) Revert "나중에 후회할 것 같은 작업"— Outsider (9 seconds ago)
* 6d38d16 네번째 작업— Outsider (2 minutes ago)
* c09b802 나중에 후회할 것 같은 작업— Outsider (2 minutes ago)
* ed13ca0 세번째 작업— Outsider (3 minutes ago)
* f5915cd 두번째 작업— Outsider (3 minutes ago)
* 1ec3ec5 첫번째 작업— Outsider (4 minutes ago)
* 75e5294 initial commit— Outsider (5 minutes ago)
이 Revert 커밋의 커밋 메시지는 다음과 같이 어떤 커밋을 되돌리는 것인지 알 수 있도록 자동으로 커밋 메시지를 채워준다.
Revert "나중에 후회할 것 같은 작업"
This reverts commit c09b802fadd66fe3976750e6a9935f259c704832.
여러 커밋을 한꺼번에 커밋해야 하는 경우에는 git revert f5915cd..c09b802
와 같이 범위를 지정해 줄 수도 있다. 이렇게 범위를 지정하는 경우 Revert 커밋을 각각 생기지만 커밋한 순서 반대로 하나씩 생기게 된다.
$ git graph -10
* ca10e41 (HEAD, master) Revert " 세번째 작업"— Outsider (5 seconds ago)
* a331889 Revert "나중에 후회할 것 같은 작업"— Outsider (2 minutes ago)
* 6d38d16 네번째 작업— Outsider (10 hours ago)
* c09b802 나중에 후회할 것 같은 작업— Outsider (10 hours ago)
* ed13ca0 세번째 작업— Outsider (10 hours ago)
* f5915cd 두번째 작업— Outsider (10 hours ago)
* 1ec3ec5 첫번째 작업— Outsider (10 hours ago)
* 75e5294 initial commit— Outsider (10 hours ago)
Comments