Environment/Git & Github

Git) Git Reset (Checkout, Hard, Mixed, Soft)

오열매 2022. 10. 1. 20:32

 

 

시작하기 전 주의사항: Git CLI로 작업할 때에는, 항상 작업 디렉터리에 있어야 한다.

 

다른 곳에서 git 명령어를 사용하면 골치 아픈 일이 벌어질 것이다.

 

하지만 이미 골치 아픈 일이 벌어졌거나, 이전의 시점으로 프로젝트를 되돌리고 싶다면 Reset이 필요하다.


1) Checkout

 

실습으로 진행해본다.

 

한 줄씩 라인을 작성하고 있는데, 두 번째 라인을 완성시킨 시점에서 첫 번째 라인만 작성했던 commit으로 되돌아 가고 싶다.

 

git log에서의 HEAD는 모든 Commit이 합쳐진 파일의 현재 위치이다.

 

HEAD의 위치를 다른 commit으로 바꾼다면, 그 위치가 현재 파일의 위치가 되는 원리이다.

 


 

checkout은 HEAD의 위치를 다른 commit으로 바꾸는 작업이다.

git checkout <commit 코드>

제대로 된 실습을 위해, commit을 여러개 추가했다.

(참고로 spacebar를 누르면 이전 commit 내역들이 추가로 보인다. 안 보여서 없는 줄 알고 생성했다.)

 

현재 HEAD가 Test Line 4 에 있는데, 이를 Test Line 2로 바꿔본다.

Test Line 2 로 이동했고, 파일 내용 또한 이전으로 되돌아갔다.

 

checkout은 commit을 확인하고 commit을 삭제할지, 이전 시점으로 되돌아갈지 결정하는 용도이다.

 

다시 원래의 최신 commit으로 되돌아가려면

git checkout main

위 코드를 입력하면 된다. (original branch가 master 면 git checkout master)

 


2) Hard Reset

 

 

commit을 아예 이전으로 돌리고 그 이후의 것들은 완전 삭제하고 싶다면, 아래의 코드를 사용하면 된다.

 

git reset --hard HEAD^

--hard:  '삭제한다'는 옵션. reset하는 파일들을 완전히 삭제하고 과거로 돌아간다.

 

HEAD^ : HEAD 에서 얼마나 멀리 갈지를 나타낸다. (HEAD^는 한 커밋 전으로, HEAD^^는 두 커밋 전으로.)

 

 

위 상태에서 git reset --hard HEAD^ 를 입력하면 Test Line 3 로 가야 한다.

 

 

성공했다. 하지만 여기서 끝이 아니다. 

              

원격 저장소에는 방금 Hard Reset한 commit 내역이 존재한다. 이를 강제로 push 해줘야 한다.

git push origin main --force

 

원격 저장소에도 reset이 적용됐다.

 

 


+) 관련 Error

 

 

만약 코드를 입력했는데 위 사진처럼 'More?' 라고 물어본다면?

git reset --hard HEAD~3

>>> HEAD 뒤에 '~숫자' 를 붙이면 된다. 예를 들면, 1개 commit 전으로 하려면 '~1' 이다.

 


3) Mixed Reset

 

 

git reset HEAD^

 

Hard Reset 코드의 --hard 라는 부분은 옵션이다. 참고로, Soft Reset 은 --soft 를 입력한다.

 

위 코드는 아무 것도 없으므로, 어느 쪽에도 속하지 않는 Mixed Reset이다.

 

Mixed Reset은, 방금 Commit한 변경사항들을 다시 Stage(작업 중) 영역으로 옮기는 것이다.

(Commit은 돌아가지만, 변경된 파일들은 그대로 둔다.)

 

예시를 위해 위 글을 작성했다.

 

작업하다보니 아직 수정할 내역이 있어서 되돌려야 한다. Mixed Reset을 시행한다. ( git reset HEAD^ )

 

 

다시 변경사항이 유효한 상태(Unstaged)로 돌아왔다. 이어서 수정을 하면 된다.

 

 


하지만 위의 실습처럼 push를 했는데 다시 고쳐야 하는 상황에는, 특별한 경우가 아니면 다시 수정해서 추가로 commit해도 될 것 같다고 생각한다.

 

Mixed Reset이 유용해 보이는 상황은

'git commit 명령어를 입력하여 git log에 기록된 상황에서 취소하고 싶은 경우' 이다. (push는 하지 않은 상황)

 

실제로 실습을 하면서 해봤다.


4) Soft Reset

 

대부분의 경우에 Hard Reset과 Mixed Reset을 사용한다고 하여, 실습을 진행하진 않았다.

 

Mixed Reset과 매우 비슷하다.

 

Mixed는 Commit을 되돌리며 해당 Commit에서 작업했던 내역들을 Unstaged 상태로 둔다고 했는데,

Soft는 이를 Staged 상태로 두는 것 뿐이다.

 

이미 완료된 내역과 작업 중인 내역을 구분한다. 

 

 

# Unstaged: 변경사항이 있는 파일의 상태. (필요 과정: git add - git commit - git push)

# Staged: 변경사항이 있는 파일이 git add 로 인해 push 대기열에 올라가 있는 상태 (필요 과정: git commit - git push)

 

 


알게된 추가 명령어들]

 

git remote -v

>>> 원격 저장소 주소를 Terminal에서 확인

 

git pull origin main

>>> main branch에 있는 내역을 현재의 코드로 가져온다.

 

git push origin main --force

>>> 강제로 push하는 코드. 위에서 한 번 언급했지만, 대부분의 경우에 사용하면 좋다고 하길래 다시 정리한다. 

        merge conflict를 피할 수 있다.


참고)

 

- https://nomadcoders.co/git-for-beginners/lectures/2046

- http://www.dreamy.pe.kr/zbxe/CodeClip/3770489