[Git] 작업 되돌리기

Ihwan Shin·2021년 1월 5일
0

git

목록 보기
4/5

Git에서 작업 되돌리기

commit 또는 push 했던 내용이 잘못되어서 이전 상태로 되돌려야 하는 경우는 종종 발생한다.

로컬에 commit만 하는 경우에는 쉽게 reset 기능으로 처리할 수 있지만, 원격 저장소까지 push가 된 경우엔 revert를 사용한다.

Reset

특정 지점의 과거 커밋으로 이동, 이동된 이후의 커밋은 삭제된다.

사용 상 주의 요망 : 과거 커밋으로 이동하면서 그 이후 커밋은 삭제되어 되돌릴 수 없으므로 주의가 필요하다.

특히, push 후에는 다른 사람의 코드에 문제를 일으킬 소지가 있으므로 금지한다.

즉, 애초에 commit 하지 않은 것처럼 예전 커밋으로 브랜치를 옮기는 것이다.

기본 사용법

주로 사용하는 옵션 3가지 : --mixed, --hard, --soft / 기본값은 --mixed

git reset [--옵션] 커밋ID

git reset --hard

hard 옵션을 적용하면 해당 커밋ID의 상태로 워킹디렉토리와 Staging 영역 모두 초기화 된다.
변경 이력 및 내용 전부 삭제한다.

git reset --mixed

mixed 옵션을 적용하거나 옵션을 적용하지 않으면 해당 커밋ID의 상태로 Staging 영역은 초기화되고 워킹디렉토리는 변경되지 않는다.

git reset --soft

soft 옵션을 적용하면 해당 커밋ID의 상태로 Staging 영역과 워킹디렉토리 모두 변경되지 않는다.

reset의 활용

--hard:
branch 이동, 과거로 완전 복구

--mixed(default):
staging area에서 빼기.

--soft:
commit 되돌리기.

reset 시, 주의사항

  • hard 옵션으로 reset 후, push 할 때

로컬 저장소의 커밋 히스토리가 원격 저장소의 커밋 히스토리보다 뒤에 있어 (non-fast-forward) 인 경우, push를 진행시 오류가 발생한다.

이럴 때는 강제로 덮어써야 하므로 push에 -f 또는 -force 옵션을 주어 강제로 덮어쓴다.

  • reset을 원격저장소에서 사용할 때

혼자 사용하는 브랜치가 아니므로 reset 후, 삭제될 커밋 중 다른 사람이 작성한 커밋이 있을 수 있다.

또, 커밋들을 되돌리기 전 다른 사람이 커밋들을 땡겨갔다면 다른 사람들의 로컬 저장소에는 내가 되돌린 커밋이 남아있다.

그래서 reset은 혼자만 사용하는 브랜치일 때 / 다른 사람들이 해당 브랜치를 받은 적이 없다고 확인된 경우 사용한다.

Revert

reset 주의사항을 고려한 변경하고 해당 되돌린 내용을 다른 사람들과 공유할 수 있는 기능이다.

특정 지점의 과거 커밋으로 이동, 변경 내역은 유지한다.

즉, 이력이 남기 때문에 많은 사람들과 작업할때 유용하다.

git revert <되돌릴 커밋>
git revert 2664ce8

되돌릴 커밋이 여러개라면 범위를 주어서 여러개를 선택할 수도 있다.

git revert 2664ce8..15413dc

revert과정에서 오류가 발생할 시
직접 conflict를 수정해야 한다.

그 후,

git revert --continue		# 진행하거나
git revert --abort		# 취소할 수 있다.

깃(Git)에서 유실된 커밋 복원하기

작업을 하다가 rebase 실수 또는 잘못된 명령어나 조작 실수 등 다양한 이유로 인해 작업이 날라 가는 경우가 있다.
git의 명령어 중에 reference logs 라는 의미를 가진 reflogs 라는 옵션을 사용하여 해결한다.


기타

git reflog

위 명령어가 실행되면 나오는 화면에서 저장소 tree에 일반적으로 보이지 않는 모든 commit들을 살펴볼 수 있다.
여기서 유실된 commit을 찾은 후 해당 commit의 commitID를 찾아서 상황에 맞게 다음 명령어들을 사용하면 된다.

git reset --hard {commitID}

해당 유실된 커밋을 HEAD로 하는 tree로 돌려놓으려면 아래처럼 리셋 명령어를 실행하면된다.

git cherry-pick {commitID}

해당 유실된 커밋만 현재 브랜치로 가져오려면 아래처럼 체리픽을 이용한다.

profile
판교 주니어 개발자💻(since. 21/07/01)

0개의 댓글