Error기록 노트/Git

[git] git reset,revert,restore를 통한 수정 전으로 되돌리는 방법(commit 취소, 삭제 등)

에러노트 2023. 3. 6. 17:14

안녕하세요. 작업 중 commit 또는 push한 시점으로 되돌아가고 싶은 경우에 사용하는 git 이용 방법을 가져왔습니다.

저의 경우, 설치 후 경로 문제로 꼬이는 문제가 발생하여 2일간 붙잡고 있던 와중에 git commit을 해두었던 것이 기억나서 마지막 commit(push)시점으로 로컬의 내용을 되돌리고자 사용하게 되었습니다.

저와 비슷한 사유로 git을 이용하고자 하는 분들께 간단하게 사용할 수 있도록 설명드리겠습니다.

*그전에 한가지 알고 계실 사항은 로컬 = 현재 작업하고 있는 공간, 즉 프로젝트에서 작업 중인 내용이 날아갈 수 있다는 의미입니다. 꼭 정독 후 상황에 맞는 방법을 사용하시길 바랍니다.(급하게 써먹다 날려먹은 저와 같은 실수는 하지 않으시길...😢)

**저처럼 특정 커밋의 위치로 이동하고자 할때 삭제하기 보다는 이동을 위해 git checkout (head또는 log의 커밋7자리)를 통해 쉽게 이동 후 pull 또는 feath를 사용하시길 추천드립니다.(전 삽질하다 찾았네요ㅠㅠ그래도 공부는 많이 했습니다 하핳)


1. git을 통해 과거로 되돌아가는 방법 3가지

이전 내용으로 되돌아가는 방법은 크게 3가지가 있습니다.
(급하신 분들께서는 2번의 사용방법을 바로 보시길 바랍니다. 단, 시간이 되시는 분들께서는 특징을 함께 살펴보셔야 이해가 쉬우실 것 같습니다.)

reset

현재 작업한 내용을 git과 로컬에서 흔적도 없이 모두 삭제하고 이전으로 되돌아갑니다. 마치 아무 일도 없없다~라는 느낌으로 말이죠. 한번 rest 후엔 다시 되돌릴 수 없기 때문에 굉장히 조심해야 합니다.
또한, 팀 또는 회사 내 프로젝트 단위로 git을 협업하여 쓰는 경우 같은 브랜치의 내용을 공유하는 사람이 본인 외 1명이라도 있다면 쓸 수 없는 방법입니다.(ex-본인과 협엽자 ㅁㅁ씨는 같이 'sub'이라는 브랜치에서 작업중이었습니다. 문제가 발생하여 본인이 5에서 3의 commit 위치로 돌아가기 위해 reset하게 되면 3이후의 모든 내용이 git상에 없어졌기 때문에 길이 이어져 있지 않아 되돌아가기 까지 그 사이에 commit/push한 작업 내용이 모두 날아가거나 ㅁㅁ씨가 commit 또는 push를 못하는 에러가 발생하는 등의 무서운 일들이 발생하게 됩니다.) 따라서 협업 시엔 반드시 revert를 쓰시는 것이 심신에 안정감을 줍니다ㅎㅎ..


revert

위에서 본 무시무시한 reset과는 달리, 원하는 위치의 commit내용을 복사하여 현재 위치에 커밋하게 됩니다. 새로운 커밋이 생김으로써 이전의 커밋은 그대로 유지하기 때문에 revert 후 다시 되돌아가고 싶을 때 log를 통해 다시 그 위치를 확인 후 돌아갈 수 있습니다.(뒤가 없는 reset과는 확실히 다르죠?) 이러한 특징 덕분에 중간에 특정 커밋만 취소하거나 삭제하기에도 유용합니다.(헷갈릴 수 있어 추가하자면, 새로 생성된 커밋에는 복사한 내용이 빠져있는 채로 만들어져서 그 부분만 제외하고 수정이 가능하다 보면 됩니다. 저의 경우는 구간으로 쓸 수 있는 revert의 특성을 이용하여 설치내용을 commit한 1~3까지의 커밋내용을 제외하고 새로 커밋하고자 revert를 사용하였습니다.)


restore

