현재 포스팅에서는 단순히 사용을 위주로 설명이 되어있습니다!!
혹시 git의 동작 원리를 이해하고 이를 바탕으로 add,commit과 같은 명령어를 이해하고 싶으시다면 이후 깃의 동작 원리를 다루는 포스팅을 참고 해주세요 :)
우선 해당 명령어들을 수행해보기 전 정리해보자면 다음과 같습니다
git add : Git에서 변경 내용을 스테이징 영역에 추가하는데 사용
git commit : Git에서 새로운 커밋을 생성하는데 사용
git reset : 변경 내용을 되돌리거나, 스테이징 영역에서 파일을 제거하거나, HEAD 포인터를 다른 커밋으로 이동하는 등의 기능 수행
git revert : 이전 커밋에서 발생한 변경 내용을 되돌리는 새로운 커밋을 생성하는데 사용
Commit 과정
git add "파일 이름"
우선 커밋을 하려면 해당 파일을 Untracked 상태에서 Tracked되게끔 해당 파일을 add 합니다.이때 파일이름 위치에 점(.)을 입력하면 현재 모든 Untracked 상태에 있는 파일을 Tracked 상태로 바꿉니다.
보통 각 파일을 어디의 커밋(버전)에 넣고싶은지 개발 과정에 따라 차이가 있기에 위와 같이 각각 등록하는 메서드도 존재한다고 생각하시면 됩니다.
git commit -m "FIRST COMMIT"
이후 해당 파일을 커밋 메세지와 함께 커밋하면 됩니다.
각각의 커밋은 위와 같은 형태로 존재하고
각각의 커밋은 고유의 해시 코드(또는 커밋 ID)를 가지고 있다는점 기억해 주세요 :)
Reset, Revert
Git에서 프로젝트를 과거로 돌리는 방법에는 Reset과 Revert가 있습니다.
Reset은 말 그대로 시간을 과거로 되돌리는 방식이라고 이해하시면 좋습니다. Reset의 경우 현재 한 단계 전 시점인 Add team Cheetas로 되돌아가기 위해, 돌아간 이후의 커밋들을 히스토리에서 지워버리게 됩니다. 이때 히스토리를 지우는 행위는 git reset이 받는 옵션(soft, mixed, hard)에 따라 달라집니다.
- soft: HEAD 포인터를 이전 커밋으로 이동시키면서, 이후 커밋들의 변경 내용을 스테이징 영역에 보존합니다.
- mixed(default) : HEAD 포인터를 이전 커밋으로 이동시키면서, 이후 커밋들의 변경 내용을 스테이징 영역에서 제거합니다. 이때 변경 내용은 수정된 상태로 워킹 디렉토리에 유지됩니다. 이는 커밋을 준비하는 단계를 거치지 않고, 변경 내용들을 마치 수정한 것처럼 취급하게 됩니다.
- hard : HEAD 포인터를 이전 커밋으로 이동시키면서, 이후 커밋들의 변경 내용을 스테이징 영역 및 워킹 디렉토리에서 모두 제거합니다. 즉 변경 내용은 완전히 삭제됩니다.
위 옵션들을 추후에 더 자세히 다뤄볼것이니 단순히 참고만 해주세요 :)
Revert의 경우엔 Reset과 다르게 내역을 삭제하는 것이 아니라, 돌아가고자 하는 커밋(시점)에 대해 거꾸로 동작하는 커밋들을 넣음으로서 결과적으로 Add tem Cheetas 때와 같은 상태로 돌아가게 하는 방법입니다.
Revert의 경우 돌아가고자 하는 시점에서의 내용을 거꾸로 실행하고, 이후의 내역들을 유지하면서 바꿀 부분만 되돌릴 수 있다는 장점을 가집니다. 반면 Reset의 경우엔 현재 시점의 이후 커밋 내용들을 전부다 삭제하기에 위험합니다(hard 기준). 따라서 한번 공유된 커밋들은 revert를 사용해서 되돌리는 것이 바람직합니다!
정리하자면 revert는 특정 커밋을 취소하고, 그 취소 내역을 새로운 커밋으로 만듭니다. 이러한 방법은 원격 저장소에 작업을 할 때 유용하고, 이전 커밋 이력을 유지하면서 특정 변경 사항만을 되돌릴 수 있습니다. reset은 현재 HEAD를 특정 커밋으로 이동시키며, 선택적으로 작업 디렉토리를 업데이트합니다. 이는 로컬에서 작업하고 아직 공유하지 않은 커밋을 수정하거나 삭제할때 사용됩니다.
Reset, Revert 직접 해보기
현재 헤드가 위치한 FIFTH COMMIT에서 SECOND COMMIT으로 Reset을 통해 되돌아 가보겠습니다.
// 밑의 해시 코드는 SECOND COMMIT의 해시 코드
git reset --hard 7a9f54d3bab4e91ec8474a431275b91580467f59
위 명령어 입력 시 hard 옵션이기에 SECOND COMMIT 이후의 모든 커밋들이 지워진것을 확인할 수 있습니다!
이때 저는 기존의 .git 파일을 백업해놓은 다음, 복사 붙여 넣기를 하였습니다. 이때 기존 내용을 복원하려면 복사 붙여 넣기 이후 git reset --hard를 입력하면 됩니다. 이때는 해시 코드를 입력하지 않는 것이 특징입니다.
이제는 revert를 통해 이전 커밋으로 되돌려보겠습니다.
// 현재 포스팅의 경우 3번째 커밋 해시 코드를 바탕으로 진행하였음
git revert (되돌릴 커밋 해시)
이때 3번째 커밋에서 작업한 내용(ex: 파일 수정 및 생성)을 무효화 하는 새로운 커밋이 생긴것을 확인할 수 있습니다. 즉 3번째 커밋 작업 내용을 무효화하고 두번째,네번째,다섯번째의 커밋 내용을 기반으로 현재 커밋이 구성되어 있다고 이해하시면 됩니다.
만약 revert 내용이 자동으로 커밋 되길 원하지 않는다면 하단처럼 명령을 내리면 됩니다.
git revert --no-commit (되돌릴 커밋 해시)
이 경우 지정된 커밋을 revert하기 위한 변경 내용은 스테이징 영역에만 추가되며, 커밋은 수동으로 생성해야 합니다.
위와 같은 명령어는 보통 여러개의 커밋을 동시에 되돌리고자 할 때나 충돌이 발생한 부분을 수정한 후 수동으로 커밋을 하려고 할때 주로 사용합니다.
'Git&GitHub' 카테고리의 다른 글
커밋 관리하기(커밋 컨벤션, hunk, stash, 과거 커밋 수정,삭제,병합,분할) (0) | 2023.06.23 |
---|---|
Git 심화개념 - 2(HEAD, Fetch vs Pull) (0) | 2023.06.23 |
Git 심화 개념(SnapShot, 분산 버전 관리, Git의 3가지 공간) (0) | 2023.06.23 |
Branch(merge, rebase, collision 해결) (0) | 2023.06.23 |
Git 최초 설정 및 프로젝트 관리 (0) | 2023.06.22 |