과거로 돌아가는 방법 (reset , revert) // Git(2) / 노션이동완료

2022. 2. 25. 19:51
  • 인프런에서 얄코선생님의 git강의를 보면서내용을 정리

1. 과거로 돌아가는 두가지 방법 : Reset / Revert

1) reset 

  • 말 그대로 시간을 딱 어느 시점으로 되돌림
  • 예를 들어, 커밋1 > 커밋2 > 커밋3 이후 작업을 진행하다가 커밋1로 돌아간다면, 커밋1 이후의 모든 작업은 취소됨
  • 커밋 1이후의 작업내역들은 옵션(hard, mixed, soft)에 따라 다양하게 처리할 수 있음

 

2) revert

  • 특정 시점(커밋)에 있었던 일들을 완전히 반대로 진행함. 그러나 특정 시점으로 되돌아가는 reset과 다르게, revert가진행된 새로운 커밋을 만드는 것임
    • 예를 들어, 커밋1에서 A파일에 -1이라는 값을 추가하고 커밋2에서 B파일에 1을 추가했다고 하자.
    • 이상황에서 커밋1을 revert한다는 것은, 커밋0에서 했던 작업을 완전히 반대로 해줌.
    • 만약 revert된 것을 commit한다면 즉 커밋3는 커밋1의 반대, 즉A파일에 다시 +1이 되고, B는 커밋1에서 +1이 된 상태를 유지함
    • 만약 커밋1로 reset을 했다면, 커밋2에서 진행된 B의 변화(+1)도 사라졌을 것임
  • reset에 비하면 다음의 장점이 있음
    • 커밋 하나하나를 기록으로 남겨야 할때(리셋은 커밋자체를 삭제해버리니까)
    • 딱 특정 시점에서 진행한 작업을 취소하고, 나머지 시점(커밋)의 작업은 그대로 유지할 때
    • 협헙할 때에는, 한번 공유가 된 commit은 reset이 아닌 revert를 하는게 국룰임(commit된 코드를 기반으로 작업한 사람들과 심각한 충돌이 발생할 수 있음)

 

2. reset

  • reset하려면, 특정 시점의 해쉬가 필요함
  • git log를 입력하면, git commit들이 최신순으로(마지막 것이 맨 위로) 출력됨.
    • j와 k로 위아래로 콘솔이동가능. q로 탈출가능함
    • 돌아갈 시점의 커밋 해시를 복사(전부 복사하지 않아도 ㄱㅊ)
  • 콘솔에 다음을 입력해주면 됨
  • 이때, '돌아갈 커밋해시'를 입력해주지 않으면, 바로 직전의 commit으로 이동함
git reset --hard (돌아갈 커밋 해시)

 

2.1)reset의 세가지 옵션

  • 옵션 다음에 아무것도 기록하지 않으면, 직전 커밋이 대상이 됨 ex)git reset --hard >> 직전 커밋으로 돌아감
  •  --hard
    • 직전의 커밋상태로 돌림.
    • 즉 내가 어떤 상황에 있건 파일들을 직전에 커밋된 상태로 초기화시킴 >> 작업내역날아감
  • --mixed
    • 디폴트(따로 안적어주면 디폴트가 실행됨).
    • 직전의 커밋을 취소하고, 직전의 커밋 내용을 repository에서 working directory로 이동(직전 커밋이후의 변경내용이 git add가 되어 있지 않은 상태)
  • --soft
    • 직전의 커밋을 취소하고, 직전의 커밋 내용을 repository에서 staging area로 이동(직전 커밋 이후의 변경내용이 git add가 되어 있는 상태)

 

  • 추가)대상으로 입력한 커밋시점으로 딱 돌아가는(reset) 거임
    • 커밋1 > 커밋2 > 커밋3 > 커밋4 을 한 상황에서, 커밋2의 해쉬태그를 입력하고 reset을 하면 커밋2가 딱 완료된 상황으로 돌아가는 것임
    • 옵션을 hard를 햇다면, 커밋2가 완료된 시점 이후의 모든 내용이 사라짐
    • 옵션을 mixed를 햇다면, 커밋2가 완료된 시점 이후의 모든 커밋이 사라지고, 작업한 모든 내용이 working directory에 남아있음(즉, 작업 내용은 사라지지 않고, staging도 되어 있지 않음)
    • 옵션을 soft로 햇다면, 커밋2가 완료된 시점 이후의 모든 내용이 스테이징되어 있는 상태가 됨
    • 그러면 만약에, 커밋4이후에 staging하지 않은 내용(즉 저장만 하고 add는 하지 않은 내용)이 있을 떄 soft reset을 하면 어떻게 될까?
      • 이 부분에 대해서 테스트를 해봣는데, 헝크별로 다르게 나옴.
      • 즉 커밋2 이후 커밋4까지의 작업은 staing된걸로, 커밋 4이후 저장은 햇으나 staging하지 않은 부분은 그대로 staging하지 않은 걸로 나옴

동일한 파일명을 확인할 수 있다. 즉 헝크별로 스테이징 된 것도있고, 스테이징 되지 않은 것도 있는 것임

 

 

2.2)reset후에 되돌리는 법

  • reflog를 활용하면 됨
  • reflog는 git에서 일어났던 모든 일의 log내역임
git reflog

reflog. git에서 일어났던 모든 일의 내역

 

  • relofg의 번호 + 'reset --hard' 를 이용해서 그 일이 있었던 시점으로 돌아갈 수 있음.
  • 예를 들어, cg4라는 메세지를 가진 커밋이 있었던 때로 돌아가려한다면 다음과 같이 입력해주면 됨
git reset --hard 8f902e6

 

3. revert

  • 일단은 reset과 거의 동일함
  • git log로 돌아갈 커밋의 hash확인하고 q로 빠져나와서 다음을 입력
git revert (되돌릴 커밋 해시)
  • 만약 메세지를 입력하는 창이 뜨면, 메세지를 적당히 입력 후 wq로(원래 :wq인데 :가 있음) 저장하고 나올 수 있는 듯함

 

  • 위의 명령어대로 하면, 특정 시점으로 revert 후 바로 commit이 됨
  • 그러나, 특정 시점으로 revert만 하고, 커밋을 하고 싶지 않을 수도 있음. ex) 특정 시점의 commit revert한 후, 추가로 수정을 조금 더 한다음 커밋을 하려는 경우
  • 이때는 다음과 같이 하면 됨
git revert --no-commit (되돌릴  커밋 해시)

 

3.1)revert : commit의 충돌

  • revert는 reset과 다른게, 커밋들끼리 충돌이 발생할 수 있음
  • 예를 들어, 커밋0에서 A파일 생성. 커밋1에서 A파일의 내용 수정. 커밋 2에서 B파일 생성을 끝낸 상태에서, 커밋0을 revert하면, 커밋0의 revert는 A파일을 삭제하려하고, 커밋 1은 A파일을 수정한 것이니 두 커밋이 충돌함
  • rm또는 add해서 충돌을 정리한 후, git revert --continue로 revert를 계속 진행
#rm or add
git rm leopards.yaml 또는 git add leopards.yaml

#revert --continue
git revert --continue



 

BELATED ARTICLES

more