커밋을 기준으로 이전 코드로 되돌리는 방법으로, 기록한 커밋을 취소한다.
$ git reset 옵션 커밋ID
1) soft
: 스테이지 영역을 포함한 상태로 복원한다.
2) mixed
: 기본 옵션 값
3) hard
: 실제 파일이 삭제된 이전 상태로 복원한다.
soft
옵션--amend
명령어와 유사// 예시
$ git reset -soft HEAD^
mixed
옵션unstaged
상태로 되돌리기 때문에 파일 내용이 워킹 디렉토리에 저장되어 있어 add
명령어를 실행해야 커밋할 수 있다.hard
옵션$ git reset --soft HEAD~2 // 2단계 전의 커밋으로 리셋
$ git commit -m "menu3/4" // 커밋 합치기
unstaged
상태가 되도록 스테이징을 취소할 때$ git reset 파일이름
unstaged
상태가 된다.$ git reset --mixed HEAD 파일이름
$ git reset 커밋 ID 파일이름
$ git checkout -b menu f3423f // menu2의 커밋 해시키를 직접 지정
$ git commit -am "menu1-1" // 커밋
[menu 34902a] menu1-1
1 file changed, 5 insertions(+), 1 deletion(-)
$ git checkout master // 브랜치 이동
Switched to branch 'master'
$ git merge menu // 병합
Auto-merging menu.html
Merge made by the 'recursive' strategy.
menu.html | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
$ git reset --merge HEAD~ // 이전 커밋 리셋
✅ 저장소를 외부에 공개했거나 공유하고 있다면 주의해서 리셋을 사용해야 한다. 작성된 커밋이 리셋으로 삭제되면 함께 작업하는 개발자에게 혼란을 줄 수 있기 때문에 일반적으로 협업하거나 소스 코드를 공유한 후에는 리셋 작업을 하지 않는다.
기존 커밋을 남겨 두고 취소에 대한 새로운 커밋을 생성하는 방법, 취소 커밋은 지정한 커밋을 삭제하지 않고 삭제를 위한 새로운 커밋을 생성한다.
$ git revert HEAD // 직전 커밋 취소
$ git revert 커밋ID // 직전이 아닌 커밋 취소
$ git revert 커밋ID .. 커밋ID // 여러 커밋 리버트
$ git revert --mainline 숫자 병합커밋ID
// 예시
$ git merge menu // 브랜치 병합
$ code menu.html // 코드 수정
$ git commit -am "menu7" // 등록 및 커밋
$git log --oneline --graph -5 // 로그 5개 확인
* dfaef3d (HEAD -> master) menu7
* 412b3b Merge branch 'menu7'
|\
| * 4j43hd (menu) menu1-1
* | 0dfad3k Revert "menu7"
* | 3432124 menu7
$ git revert --mainline 1 412b3b // 리버트
[master 2315342] Revert "Merge brnach 'menu'"
1 file changed, ! insertion(+), 5 deletions(-)
리버트를 실행하면 새 커밋이 추가되기 때문에 커밋 이력이 복잡해진다. 하지만 저장소를 공개했다면 리셋으로 커밋을 삭제하는 것은 위험하기 때문에 이대는 리버트가 유용하다.