반갑습니다.
Git에서 자주 쓰이는 명령어들에 대해 설명해볼까 합니다.
전부 터미널에서 동작하는 명령어들입니다.
좀 많은데요.
차근차근 아는 대로 써보겠습니다.
깃의 명령어들은 .git이 있는 레포지토리 내에서 동작합니다.
자주 쓰실법한 명령어들은 대부분 있으니 혹시 찾는게 있다면 ctrl + f를 통해 찾아보시면 시간 절약이 될 것 같습니다.
git status를 통해 현재 레포지토리 내의 파일들이 변경되었는지, staging area에 들어 있는지 등을 확인합니다.

git status를 통해
현재 본인의 Branch가 어디인지
파일들이 changed 되었는지
stage area에 들어 있는지
등을 확인할 수 있습니다.
<파일명>을 staging area에 넣습니다.
이후 commit을 통해 버전을 업데이트 할 수 있습니다.


changed 된 파일을 add하였더니 Staged Changes에 practice3.txt파일이 올라간 것을 볼 수 있습니다.
staging area에 들어 있는 파일들을 메세지와 함께 커밋합니다.
-m을 함께 적음으로써 메세지 편집창이 따로 뜨지 않고 바로 커밋할 수 있도록 합니다.

commit id와 메세지가 함께 커밋됐군요.
특히 commit id는 눈여겨 보셔야 합니다.
commit id란 커밋이 실행될 때 생성되는 id입니다.
이 id를 통해 이전 작업상태로 checkout할 수 있고, 다시 돌아올 수 있습니다.
또, commit id를 알고 있어야 잘못된 commit을 없앨 수도 있습니다.
commit id는 파일의 바뀐 내용, 사용자 id, 사용자 메일을 전부 합쳐 sha-1함수에 넣은 값으로 사용됩니다.
sha-1는 간단하게 암호화하는 해시함수라고 생각하시면 됩니다.
암호화라는 말에 걸맞게 commit id는 유일무이한 값을 가집니다.
레포지토리에서 여태까지의 커밋들의 commit id, 사용자, mail, commit date를 보여줍니다.

와 같은 형태로 보여줍니다.
git log --oneline을 사용시

처럼 commit id와 commit message만 이쁘게 볼 수도 있습니다.
*git log는 q로 나갈 수 있습니다
현재의 저장소를 원격 저장소에 추가하는 명령어입니다.
git remote -v를 통해 원격 저장소의 목록을 볼 수도 있습니다.

저렇게 git remote -v를 통해 연결된 원격 저장소를 볼 수 있습니다.
git remote add <이름> <주소> 라는것은 현재 로컬 저장소의 파일들을 원격 저장소의 주소와 연결한다는 의미를 가집니다.
<이름> 란에는 다른 이름을 쓸 수도 있지만, 관습적으로 origin이라고 붙이는것이 일반적입니다.
여태까지 commit된 부분들을 원격 저장소에 올립니다.
push의 작업이 완료되면 원격 저장소에서는 로컬에서 완료된 commit의 작업들을 받아들여 새로운 버전을 공개합니다.
git push를 통해 commit한 내용들을 원격 저장소에 올릴 수 있습니다.

로컬 저장소에서 원격 저장소(github)까지의 과정을 요약해보면
add
commit
push
의 순서로 이루어진다는 것을 알 수 있겠습니다.
현재 로컬의 상태를 원격 저장소에 있는 상태와 똑같은 상태로 만듭니다.
다른사람의 작업들을 받아와 로컬의 형태를 가장 최신의 형태로 유지할 수 있습니다.
git pull을 하지 않은 상태로 commit과 push를 하면 충돌이 발생할 수 있습니다.
꼭 git pull을 한 뒤 push를 하도록 합시다.
main 버전과 별개로 새로운 작업을 하고 싶을 때 branch(가지)를 설정합니다.
이후, main 버전과 충돌이 일어나지 않는다면 합칠 수 있습니다.
git branch # 현재 존재하는 브랜치 목록을 표시
git branch <브랜치명> # 새로운 브랜치를 생성
git branch -d <브랜치명> # 브랜치를 삭제
위와 같은 방법으로 branch를 만들거나 삭제할 수 있습니다.
저 같은 경우는 git branch subfeature 을 사용해서 브랜치를 하나 만들었습니다.
그리고 거기서 따로 다른 파일을 작업했죠.
위 그림은 git graph라는 VScode의 extension입니다.
커밋 상황을 직관적으로 알 수 있으니 꼭 사용해보시길 바랍니다 ㅎㅎ
git의 아주 유용한 기능입니다.
git checkout <commit id>
git checkout <branch name>
을 통해 특정 시점의 버전으로 돌아갈 수 있습니다.
가령 버그가 발생했다고 치면
checkout을 통해 버전을 돌면서 실행시킨다면 어떤 버전부터 버그가 발생했는지 금방 찾을 수 있게 됩니다.
git checkout main
을 사용한다면 main 브랜치로 이동할 수도 있습니다. (main도 하나의 브랜치입니다)
checkout의 원리는 head를 움직이는 것인데요.
head가 main 브랜치를 가리키고 있다면 현재 작업중인 버전의 이전 버전이 최신 버전이 됩니다.
Git에서 checkout 명령어로 특정 커밋 ID를 사용해 예전 버전으로 이동하면, HEAD는 브랜치가 아닌 해당 커밋을 가리키게 되어 detached HEAD 상태가 됩니다.
이 상태에서 작업을 계속할 수 있지만, 새로운 커밋을 하게 되면 해당 커밋은 어떤 브랜치에도 연결되지 않고 고립됩니다.
만약 예전 버전에서 다시 최신 버전으로 돌아가고 싶다면, 최신 커밋의 ID를 사용해 checkout할 수 있습니다.
하지만 이렇게 하면 HEAD는 여전히 브랜치를 가리키지 않고 커밋을 직접 가리키므로 여전히 detached HEAD 상태가 유지됩니다.
버전이 업데이트될 때마다 HEAD가 main 브랜치를 따라가려면 checkout main 명령어를 통해 HEAD를 main 브랜치에 붙여줘야 합니다.
설명이 많이 어렵군요.
포인터의 개념입니다.
헷갈리신다면 checkout은 다른 분의 글을 참고히사는 것도 좋은 방법일 것 같습니다 ㅠㅠ
merge란, 두 가지의 브랜치를 하나의 브랜치로 합치는 작업을 의미합니다.
만약 두 브랜치가 서로 다른 파일을 작업하고 있었다면 두 브랜치를 합쳤을 때 충돌이 일어나지 않지만, 하나의 파일을 다르게 작업하고 있다면 두 버전간의 충돌을 해결하여야 merge할 수 있습니다.
git merge <브랜치명>
를 통해 merge할 수 있습니다.
정확한 기능은 현재 branch에 <브랜치명>을 합칩니다.

