: 소스코드 버전 관리 시스템/ 동시 협업/ 다른 컴퓨터에 작업물 보내기
<장점>
1. 지난 과정 확인 가능
2. 이전 버전의 과제로 돌아갈 수 있음

-> 작업을 원하는 폴더에서 마우스 우클릭을 통해 'git bash here'로 깃 실행
: 자신이 작업한 내용을 저장하는 저장소
-> 깃으로 관리하는 사이트를 올려두는 저장소.
-> git으로 관리하던 프로젝트의 복제본을 저장하기 위한 외부 서비스를 무료로 제공해주는 것
: 프로젝트의 변경사항이 저장되어 있는 .git 디렉토리
: 즉, 커밋이 저장되는 곳
-> '.git'파일이 바로 레파지토리이다.
: 프로젝트 디렉토리의 특정 모습(변경사항들)을 하나의 버전으로 남기는 행위 & 결과물
프로젝트 파일로 이동해서
1. git init
: git으로 버전 관리를 하겠다. .git 파일 만들어짐. 즉, 레파지토리가 생성됨
git config
: 첫 commit 전 깃에게 commit 한 사람 알려주기
git config user.name "jisoo"
git config user.email "anjisu@naver.com"
git add "파일 이름"
: 커밋할 파일 미리 지정
git commit -m "커밋 메시지"
옵션 -m을 주어 커밋 메시지 남기기!
git status: 깃이 인식하고 있는 프로젝트 디렉토리의 현재 상태 보여줌
-> 커밋 전에, 커밋하려는 파일들이 모두 staging area에 올라 가 있는 지 확인!
git add . : 현재 프로젝트 디렉토리 내에서 변경사항이 생긴 모든 파일을 staging area로!
<git으로 관리되는 파일의 상태>

1. untracked: 파일이 git에 의해 전혀 추적되고 있지 않다.
ex) 파일 생성 후, 한 번도 git add 해주지 않은 경우
2. tracked: - staged: staging area에 올라와있는 상태
- unmodified: 최신 커밋의 모습과 비교했을 때 전혀 바뀐 게 없는 상태 (커밋을 하고 난 직후에는 working directory 안의 모든 파일들이 이 상태)
- modified: 최신 커밋의 모습과 비교했을 때 조금이 라도 바뀐 내용이 있는 상태
git reset
-> staging area 파일 제거
-> working directory에는 남아있음!

: 깃허브 통해서 작업하던 내용 전송 가능
작업하던 내용 전송 == 레파지토리 전송
Remote Repository (원격 레포지토리): 깃허브에 만든 레파지토리
Local Repository: 내 컴퓨터의 레포지토리
git commit: 내 로컬에서 편집 후 commit하면, 내 로컬 레포지토리가 변경된 것! 원격 레포지토리에도 반영해주기 위해서는 git push
git push: 로컬 레포지토리 내용-> 리모트 레포지토리에 반영
--> 즉, 내 컴퓨터 로컬 레포지토리(.git 파일)에 add 후, commit을 하고, push를 통해 깃허브의 원격 레포지토리에도 반영을 해주는 것이다.
: 리모트 레포지토리의 주인 (본인)만 push 할 수 있다.
-> 다른 사용자도 push할 수 있게 하려면, 권한을 설정해줘야 한다. 아래와 같이 권한을 설정한다.


: settings의 manage access에 들어간다. invite 해주어야 한다.


-> 초대받은 입장에서는 초대장을 받게되고, 수락을 해주면된다.
즉, 정리를 하자면,
1. 원칙적으로 자신의 리모트 레포지토리에는 자신만 git push를 할 수 있습니다.
2. 만약 다른 사용자도 git push를 할 수 있게 해주려면 그 사용자를 해당 리모트 레포지토리의 collaborator로 지정하면 됩니다.
: 리모트 레포지토리가 로컬 레포지토리보다 더 앞선 상황인 경우 로컬 레포지토리에 반영하기 위해서는 아래의 명령어를 사용한다.
<리모트 레포지토리>
1. 안전성 (똑같은 레포지토리 내용이 복제됨)
2. 협업 가능
git clone
1.

-> 주소를 복사하여 터미널로 이동
--> 깃허브에있는 오픈 소스 프로젝트들에도 참여하고, 공개된 코드를 볼 수 있다. 이를 통해 학습 가능
<내용>
1. 어떤 프로젝트인지 설명
2. 프로그램의 주요 사용법
3. 프로그램을 실행시키려면 어떤 사전 작업
-> 마크다운 문법으로 해석됨
-> md 확장자가 마크다운이라는 뜻임


