https://opentutorials.org/module/4032/24550
*HEAD의 이해*
HEAD를 옮긴다 : 현재의 working directory를 HEAD가 가리키는 버전으로 덮어쓴다. 해당 버전의 스냅샷이 그대로 불러와집니다.
HEAD, 너의 의미
내가 작업하고 있는 working directory.
reset과 checkout
git reset : branch가 가리키는 버전을 바꾼다.
git checkout : HEAD가 가리키는 branch나 버전을 바꾼다.
COMMIT을 reset & checkout하여 두개 비교하기
reset : HEAD가 branch를 가리키고 있을때, branch가 가리키는 버전을 바꾼다. HEAD가 아무것도 가리키지 않으면 checkout이랑 동일.
차이중 하나는.
branch가 가리키는 커밋객체가
바뀌느냐 아니냐 이다.
또한, git log로 살펴봤을때
reset을 하면 C커밋객체는 아무도 가리키고 있지 않기때문에
DELETE가 된다. --> 하지만 복원 가능하다!!
하지만 checkout은, 여전히 C커밋객체를 master가 가리키고 있기때문에 여전히 확인할 수 있다.
BRANCH를 reset & checkout하여 두개 비교하기
reset : HEAD를 master가 가리키고 있는 버전으로 바꿔라. --> head가 이미 master를 가리키고 있으므로 변경없음.
checkout : HEAD가 master를 바라보도록 해라 --> B에서 C로 옮겨진다.
Detached HEAD -> branch로부터 분리된 HEAD. 위험성이 있음.
git ref log -> 명령어가 전부 저장되어있음.
git reset
--hard
--mixed
--soft
reset은 알다시피, HEAD가 가리키는 branch가 가리키는 커밋을 변경하는 작업이다.
옵션을 뭐로 주냐에 따라서 stage와 working directory의 상태가 달라진다.
예를
들어
git reset 명령을 이용하면 옵션과 상관없이 HEAD가 가리키는 브랜치는 commit B를 가리키게 된다.
하지만 옵션에 따라서 stage area, 혹은 working directory에 commit - C의 작업 내역을 남길지, 제거할지는 지정 할 수 있다.
예를들어, C커밋 직후, 단순히 commit할 파일이 빠지거나, 커밋 메시지를 누락시켰을 경우엔.. git reset --soft하여 C작업내역을 staging계에 남겨놓을 수 있다. 이후, 누락된 내용을 add하여 다시 commit하면 될것이다.
mixed는 어떻게 쓸 수 있을까... 커밋을 버리고 싶지만,, stage area를 비우고 다시 로컬에서 개발 + 정비 한 후 재커밋 하고 싶은경우엔 좋다고 할 수 있겠다.
hard는 완전히 망했을때.. commit을 버려야 할때 사용하면 좋겠다.
여기서 의문이 있다.
1) reset이후에 새로운 commit이 생길경우, delete된 commit은 어떻게 되는것인가? -> 왠지 reflog에 남아있을것 같다. 그래서 이후에 필요하다면.. working directory와 diff & 머징해서 필요한 부분을 가져올 수도 있겠지...?
REVERT
삭제한 내용을 commit으로 남긴다.
2) 아주 대과거의 commit으로 reset/revert하면? 그러니까 D,E,F... 커밋이 있는데 C로 되돌아 오면 어떻게 되나..?
-> revert 하게되면 충돌이 발생하게 된다! 당연한 결과다.
/* commitA -> stable version! */
/* commitB -> 버그 유발지점이라고 가정! */
let lenth = member.length;
/* commitC -> 버그 A에 덮어쓴 코드.. */
let lenth = member.length + 1;
B에서 버그가 발생하므로 stable코드인 A로 돌아가려고 revert B를 했다. -> 충돌이 발생한다. 왜냐 B이후에 동일한 코드인 commitC까지 사라지는 결과가 나오므로.. (같은 라인이기 때문에 충돌이 발생하는 것이다..!!)
'Today I learned' 카테고리의 다른 글
2021 06 01 - git린이의 모험 cherry-pick & rebase (0) | 2021.06.01 |
---|---|
2021 06 01 git린이의 모험 - 충돌이 발생하는 이유 (0) | 2021.06.01 |
2021 05 31 - git린이의 모험 pull request (0) | 2021.05.31 |
2021 05 26 - github Action 맛보기 (0) | 2021.05.26 |
2021 05 25 - 이슈 수정을 위한 무한스크롤 연구 (2) (0) | 2021.05.25 |
댓글