현재 로컬 작업 내용을 버리고자 할 때 주로 사용합니다. 쉽게 말해 git status 사용 시 초록색이던 내용을 다시 빨간색으로 되돌릴 때 사용합니다. 즉, 로컬과 git에 아무것도 올라가지 않도록 다시 깔끔하게 기존 상태(원하는 커밋시점)로 되돌린다고 보시면 됩니다. 이전의 2가지 방법은 commit이 되어 있던 기록들을 기준으로 사용한다면, restore는 현재 status의 상태도 조절이 가능합니다. 이 친구 또한 이전 버전의 상태로 되돌아가는 방법이 있으며 reset처럼 이력이 말끔히 사라지기 때문에 주의를 요합니다.


2. 사용 방법

자세한 사용방법은 저 또한 아래 내용을 통해 많은 도움을 받았음을 언급하고 안내드리겠습니다.

 

git reset, revert로 이전 커밋으로 돌리기

git reset, revert로 이전 커밋으로 돌리기, git, github, issue, projects, milestone

kyounghwan01.github.io

 

 

[GIT] ⚡️ git add / commit / push 취소하기 💯 정리

기존 코드를 날리고 싶지않으면 origin(깃헙)에다가 push를 해놓고 리셋해야 원격서버에 내가 작업한게 남는다. 로컬에선 다 사라지기 때문이다. git add 취소하기 (파일 상태를 Unstage로 변경하기) 아

inpa.tistory.com

 

Git] Command Line으로 실수를 되돌리는 17가지 방법![1] - restore, revert, reset

목차 하나의 파일에서 commit하지 않은 local change 버리기 삭제된 하나의 파일 복구 하나의 파일의 수정사항 중 일부분만 버리기 local changes 모두 버리기 마지막 commit 문구 수정하기 (원격저장소로 p

bigexecution.tistory.com

시간을 들여 3페이지를 모두 보시면 이해가 조금 더 쉬우실테지만, 보통 되돌리기 또는 삭제를 찾는 분들께서는 멘붕 상태일 것을 감안하여 최대한 간결하게 설명드리겠습니다.

//모든 시작은 현재 상태를 확인하며 시작합니다.
git status

//초록색 글자: 쉽게 말해 git에 저장이 되어 있는 상태이다.(git 내에도 많은 공간이 나뉘어 있지만 여기서는 쉽게 작성하고자 생략하였다.)
//빨간색 글자: 새로 생성하거나 수정 후 저장되지 않은 상태의 파일/폴더를 말함.

//이전 커밋 기록 나열하여 보기
git reflog

//내역 확인(최신 커밋이 0이다.)
70bf317 (HEAD -> miles, origin/miles) HEAD@{0}: commit: Install sequelize
f499ceb HEAD@{1}: commit: install ExcelJS
055b251 HEAD@{2}: commit: excel download용 패키지 설치
986c4fd HEAD@{3}: commit: add excel export
ca04ff3 HEAD@{4}: commit: NewsLetter SMTP 설정완료
//로그에서 나갈땐 q쓰고 엔터치면 다시 상태창에서 글이 써진다.

//기본 사용(-mixed 생략가능)
git reset (-mixed) HEAD~1 //마지막 커밋 취소(=HEAD1로 돌아감)
//모두 삭제(한번 사용 후 로컬의 내용들도 사라질 수 있으니 주의)
git reset --hard HEAD~2 //HEAD2로 돌아가며 작업한 내용들 모두 사라짐.
//강제 push만 가능

//새로운 커밋 생성 후 내용 덮어쓰기(각각의 로그도 기록됨)
git revert 986c4fd //add excel export 커밋상태로 되돌아 간다.
git revert f499ceb,055b251, 986c4fd //이렇게 구간으로 쓸 수도 있다고 함.
//commit은 자동으로 새로 생성됨. push를 강제로 하지 않아도 된다.

//특정 커밋 상태로 되돌리기(로컬 내용 저장 안해도 돌아갈 수 있음. 버리고 돌아감.)
git restore --source=ca04ff3 (파일명) //파일명까지 쓸 경우 해당 파일만 적용되며 생략 시 전체 되돌리기.
//commit 수정 가능 상태로 돌아감. push 가능(현재 커밋하지 않은 상태의 경우 내용 사라짐.)

//상태 상관 없이 git에 올라간 저장내용 취소(초록->빨강으로)
git restore --staged (파일명)

//현재 수정된 내용 모두 삭제하고 원하는 커밋 위치로 이동하기
git restore . //되돌릴 수 없음 '.'은 띄워쓰기 구분하여 작성

원하는 방식을 사용하되 모든 작업은 꼭 하고 나서 status로 다시 상태를 확인하시고 마저 작업하시길 권장드립니다.

모두 git으로 복구 성공하시길 바랍니다. 화이팅!