<기본>
commit : 디렉토리에 있는 모든 파일에 대한 스냅샷을 기록하는 것, -> 각 커밋은 변경 내역을 기록함
git commit : 새로운 커밋을 생성(저장)
git branch noah : noah라는 브랜치를 해당 커밋에서 생성 (브랜치는 특정 커밋에 대한 참조에 지나지 않기에 가벼움)
git checkout noah : noah브랜치로 이동.
git merge noah : noah브랜치의 커밋내용을 합쳐서 생성 (해당 브랜치만 merge한 곳으로 이동)
- noah가 해당브랜치의 자식이면 noah로 이동만함
git rebase noah : 분기한 이후의 커밋들을 모아서 복사한 뒤 noah 뒤로 이어 붙임 (커밋트리의 히스토리를 수정하게됨)
merge vs rebase -> merge는 히스토리 이력을 알 수 있음, rebase는 보기엔 깔끔하지만 히스토리 수정됨
git log : 로그들 확인
<원격저장소 기본>
git clone <>: 원격 저장소의 복사본을 로컬에 생성할때 사용하는 명령어
로컬에서 원격 브랜치 표현 : ex) origin/main의 origin는 원격 저장소 이름, main은 원격 브랜치 이름
-> 로컬에서는 원격 브랜치 checkout같은거 못함 (수정? 불가)
git fetch : 원격 저장소에서 데이터를 다 가져옴- *다운로드만 한다고 생각
(단 로컬 상태는 변경 하지 않음- 로컬파일들이나 브랜치)
1. 로컬에 없는 커밋들을 다운
2. 로컬의 원격 브랜치 위치를 업데이트
git pull : git fetch + git merge (ex- main브랜치는 origin/main을 추적하고있기에 자동으로 origin/main을 머지함 )
(추적도 변경 가능)
git pull --rebase : git fetch + git rebase
git push : 원격저장소에 업로드하고 그 원격 저장소가 새 커밋들을 합치고 갱신
(push할 내용이 원격 저장소의 히스토리와 다르면 거부당함 - 그래서 원격 저장소의 최신 상태를 합치도록 강제함
해결 -> git pull 같은 명렁어로 로컬을 갱신 후 푸쉬하면 됨)
pull request : 보통 원격저장소의 main 브랜치는 잠겨있다. 그래서 변경사항을 적용하려면 pull request 과정을 거쳐야함
(잠겨 있는데 그냥 push 하면 오류 뜸)
->다른 브랜치로 작업 수행 후 push 한 후 원격에서 main브랜치로 pull request하는 식
<상대 참조>
^ : 한 커밋 위를 가리키는 참조 (HEAD^ 면 HEAD의 부모를 가리키는 것)
~ : 여러 커밋 위를 가리키는 참조 (HEAD~3 이면 HEAD의 3번째 위를 가리킴)
<깃 변경한 내용 되돌리기>
git reset : 브랜치를 예전의 커밋을 가리키도록 이동 (커밋하지 않은 것처럼 돌아감) - 히스토리를 변경하므로 리모트 브랜치에 쓸수 없음. -> ex) git reset HEAD^ 한후에 git push -f 을 해줘야 리모트도 적용됨
git revert : 돌아갈 내용을 다음 커밋으로 덮어 추가함 (추가 되는 것이므로 리모트 브랜치에 공유 가능)
ex) git revert HEAD 하면 HEAD커밋을 없던것으로 돌려주는 내용이 다음 커밋으로 추가됨
git branch -f main HEAD~2 : main 브랜치를 HEAD~2위치로 옮겨줌
<참고>
HEAD : 현재 checkout 된 커밋
git remote update : 원격의 브랜치를 찾지 못해서 발생하는 fatal: Cannot update paths and switch to branch 'feature/rename' at the same time. 라는 오류 메세지를 해결해준다.
만약 원격 저장소의 feature/create-meeting branch를 가져오고 싶다면, $ git checkout -t origin/feature/create-meeting 처럼 하면 된다.
git checkout -b noah origin/main : noah 브랜치를 생성하고 origin/main을 추적함, noah에 체크아웃 되어있음
git branch -u origin/main noah : noah브랜치가 origin/main을commit : 디렉토리에 있는 모든 파일에 대한 스냅샷을 기록하는 것, -> 각 커밋은 변경 내역을 기록함