본문 바로가기

Study/Git & Github

Undo

before start 

log(history)를 수정하는 것은 기존의 커밋을 새로운 커밋으로 바꾸는 것이기 때문에, 이미 서버에 업로드 된 history라면, 즉 다른 개발자와 함께 공유하고 있는 경우라면, log를 수정하지 않는 것이 좋다.

 

working dir & staging area

초기화

git restore . | working dir에 있는 모든(.) 변화 상태를 초기화 

+) 이전에는 git checkout 커밋을 이용해서, 그 커밋으로 되돌아 가는 방법을 사용했다

git restore 파일명 | 파일의 변화 상태를 초기화

 

git restore --staged . | staging area에 있는 모든(.) 변화 상태를 다시 working dir로 가져온다 

git restore --staged 파일명 

 

git restore --source=해쉬코드 파일명 | 파일의 상태를 해당 커밋과 같은 상태로 만든다 

 

commit

수정하기 | 서버에 아직 등록하지 않은 커밋

git commit --amend | 지금까지 수정한 내용을 새로운 커밋이 아니라, 현재 브랜치의 가장 최신 커밋에 업데이트

git commit --amend -m "message" | 현재 브랜치의 가장 최신 커밋의 메세지를 수정

 

삭제하기 | 서버에 아직 등록하지 않은 커밋

 

git reset HEAD~3

 

git reset --mixed HEAD~n | HEAD 포인터가 가리키는 곳에서 n만큼 떨어진 commit으로 reset한다. n-1개의 커밋은 삭제된다. HEAD~n이 아니라 해쉬코드를 이용해도 된다. 

  • git reset HEAD~n와 동일하다.
  • reset 명령어를 사용한 뒤 git status를 확인해 보면, 삭제된 커밋의 파일 상태들은 삭제되지 않고, 현재 커밋의 working dir에 옮겨진 것을 확인해 볼 수 있다. 
  • git restore .를 이용하면 working dir를 모두 초기화 할 수 있다. 이 때 untracked files은 초기화 되지 않기 때문에  추가로 git clean -fd를 이용해야 한다(fd: false dir).  

 

git reset --soft 해쉬코드 | 삭제된 커밋의 파일 상태들을 working dir이 아니라 staging area로 옮긴다.

git reset --hard 해쉬코드 | 커밋을 삭제하면서, 그 커밋에서 수정하던 파일들의 상태까지도 완전히 삭제한다. 

  • git reset --hard HEAD | 내가 마지막으로 커밋한 이후에 수정한 모든 Local 파일들을 초기화할 수 있다. 

 

Reset 취소하기 

git reflog | reference log; HEAD가 지금까지 가리켰던 포인터와, 포인터에 해당하는 해쉬코드를 확인할 수 있다. git reset --hard 해쉬코드를 이용하면 해당 상태로 돌아갈 수 있다. ??? 단, 한번이라도 commit을 했던 상태여야 한다. 

  • 만약 한번도 commit을 하지 않은 상태였다면? 
    • vscode에 있는 local history라는 extension을 이용할 수 있다

 

Revert | 서버에 이미 등록된 커밋을 취소하고 싶을 때

git revert 해쉬코드 | 해쉬코드에 해당하는 커밋에서 변경했던 내용을 모두 삭제/취소해 주는 새로운 커밋을 등록한다. 즉 커밋을 수정하지 않는다. 

git revert --no-commit 해쉬코드 | 바로 커밋하는 것이 아니라, 해당 커밋의 변경 사항들을 staging area에 추가한다. 특별한 상황이 아니면 자주 사용하지 않는다.

 

Interactive rebasing | 서버에 아직 등록하지 않은 커밋

git commit --amend 는 최신 커밋을 업데이트 할 때 사용할 수 있었다.

만약 최신 커밋이 아니라, 이전에 작성된 커밋을 수정하고 싶을 때는 어떻게 해야할까? rebase의 -i 옵션을 이용하면 된다.

그러나 rebase를 이용하면, 해당하는 커밋은 새로운 커밋이 된다. 즉 그 커밋 이후에 등록된 커밋의 포인터가 새로운 커밋을 가리키게 되고, 포인터를 바꾼 커밋 또한 새로운 커밋이 된다. 따라서 최초에 수정한 커밋 이후에 등록된 모든 커밋들도 새로운 커밋이 된다. 따라서 이미 서버에 등록된 커밋을 rebase하는 것을 주의해야 한다. 

 

git rebase -i 수정하고 싶은 커밋의 이전 커밋 | 명령어를 입력하면 연결한 tool에 아래와 같은 파일을 보여준다. commands를 참고해서 명령어를 작성하면, 원하는 일을 수행할 수 있다. 

 

git rebase -i

 

  • edit 명령어를 이용하면 해당 커밋을 수정할 수 있다.
  • 이 때 터미널에서 reset --mixed HEAD~1 명령어를 입력하면, 해당 커밋의 바로 이전 커밋과 같은 상태로 돌아가면서, 해당 커밋에서 업데이트한 모든 변경사항들은  working dir로 가져올 수 있기 때문에, 커밋을 수정하기 용이하다. 

'Study > Git & Github' 카테고리의 다른 글

git의 원리  (0) 2022.04.15
Remote  (0) 2022.04.15
Stash  (0) 2022.04.13
Branch & Merge  (0) 2022.04.11
Basic  (0) 2022.04.11