HEAD
Git에서 HEAD는 현재 작업 중인 브랜치의 가장 최신 커밋을 가리킵니다. 이는 현재 작업중인 브랜치의 맨 끝단으로, git switch 또는 git checkout 명령을 사용하여 다른 브랜치로 전환하면, HEAD는 해당 브랜치의 최신 커밋을 가리키게 됩니다.
만약 현재 브랜치의 헤드가 아니라, 커밋의 앞뒤로 이동하고 싶다면 아래 명령을 사용하면 됩니다.
git checkout HEAD^
이때 ^(or ~)의 갯수만큼 이전으로 이동할 수 있습니다. 이때 reset이랑 revert와 다르게 commit을 건드리지 않고 과거 시점으로 이동할 수 있는 것이 장점입니다! 다시 되돌아 가고싶다면 switch를 사용하면 됩니다
이러한 Head를 사용해서 Reset을 사용하면 해당 커밋의 해시 코드를 알아올 필요가 없습니다
git reset --hard HEAD~2
예를들어 해당 브랜치에서 두 단계를 reset 하고 싶다면 위와 같이 명령어를 입력하면 됩니다.
Fetch vs Pull
fetch는 원격 저장소의 최신 커밋을 로컬로 가져오기만 하는 반면, pull은 원격 저장소의 최신 커밋을 로컬로 가져와 merge 또는 rebase 합니다.
fetch의 경우엔 일종의 가상 브랜치를 추가하나 pull 때처럼 merge나 rebase를 하지 않습니다. 즉 이 말을 달리 해보자면 pull 과정에는 fetch가 포함되어있다고 생각하시면 됩니다.
git fetch
git push
만약 원격에서 branch를 추가 후 git fetch를 진행한다면
위와 같이 새로운 브랜치가 추가 된것은 확인 할 수 있지만 수정사항(새로운 브랜치 추가)은 반영되어 있지 않습니다.
즉 fetch는 보통 바뀐 내용을 검토하고 변경사항을 로컬에 반영할지 말지 결정하고 싶을 때 사용한다고 보시면 됩니다!
예를 들어, main 브랜치에서 작업하고 있고, 원격 저장소의 main 브랜치에 새로운 커밋이 있다고 가정해보겠습니다. 그러면 다음과 같이 할 수 있습니다.
git fetch
git checkout main
git merge origin/main
git fetch를 통해 원격 저장소의 변경 사항을 가져오고, git checkout main을 통해 main 브랜치로 전환합니다. 그리고 git merge origin/main을 통해 원격 저장소의 main 브랜치에서 변경 사항을 현재 브랜치로 병합합니다.
위와 같은 명령어들을 수행하고 나면 원격 저장소의 main 브랜치에서 변경 사항을 현재 브랜치로 병합합니다.
그런데 일반적으로 git pull 명령어를 통해 원격 저장소의 변경 사항을 가져오고 바로 병합하는 작업을 한번에 수행합니다. git pull은 사실상 git fetch 후에 git merge를 실행하는 것과 같다고 보시면 됩니다.
만약 Git에 익숙하지 않으시다면 처음에 이러한 화면을 본다면 .... 당황하실수 있는데 여기서 origin은 원격 저장소의 브랜치를 가리킨다고 생각하시면 됩니다. new-branch와 origin/new-branch가 모두 있는 경우, 전자는 로컬의 상태를, 후자는 원격의 상태를 나타내므로 다른 브랜치로 취급이됩니다
이후 new-branch에서 여러 커밋을 추가하고 원격 저장소에 push를 한다면, 원격 저장소의 origin/new-branch가 로컬의 new-branch 상태와 동일하게 업데이트 됩니다!!
'Git&GitHub' 카테고리의 다른 글
커밋 관리하기(커밋 컨벤션, hunk, stash, 과거 커밋 수정,삭제,병합,분할) (0) | 2023.06.23 |
---|---|
Git 심화 개념(SnapShot, 분산 버전 관리, Git의 3가지 공간) (0) | 2023.06.23 |
Branch(merge, rebase, collision 해결) (0) | 2023.06.23 |
git add, commit, reset, revert (0) | 2023.06.22 |
Git 최초 설정 및 프로젝트 관리 (0) | 2023.06.22 |