: 이때까지한 커밋 히스토리 보여줌
-> 위로 갈수록 최신
-> 각 커밋은 아이디를 가지고 있음
-> 커밋 아이디/커밋 한 사람/커밋 날짜와 시간/커밋 내용 보여줌
git log --pretrry=oneline
: 커밋 로고 조금 더 깔끔하게 보여주기
git show
: 커밋 내용 자세히 보고싶은 것, 커밋 아이디를 통해서 검색

-> 커밋 아이디는 앞의 4자리 정도만 써도됨
: git commit만 쓰면, 커밋 메시지를 입력할 수 있는 새로운 창이 뜨게된다
-> mac에서는 vim 창이 뜬다.
-> 복잡하고 긴 커밋 메시지를 쉽게 남길 수 있다!
-> 텍스트 에디터로 커밋 남길 수도 있다는 것!
: 커맨드 전체에 별명을 붙여서 사용
git config alias.history 'log-prtty=oneline'
git diff '이전의 커밋 아이디' '이후의 커밋 아이디'

: 어떤 커밋 하나를 가리킴 (보통 가장 최근에 한 커밋)
-> 매번 더 새로운 커밋을 가리킴
-> HEAD가 가리키는 커밋에 따라 working directory 구성
git reset --hard '커밋 아이디 값'
: 과거 커밋으로 돌아가고 싶을 때
-> HEAD가 과거의 커밋을 가리키게 할 수 있다
-> working directory의 내용도 과거 커밋으로 돌아가게 해준다.
--hard 옵션/--soft, --mixed
: HEAD가 과거의 커밋을 가리키게 되는 것은 같지만, 옵션에 따라 WORKING DIRECTORY의 내부는 달라지지 않을 수도!!
staging area에 있던 것들은 커밋을 하더라도 그것과 상관없이 계속 남아있다
-> 삭제되지 않음
: 이를 이해하기 위해선 깃의 3가지 작업 영역을 잘 알고 있어야 함 (working directory, staging area, repository)
git reset의 옵션에 따라 어느 작업 영역이 초기화되는 지가 달라짐

1. --soft: HEAD 과거 커밋 가리킴/staging area 안바뀜/working directory 안 바뀜
-> 1개 영역만 reset
--mixed: HEAD 과거 커밋 가리킴/staging area 과거 커밋으로/working directory 안 바뀜
-> working directory는 가장 최근에 작업한 그 모습 그대로임
-> 2개 영역 reset
--hard: HEAD 과거 커밋 가리킴/staging area 과거 커밋으로/working directory 과거 커밋으로
-> 커밋 이후로 한 작업 모두 사라짐
-> 모든 영역 reset
--> hard 옵션은 권장되지 않음
--> push만 잘 해놓더라도, hard 옵션 써서 없어진 경우에도 다시 되돌릴 수 있음
HEAD: git log --pretty=oneline 으로 확인
staging area: git status 로 확인
working directory: 파일 이름으로 확인
git reset 시, 매번 커밋 아이디 작성하기 번거로움
git tag '태그이름' '커밋 아이디'
: 커밋 메시지의 의미가 중요한 커밋들은 태그 달아준다
ex) 첫 프로젝트 시작
-> 나중에 프로젝트 파악하기 편함


branch: 하나의 코드 관리 흐름

-> 지금 master 브랜치에 있다
master 브랜치: 레포지토리 생성 시, 기본 브랜치
git branch '새 브랜치 이름' : 새로운 브랜치 만들기
git checkout '이동한 새 브랜치 이름': 새로 생성한 브랜치로 이동


-> premium 브랜치와 master 브랜치가 license의 내용이 다르게 나타남
-> 각 브랜치는 서로 영향을 주지 않음
: 둘 다 같은 부분을 수정한 경우 충돌 일어남
-> 머지의 결과가 되었으면 하는 모습 그대로 코드 수정
-> 커밋

: 현재 로컬 레포지토리의 master 브랜치에 있는 내용을 origin이라는 리모트 레포지토리에 보낸다.
-> master라는 같은 이름의 브랜치로 전송하게 되는데, 만약 origin이라는 리모트 레포지토리에 master 브랜치가 없으면 브랜치를 새로 생성하고 푸시한다.


