Git 시작하기(5)
Git / Github
2022.02.03.
그럼 필요한 개념을 익혔으니 시간 축으로 프로젝트를 관리해보자. 시간 축 이동과 관련된 Git 명령어는 “checkout, reset, revert” 가 있다.
시간을 되돌리는 방법
1. checkout
checkout 명령어는 HAED가 가리키는 Branch를 전환하거나, Working tree의 파일들을 복구할 때 사용한다. 즉, Woring Directory의 상태를 Branch나 Commit으로 가져오는 역할의 명령어다.
git checkout <branch>
git checkout <commit-hash>
- checkout 뒤에 인자로 Branch를 쓰면 HEAD가 Branch를 가리키고(=Attached HEAD State), Commit을 쓰면 HEAD가 Commit을 가리킨다(=Detached HEAD).
- 인자로 pathspec을 쓰게 되면 해당 내역이 해당 브런치가 가리키는 버전으로 복구된다.
- Untracked file 은 되돌리더라도 삭제되지 않는다.
2. reset
reset 명령어는 현재 작업중인(HEAD가 가리키는)Branch가 가리키는 Commit을 변경하는 데 사용된다.
git reset --hard <commit-hash>
git reset HEAD~10 // 현재 브런치가 가리키는 버전으로부터 -10 이동
- unstaging 이나 commit reset의 기능으로 사용가능하다
- soft, mixed, hard 세가지 옵션이 존재한다.
- soft : HEAD가 가리키는 Branch를 이동한다, 리셋 이후의 커밋 내용들이 stage 상태로 존재
- mixed(기본명령) : soft + “Index를 변경한다”, 리셋 이후의 커밋 내용들이 unstage 상태로 존재
- hard : mixed + “working Tree를 변경한다”, 리셋 이후의 커밋 내용이 전부 삭제
3. revert
revert 명령어는 기존에 존재하는 버전을 취소, 복구(revert)하는데 사용된다. reset과 차이점이라면 해당 건 이후의 내역들은 유지한다는 것이다.
git revert <commit-hash>
- revert 명령어는 이력을 새롭게 남겨주기 때문에 협업시 반드시 revert를 사용해야한다.
- reset할 경우 remote repository와 동기화가 안되기 때문에 revert만 사용해야 push할 수 있다. (강제 push는 가능)
- 충돌이 일어날 경우, 사용자가 직접 처리해줘야한다. (rm 등으로 처리 후
git revert --continue
) - Commit을 되돌리고 싶을 경우
git revert --no-commit (commit-hash)
를 사용하여 되돌린다.
”reset의 작동 확실하게 이해하기” 에서 git init
부터 git reset
작동시 head, index, working directory 의 변화를 시각적으로 표현한 자료가 있는데, 이게 이해에 도움이 크게 되었다. 이제는 되돌리고 싶거나 버전을 이동이 필요할 시에 무지성으로 검색해서 하는 것이 아니라, 생각해보고 어떤 명령어를 이용할지 판단할 수 있겠다.
참조
- Git공식 메뉴얼 : https://Git-scm.com/book/ko/v2
- 얄팍한 코딩사전 : https://youtu.be/1I3hMwQU6GU
- 프로그래밍막내 블로그 : https://youngest-programming.tistory.com/220