###### tags: `2020 Boostcamp`
# Day09-학습정리
### 스스로 확인할 사항
- **실제 git 명령어와 구현한 명령 동작 공통점과 차이점에 대해 정리한다.**
| | 구현한 명령 동작 | 실제 git 명령어 |
| :--------: | :----------------------------------------------------------: | :----------------------------------------------------------: |
| `init` | Repository배열에 해당 구조 추가 | .git 폴더를 생성 |
| `status` | Repository에 있는 file들을 상태별로 출력 | index에서 blob객체가 가리키는 내용과 실제 파일내용이 다를 경우, changes not staged for commit를 출력 |
| `checkout` | 해당 repository가 존재하는 지 검사 후 이동 | HEAD가 가리키는 포인터를 옮겨 해당 Branch를 참조 |
| `add` | modified, untracked 상태의 file들을 staged로 변경 | ndex(=stage area,tree구조)에 object이름과 실제파일이름이 추가되고(추적등록) objects에 blob타입으로 파일내용이 추가 |
| `commit` | staged 상태의 file들을 git repository로 이동 | objects에 commit객체와 tree객체가 추가, tree객체는 commit할때의 index를 스냅샷찍어서 저장 |
| `log` | Commit info에 저장 된 내용들 출력 | commit log를 보여주며 다양한 옵션이 존재 |
| `push` | Commit info의 커밋전적과 file들을 remote repository와 동기화 | 로컬저장소의 master브랜치와 원격저장소의 master브랜치를 연결시키고 업로드. push를 할때마다 refs/remotes/origin/master가 갱신되며 push를 완료한 최신 커밋객체(push후 커밋을 안했다면 refs/heads/master와 같음)를 가리킴 |
- **객체를 복사할 때, 얕은 복사와 깊은 복사 차이점에 대해 정리한다.**
- Deep Copy - Duplicates everything❗️
- 완전히 분리된 두 객체를 만듬
- Collection - Original collection과 완전 동일한 element를 가지는 collection을 만듬
- Race condition에 덜 취약하고, 멀티쓰레드 환경에서 잘 작동함
- Value type들이 사용

- Shallow Copy - Duplicates as little as possible❗️
- 한 객체의 참조정보(pointer)가 복사되고 같은 객체를 참조
- Collection - collection의 구조만 카피해서 element들을 공유함
- 속도가 빠름
- Reference type들이 사용

### 다같이 확인할 사항
- **clone 명령을 구현하려면 어떻게 구현해야 할까 정리하고 각자 의견을 토론한다.**
- Remote 저장소에 있는 내용을 local로 가져와야 함
- Remote의 commit정보, 현재 git의 상태 등 모두 가져와야 함
- **branch 개념을 추가하려면 어떤 구조로 어떻게 구현해야 할까 각자 의견을 정리하고 토론한다.**
- Repository 안에 branch라는 서브 저장소를 만들 구조를 설계해야 함
- branch 간 이동, 참조를 할 수 있어야 하며 merge가능 해야 함