-> 화살표는 무슨 의미일까?
branch: 어떤 커밋을 가리키는 존재 (포인터)
-> 계속 새롭게 생기는 커밋 가리키게 됨
-> 이전 커밋의 내용 저장하고 있음
HEAD: 브랜치를 통해 커밋을 간접적으로 가리키는 존재 (포인터)
-> head가 가리키는 커밋에 따라 working directory의 내용 바뀜
-> but! head는 브랜치를 통해 간접적으로 커밋 가리킴

-> git checkout은 head가 가리키는 브랜치를 변경해주는 것임!!
-> merge: head가 가리키던 커밋에 다른 브랜치가 가리키던 커밋을 합쳐서 새로운 작업 만듦


git reset [--hard 또는 --soft 또는 --mixed] 9033
1. head는 여전히 같은 브랜치 가리킴
2. head가 가리키는 브랜치가 다른 특정 커밋을 가리킴
3. 결국 head가 간접적으로 가리키던 커밋도 바뀜
: 다른 브랜치로도 이동가능하고, 다른 커밋으로도 이동 가능!
git checkout '다른 커밋 아이디': 다른 커밋으로 이동 (head가 deatached head가 됨)
git checkout '브랜치명': 해당 브랜치로 이동. head도 그 브랜치를 가리키게 하여, 간접적으로 그 브랜치가 가리키는 커밋을 가리킴
Detached head
: head가 직접 커밋을 가리키는 상태
git checkout master의 의미
= master 브랜치로 이동해라
= head가 master 브랜치를 가리키게 해라
= head가 master가 가리키는 커밋을 간접적으로 가리키게 됨
= working directory의 내부도 그 커밋에 맞게 변화
--> 특정 커밋을 시작점으로 하는 새로운 브랜치를 만들고 싶을 때
1. git checkout '커밋 이름'
2. git branch '브랜치 이름'
3. git checkout '새로운 브랜치 이름'





: 로컬 레포 수정하는 동안 리모트 레포에 변화 생겼으면 일단 받아와야해!!!
-> 바로 push 불가

-> git pull 이후 충돌해결하고 다시 push하기
git pull: git fetch+merge
-> 검토없이 바로 합치고 싶을 때
git fetch: merge는 하지않고, 가져오기만
-> 일단 가져온 후 살펴본 후에 merge하고 싶을 경우
git diff
: 두 커밋 간 차이/ 두 브랜치 간의 차이
: 어떤 파일의 특정 코드를 누가 작성했는지 찾아내기 위한 커맨드


git revert 'a'..'b': a부터 b까지. a는 포함되지 않음!
: 한 번에 revert
ex) 내가 readme 파일 꾸며놨는데, 디자인 팀에서 더 예쁘게 꾸며서 준다고, 예전으로 돌려놔달라고 하였다.
-> 모든 브랜치에서 readme 파일 초기화해야 함

-> 커밋은 각각이 생성됨!


-> reset 수행

-> reset을 해도 그 이후의 커밋들이 삭제되는 건 아님! 단지 HEAD가 가리키는 브랜치가 달라진 것.


--> git reset한다고 그 이후의 커밋들이 사라지는 건 아님. 그래서 언제든지 다시 돌아갈 수 있음. git reset '돌아갈 커밋 아이디'/ git reflog통해 아이디 검사 후 git reset!
git log --pretty=online --all
: git history (git log --pretty=online)는 현재 브랜치의 커밋들만 볼 수 있음.

-> 다른 브랜치의 커밋 히스트리도 볼 수 있음
but 커밋 히스토리 깔끔하게 보고싶음. 알아보기 쉽게
git log --pretty=online --all --graph
git rebase --continue
: 커밋을 재배치한다.

git merge

-> 두 브랜치 합쳤다는 기록 남기고 싶은 경우에 사용
--> 나중에 또 쓸 필요가 있으면 apply, 없다면 pop. 보통 후자의 경우이다.
git cherry-pick '가져오고싶은 커밋 아이디'
: 자신이 원하는 작업이 들어있는 커밋들만 가져와서 현재 브랜치에 추가
git reset --mixed/--soft
: HEAD는 이전 커밋을 가르키지만, working directory는 그대로!
-> 여러 커밋이 발생하기 이전의 커밋으로 이동
-> 그대로인 working directory를 add 하고 commit하고 push!
--> 불필요한 커밋 없애기
: working directory 내에 존재하는 파일들 중, 마치 존재하지 않는 것처럼 git이 인식해야할 파일들의 목록이 적힌 파일






