---
# System prepended metadata

title: Day09-학습정리
tags: [2020 Boostcamp]

---

###### 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들이 사용
    ![](https://i.imgur.com/76ZnqrV.png)

  - Shallow Copy - Duplicates as little as possible❗️
    - 한 객체의 참조정보(pointer)가 복사되고 같은 객체를 참조
    - Collection - collection의 구조만 카피해서 element들을 공유함
    - 속도가 빠름
    - Reference type들이 사용
    ![](https://i.imgur.com/6rS9ieY.png)


### 다같이 확인할 사항

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

