
🌈 Git 기본 개념
🔥 Repository
🔥 Area
🔥 Commit
🔥 Push
🔥 Branch
🔥 Clone & Pull
🔥 Synchronization
🔥 Merge
1. Repository
- repository란 파일이나 폴더를 저장해 두는 저장소의 개념으로 변경 이력 별로 관리되어짐
- 비슷한 파일이라도 내용 일부가 서로 다르면 다른 파일로 인식하기 때문에 코드를 변경 사항 별로 구분해 저장할 수 있음
- git은 원격저장소와 로컬 저장소 두 종류의 저장소를 제공함
- 원격 저장소(Remote Repository) : 원격 저장소 전용 서버에서 파일이 관리되며 여러 사람과 공유할 수 있는 저장소
- 로컬 저장소(Local Repository) : 내 PC에 파일이 저장되는 개인 전용 저장소
- 로컬 저장소에서 평소 작업을 하다 공개하고 싶을 때 원격 저장소에 업로드할 수 있고, 원격 저장소에서 다른 사람이 작업한 파일을 로컬 저장소로도 가져올 수도 있음
- 연습용 저장소 생성 : File ⇢ New Repository ⇢ 저장소 이름 입력 및 경로 설정
- Name : git-for-everyone
- Local Path : /Users/jangjaewon/Documents/git 로 설정
- Repository 생성하면 git에서 해당 디렉토리(git-for-everyon)안에 있는 모든 것을 추적할 수 있음
- console에서 저장소 디렉토리(git-for-everyon)에 진입해 목록을 보면, 아래 처럼 나타남

- .git가 추적하는 역할을 하기 때문에 이를 삭제하면 실시간으로 추적되지 않음
- 저장소(git-for-everyone)에 파일(hello.py) 생성 후 내용을 작성하면 Github Desktop 프로그램에서 현재 작성 내용들을 실시간으로 추적 중인 것을 볼 수 있음


- 파일명을 수정해도 바로 github desktop에 반영됨(hello.py ⇢ main.py)
2. Area
- Git은 3가지 Area를 가지고 있고, 저장소 내에 파일들은 언제나 이 3가지 Area 영역 내에 존재함
- Working Tree : 현재 작업 중인 공간
- Staging : commit을 대기 중인 가상의 공간(인덱스)으로 저장소와 현재 작업공간 사이의 영역. 이 영역에서 있는 파일만 commit을 할 수 있기 때문에 commit 준비 중인 파일을 staging에 올리거나 wordking tree로 다시 제외시킬 수 도 있음

- Repository area : commit 후 data를 스냅샵하여 저장하고 있는 장소

3. Commit
- 변경 내용을 기록하기 위해서는 commit을 진행해야 하는데 commit 방법은 왼쪽 하단에 제목과 설명을 적은 뒤 "Commit to main" 버튼을 누르면됨

- Commit 후 내용 수정(Hello ⇢ Title: Git for Everyone)하면, 아래 처럼 변경 사항이 존재하는 것을 실시간으로 추적하여 표시해줌

4. Push
- 로컬 저장소에 commit이 완료된 이력을 원격 저장소에 공유하기 위해서는 업로드해야 하는데, 이 때 원격 저장소로 파일을 변경 이력과 함게 파일을 보내주는 것을 push라고 함
- push를 실행하면, 원격 저장소에 내 변경 이력이 업로드 되어 원격 저장소와 로컬 저장소가 동일한 상태가 됨
- push 하기 전, 원격 저장소를 생성해 주어야 함
- Publish respository를 클릭 후, 이름과 내용을 입력하여 github에 원격 저장소를 생성
- Kepp this code private에 체크를 해제해야지만, 다른사람들이 저장소에 접근 가능

- "https://github.com/계정이름/저장소명"로 접근(https://github.com/Jang-Jaewon/git-for-everyone)하면, 아래와 같이 원격 저장소에 파일이 업로드된 것을 볼 수 있음

- 원격 저장소에 repository를 생성한 이후 부터는 Push origin 버튼을 눌러주면, Push가 진행됨
5. Branch
- git은 branch라는 기능을 통해 어느 시점부터 다른 버전으로 뻗어나가 계속하여 작업할 수 있고, 필요하다면 이를 다시 병합 시킬 수 있음
- 즉, branch는 master의 commit에서 시점부터 다른 타임라인을 가지는 것을 의미함

- 최초부터 작업하던 main 타임라인이 master이며, branch는 생성하는 방법은 New Branch를 클릭 후 Branch의 이름을 지정해주면 생성됨

- branch-A라는 이름으로 branch 생성

- branch-A 에서 commit을 하면, 새로운 라인으로 타임라인 버전 관리가 시작됨
- 여러 버전을 생성하여 작업할 때, 파일들을 복사할 필요없이 git으로 제어하여 여러 버전을 생성 후 각자 다르게 작업할 수 있고, 이를 branch와 master의 전환으로 옮겨다님
6. Clone & Pull
- 원격 저장소의 파일을 통제로 복제한 후 로컬 reposityory로 내려 받아 작업하는 것을 clone이라 함
- clone을 하게되면, 변경 이력도 함께 로컬 저장소로 복제되기 때문에 원격 저장소와 똑같이 이력을 참조하고 커밋을 진행할 수 있음
- 🔍 clone 방법 : 복제할 대상의 원격 저장소에서 fork를 통해 내 원격 저장소로 가져온 뒤, github desktop에서 clone을 진행 ⇢ 저장소 목록 중 원하는 respository를 선택 ⇢ local에 저장할 경로 지정


- 원격 저장소를 공유해 여러 사람이 사용하다보면, 모두가 같은 원격 저장소에 push하기 때문에 다른 사람이 업데이트한 버전을 자신의 로컬에 적용시킬 필요가 발생함
- 이 때 원격 저장소에서 로컬 저장소로 내려 받아 최신화 시키는 작업을 pull이라 함
- pull을 실행하면, 원격 저장소에서 최신 변경 이력을 다운로드하여 내 로컬 저장소에 그 내용을 적용함
7. Synchronization
- master 타임라인에서 'Lorem'을 모두 찾아 'AAAAAAAAA' 수정한 뒤, commit 하였다고 가정했을 때 다른 branch에서 이 변경 내용을 동기화시키는 것을 Synchronization이라 함
- 우선 master에서 수정 후 commit을 한 뒤, 반영시키고자하는 branch로(branch-A) 이동
- Branch ⇢ Update from default Branch 클릭

8. Merge
- branch 기능으로 다른 타임라인을 가졌다면, merge를 통해 branch를 다시 master 타임라인과 병합시킬 수 있음
- 병합시키는 방법은 Master로 이동한 후, branch ⇢ Merge into Current Branch 클릭 후 Master로 병합하고 싶은 Branch를 선택
- 충돌이 발생한다면, vscode에서 충돌 해결 옵션 중 하나를 선택하여 conflict을 해결
