
git init에 관한 블로그 참조
<요약> clone 했을 때는 할 필요 없음.
작업 디렉토리에 .git 폴더를 만드는 과정임
.gitignore 만들 것.
원격 저장소 추가할땐
git remote add origin {주소}
하면됨.
Git에서 HEAD는 "현재 내가 작업 중인 커밋(또는 브랜치)"을 가리키는 포인터입니다.
조금 더 구체적으로 말하면, HEAD는 보통 현재 체크아웃(선택)된 브랜치의 가장 최신 커밋을 가리키고 있습니다.
예를 들어, main 브랜치에서 작업 중이면 HEAD는 main 브랜치의 마지막 커밋을 가리킵니다.
브랜치를 바꾸면 HEAD도 그 브랜치의 최신 커밋을 가리키게 됩니다.
만약 특정 커밋으로 직접 이동(checkout)하면, HEAD는 그 커밋을 직접 가리키게 됩니다. 이 상태를 "detached HEAD"라고 부릅니다.
정리
HEAD는 "지금 내가 바라보고 있는 커밋"을 가리키는 Git 내부의 특별한 포인터입니다.
보통은 브랜치의 최신 커밋을, 필요에 따라 특정 커밋을 직접 가리키기도 합니다.
많은 Git 명령어들이 "HEAD를 기준"으로 동작합니다.
요약:
HEAD = 현재 작업 중인 브랜치(또는 커밋)를 가리키는 포인터
(즉, "지금 내 위치"를 의미함)
git reset HEAD <파일명>
또는
git restore --staged <파일명>
이렇게 하면 해당 파일이 Staging Area(스테이지)에서 빠지고, 다시 Unstaged 상태가 됩니다.
git reset HEAD
또는
git restore --staged .
이렇게 하면 스테이지에 올라간 모든 파일이 Unstaged 상태로 돌아갑니다.
참고
git reset HEAD <파일명>은 예전부터 사용되던 방식이고,
git restore --staged <파일명>은 git 2.23 이상에서 추가된 새로운 방식입니다.
둘 중 아무거나 편한 걸 사용하면 됩니다.
git push -u origin main 명령에서 non-fast-forward 에러가 발생하는 이유는, 로컬 브랜치가 원격 브랜치보다 뒤처져 있기 때문입니다. 일반적으로 git pull을 하면 원격의 변경 사항을 가져와 병합(merge)하거나 리베이스(rebase)하여 동기화가 이루어져야 합니다. 그런데도 push가 거절된다면, 다음과 같은 경우가 있을 수 있습니다.
정확히 같은 브랜치에서 pull 했는지 확인 필요
git pull을 했다고 해도, 실제로는 다른 브랜치(예: feature, dev 등)에서 pull을 했거나, 현재 작업 중인 브랜치가 main이 아닐 수 있습니다. 반드시 main 브랜치에서 pull을 해야 합니다.
pull 과정에서 병합(merge)이나 리베이스(rebase)가 제대로 안 됨
pull 명령이 충돌(conflict) 때문에 중단되었거나, 병합이 완료되지 않은 경우 push가 거절될 수 있습니다.
git status로 병합 충돌이 남아있는지 확인하세요. 충돌이 있다면 해결 후 git add .와 git commit을 해줘야 합니다.
이럴 땐 git pull --rebase origin main을 사용해보세요.
이 명령은 원격의 변경 사항을 먼저 적용한 뒤, 내 커밋을 그 위에 다시 쌓아줍니다.
원격 저장소에서 직접 변경한 경우
GitHub 웹에서 파일을 직접 수정하거나, 다른 곳에서 push한 기록이 있을 경우, 로컬과 원격의 커밋 히스토리가 달라져서 단순 병합이 안 될 수 있습니다.
push 강제 옵션 (주의!)
만약 내 로컬의 변경 사항이 원격 저장소의 히스토리를 덮어써도 괜찮다면,
git push --force 또는 git push -f로 강제 푸시할 수 있습니다.
하지만, 이 방법은 원격 저장소의 기존 커밋이 사라질 수 있으니 신중하게 사용하세요.
해결 방법 정리
git checkout main
git pull --rebase origin main
충돌이 발생하면 해결하고,
git add . → git rebase --continue
반복 후 push 시도
git push --force origin main
요약
pull을 했는데도 push가 거절된다면, 현재 브랜치가 main이 맞는지, pull이 제대로 완료됐는지, 충돌이 남아있는지를 먼저 확인하세요.
git pull --rebase origin main을 사용해보세요.
충돌이 있다면 반드시 해결 후 push하세요.
강제 push는 최후의 수단입니다.
이런 절차로도 해결이 안 된다면, git status, git log --oneline --graph --all로 히스토리를 확인해보는 것이 좋습니다.