git branch 관련해서 정리하다가 reset까지 오게 되어 정리하면 유용하게 쓰일 것 같아서 정리하고자 한다.
개념
- reset : 시간을 과거의 특정 사건(commit)으로 되돌린다. 파일의 기록이 없어진다.
- revert : 현재에 있으면서 과거의 특정 사건(commit)들만 없던 일로 만든다. 기록이 남는다.
→ reset은 아예 현재가 없었던 것 처럼 원하는 과거로 돌아갈 수 있다. 정말 말 그대로 리셋 즉 초기화가 된다. reset은 이력을 남기지 않는다. 따라서 현재까지의 commit 이력을 남기지 않고 원하는 시점으로 완전히 되돌아가고 싶을 때 사용할 수 있다. 또한, 기록이 남지 않아 그에 대한 파일이나, 협업을 하고자 할 때는 피하는 것이 좋다.
revert는 과거로 돌아가겠다는 이력을 남겨두고 원하는 시점으로 돌아간다. 즉, 이전의 commit 내역을 남겨두고 새로운 commit을 생성하면서 과거로 돌아가게 된다.
reset
git reset --hard a0fvf8
을 하면, 'a0fvf8' commit으로 돌아간다. 그리고 이후 어떻게 됐는지 보면
위의 그림과 같이 commit 히스토리에 C,D 커밋이 아예 사라진다.
revert
revert를 이용해 B 커밋으로 돌아가려면
git revert 5lk4er
D 커밋 revert를 하고
git revert 76sdeb
C 커밋 revert를 해줘야 한다. 위와 같이 뒤 커밋부터 순차적으로 revert를 해준다.
그럼 이렇게 revert한 내용의 커밋 이력을 남기면서 B로 돌아갈 수 있음을 확인할 수 있다!
2. 언제 reset를, 언제 revert를 쓸까?
예를 들어, 협업 중에 내가 이전에 코드로 돌아가 다시 코드를 짜고 커밋을 했을 경우를 생각해볼 수 있다. reset을 해서 커밋할 경우 다른 사람이 pull하고, add과정을 거친다음 commit했을 경우 충돌이 발생할 수 있기 때문이다. 다른 사람의 커밋에는 기존의 코드가 존재하기에 충돌이 일어난다. 만약 혼자 하는 프로젝트라면 git push --force 를 이용해 연결할 수 있다. 강제로 원격과 로컬 저장소의 코드를 일치시키는 것이다.
그렇지만, 같은 branch를 공유하는 협업 프로젝트에서 내가 멋대로 커밋 이력을 삭제해버린다면 다른 사람이 push 할때 충돌이 날 것이다.
따라서, 협업 프로젝트에서 이전의 커밋으로 돌아가고 싶을 땐 revert를 사용하는 것이 좋다. 중요하기에 여러번 서술해놓는다.
3. reset과 revert의 사용
git workflow
이를 사용하기 위해서는 git의 workflow에 대해서 이해할 필요가 있다. 대표적으로 세가지로 나눌 수 있다. working direcotry , staging area, repository(local repo)으로 나눈다.
- working directory : 우리가 작업하고 있는 현재 폴더로 수정할 파일들이 있는 곳
- Working Directory의 모든 파일은 Tracked와 Untracked로 나뉜다.
- Tracked 파일은 이미 Snapshot에 포함돼 있던 파일이며, Unmodified, Modified, Staged 상태중 하나의 상태를 갖는다.우리가 터미널에서 git status로 상태를 조회 해볼때마다 매번 현지 이 상황의 상태에 대해 알려준다.
- commited : 데이터가 로컬 저장소에 안전하게 저장됐다는 것을 의미한다.
- modified : 수정한 파일을 아직 로컬 저장소에 commit하지 않은 것을 의미한다.
- staged : 현재 수정한 파일을 곧 Commit할 것이라고 표시한 상태를 의미한다.
- https://t1.daumcdn.net/cfile/tistory/036DEB3F50BF4DAC01
- Tracked 파일이 아닌 모든 파일은 Untracked 파일이다.
- Tracked 파일은 이미 Snapshot에 포함돼 있던 파일이며, Unmodified, Modified, Staged 상태중 하나의 상태를 갖는다.우리가 터미널에서 git status로 상태를 조회 해볼때마다 매번 현지 이 상황의 상태에 대해 알려준다.
- Working Directory의 모든 파일은 Tracked와 Untracked로 나뉜다.
- Staging Area : Index라고도 부르며 , 버전을 만들려고 준비중인 파일들의 스냅샷의 데이터가 저장된 곳
- Local repository : Git directory가 있는 곳을 말한다. Git이 프로젝트의 메타 데이터와 객체 오브젝트를 저장하는 곳
reset
git reset --soft [commit ID] git reset --mixed [commit ID] git reset --hard [commit ID] git reset HEAD~10 git reset HEAD^
- soft : commit된 파일들을 staging area로 돌려놓음. (commit 하기 전 상태로)
- mixed(default) : commit된 파일들을 working directory로 돌려놓음. (add 하기 전 상태로)
- hard : commit된 파일들 중 tracked 파일들을 working directory에서 삭제한다.
- HEAD~취소할커밋수 : 현재로부터 원하는 만큼의 커밋이 취소된다.
- HEAD^ : 가장 최근 커밋이 취소된다. (기본옵션 mixed)
revert
git revert [commit ID]
지정한 commitid로 돌아간다.