Description main옆에 있는 똥글뱅이가 현재 본인의 head 위치입니다.
head는 main을 가리키고 있군요.
그 아래에 sub라는 이름을 가진 branch가 존재합니다.
이 때, git merge sub를 사용하면

쨘
이렇게 합칠 수 있습니다.
대박 ~
만약 sub branch에서 main branch에는 없는 sub.txt파일을 작업했다면
합치는 과정에서 sub.txt 파일이 main에 생깁니다.
하지만 같은 파일을 sub branch와 main branch에서 다르게 편집했다면 merge하는 과정에서 두 부분 중 어느 부분을 살리고 어느 부분을 없앨것인지 직접 수정해야합니다.
그렇지 않으면 충돌이 일어나 merge가 안돼요.
충돌에 대해서는 많이 겪으면서 해결해 봐야 이해도 되고 능숙해질 것 같습니다.
여러분도 VScode에 git graph 깔고 이리저리 브랜치도 만들어보세요 !!
많이 도움이 됩니다.
원격 저장소에서의 변경 사항을 가져오지만, 병합하지 않고 로컬 저장소에만 가져옵니다.
원격 저장소에 있는 새 변경사항을 로컬로 가져옵니다. 하지만 
이렇게 main branch와 합쳐지지는 않죠.
여기서 merge를 하면

이렇게 됩니다.
pull = fetch + merge
라고 생각하시면 되겠습니다.
커밋을 초기화하거나 스테이징 영역을 초기화하는 방법입니다.
뭔가 실수로 커밋했다면 이를 고치기 위해 사용할 수 있습니다.
git reset --hard <커밋ID>
# 해당 커밋 시점으로 돌아가고 모든 변경 사항을 삭제
git reset <파일명> # 특정 파일의 스테이징을 취소

이렇게 뭔가 실수로 커밋했다면

git reset --hard <커밋ID>
를 통해 되돌릴 수 있습니다.
reset에는 세 가지 옵션이 있는데
soft : 이전 커밋으로 돌아가고, staging area는 유지 (바뀐내용 유지)
mixed : 이전 커밋으로 돌아가고, staging area 비우기 (바뀐내용 유지)
hard : 이전 커밋으로 돌아가고, 수정한 부분도 전부 삭제 (바뀐내용 삭제)
hard는 바꾼 내용을 삭제하기때문에 작업물을 전부 날릴 위험성이 있습니다.
옵션들을 잘 이해하고 사용하셔야 하겠습니다.
git clone이란, 지정한 폴더를 원격 저장소에 있는 내용과 똑같이 만드는 작업을 의미합니다.
git clone <저장소 URL>
를 통해 폴더를 github에 있는 레포지토리와 똑같은 폴더를 만들 수 있습니다.

해당 레포지토리의 <>Code 부분을 클릭하면 저장소의 URL이 나옵니다.

복붙하고 위와 같이 git clone을 사용하시면 mkdir을 통해 만든 폴더 안에 github에 있는 레포지토리와 똑같은 폴더를 만들 수 있습니다.
'
'
'
이렇게 Git에서 자주 쓰이는 명령어들에 대해 알아봤습니다.
다양한 명령어들이 있지만, 전부 원자 단위의 동작들을 합친 동작이라고 생각하시면 편합니다.
예를 들어
clone = init + remote add origin URL + pull
pull = fetch + merge
sync = pull + push
라고 이해하면 외울거도 적고 편하겠죠.
하유 숨차
이번 포스팅의 내용들을 능숙하게 사용하실 수 있다면 어디가서 git 할줄 안다고 말하고 다녀도 괜찮을 것 같습니다.
저도 깃 할줄안다고 자랑하고싶으니 위의 내용들을 잘 체득해봐야겠습니다.
감사합니다 !