깃(git)
- 깃은 대표적인 분산 버전 관리 시스템(DVCS)
스냅숏(snapshot)
스냅샷은 특정 시점의 프로젝트 소스 코드의 특정 버전을 의미한다. 프로젝트에 변경 사항을 저장(commit, 커밋)하면 변경 사항을 포함하여 해당 시점에 프로젝트의 소스 코드 스냅샷이 생성된다. 이러한 스냅샷은 프로젝트의 버전 기록을 형성하며, 프로그래머가 시간의 경과에 따른 코드의 변경 사항을 추적하고 관리할 수 있도록 한다. 필요한 경우 이전 버전으로 되돌릴 수 있도록(roll-back, 롤백) 하기 때문에 버전 관리 프로세스의 중요한 부분이다.

깃허브(Github)
- 대표적인 외부 저장소로,깃으로 관리하는 프로젝트를 업로드할 수 있도록 웹 기반 저장소를 생성하고 관리하는 서비스

수정 및 반영: 수정 후, git add, git commit, git push로 원격 저장소에 반영
수정 내역 가져오기: 원격 저장소의 수정 내역을 git fetch로 가져온 후, git merge로 병합
git pull: fetch와 merge를 한 번에 처리하는 명령어
깃 초기화
git init
전체 파일 스테이징 영역으로 이동
git add .
특정 파일만 스테이징 영역으로 이동
git add 특정파일
스테이징 영역에 있는 파일의 변경 내용을 스냅숏으로 저장
git commit -m '커밋 메시지'
해당 저장소의 커밋과 관련된 모든 작업 이력 보기
git reflog
내 컴퓨터의 프로젝트 폴더와 깃허브 간 연결 통로 만들기
git remote add 별칭(ex)origin) 외부저장소 주소
연결 통로 변경하기
git remote set-url origin 바꾸고자 하는 외부저장소 주소
만들어진 통로를 통해 깃허브로 자신의 프로젝트 업로드 하기
git push 별칭(ex)origin) 브랜치이름(main or master)
git clone 외부 저장소 주소
git pull 외부 저장소 주소
git clone : 깃이 내 컴퓨터의 특정 폴더를 관리하도록 선언하는 것과 동시에 깃허브에서 프로젝트를 내려받아 동기화하는 작업 수행
git pull : 이미 내 컴퓨터의 특정 폴더를 깃으로 관리하고 있는 상태에서 깃허브 프로젝트와 동기화만 수행
- 깃허브에 저장된 프로젝트를 처음 내 컴퓨터로 내려받을 때 -> git clone = git init + git pull
- 이미 깃으로 프로젝트를 진행하면서 버전 관리를 수행하던 상황에서 깃허브의 최신 변경 사항을 반영할 때 -> git pull
브랜치(Branch)
- 동일한 프로젝트에 대해 각 개발자가 독립적으로 작업을 수행하기 위해 사용하는 개념
- Git에서는 기본적으로 master라는 브랜치가 있고, 그 브랜치에서 새로운 브랜치를 만들어 작업을 진행할 수 있다.새로운 브랜치를 만들면 master랑 따로 놀면서 코드를 변경 가능. -> 브랜치마다 독립적인 작업 공간
- 작업이 끝나면 merge를 통해 그 브랜치의 변경 사항을 master에 반영하면 되는데, 이렇게 하면 여러 작업을 동시에 처리하면서도 코드의 안정성을 유지 가능
// 브랜치 확인, 로컬 저장소 브랜치 목록
git branch
// 원격 저장소에서 정보 가져오기
git fetch --all
// 원격 저장소 브랜치 목록
git branch -r
// 로컬, 원격 저장소 브랜치 목록
git branch -a
// 원격 저장소 브랜치 가져오기
git checkout -t origin/브랜치명
// 브랜치 전환
git checkout 브랜치명
// 브랜치 생성
git branch 브랜치명
// 로컬 저장소 브랜치 삭제
git branch -d 브랜치명
// 원격 저장소 브랜치 삭제
git push origin --delete 브랜치명
// 로컬에서 삭제했는데 원격 저장소에 남아있는 브랜치 삭제
git remote prune origin
// 브랜치 병합
git merge 브랜치명
// 브랜치 병합 취소
git merge --abort
- 오픈 소스 프로젝트를 공부하거나 Contributors가 되고 싶을 때
해당 원격 저장소(Remote Repository)를 자신의 원격 저장소로 복사 -> 이를 Fork라 한다.- 깃허브의 경우 공개된 모든 자료가 오픈 소스로 다른 사람의 자료를 Fork 할 수 있다.
예시)
메시와 호날두가 만든 저장소가 있다.이 저장소에 없는 기능을 네이마르가 만들고 싶어하지만 저장소의 권한은 메시와 호날두만 있고 네이마르에게는 없다.이때, 저장소의 권한을 얻어내기 위해 네이마르가 기여자(contributor) 등록을 해야 할까? -> 굳이 안해도 돼!!
기여자(contributor) 등록을 따로 하지 않아도 Fork 기능을 사용하여 원본 저장소를 복사해 내 저장소에서 commit > push 가능.기능 생성 후,내 저장소 브랜치와 메시와 호날두의 저장소에 브랜치에 merge를 하면 된다. -> 물론 이럴때는 허락을 받아야 한다!!
과제로 다음과 형태 자주 사용
1. Fork로 과제를 복사
2. 과제 수행 후 pull request(PR)



| 브랜치 | 포크 |
|---|---|
| 하나의 저장소에서 브랜치를 나누어 씀 | 여러 저장소를 만들고 브랜치를 만들어 사용 |
| 코드 커밋 이력 쉽게 볼 수 있음 | 원본 저장소에 영향을 미치지 않고 자유롭게 수정 가능 |
| 소수 인원 작업 사용 | 불특정 다수 사용 작업시 사용 |
상대방의 저장소를 fork한 후 원본 저장소에 올리고 싶다면? -> 원본 저장소의 권한을 가진 사람에게 두 브랜치를 합치는 것을 허락해달라고 요청 -> 이것을 Pull Request(PR)

일단 실습을 위해 레포지토리를 새로 하나 만들어서 fork하고 form한 레포지토리를 내 로컬에다가 clone을 했다.
그리고 README.md만 수정하고


push를 해주었다.일단 내가 for한 저장소는 변경이 되었을텐데 이제 PR를 날려보자
일단 Contribute를 누르면

이런게 뜨고

여기서 이제 fork 한 저장소 브랜치에서 원래있던 저장소로 PR 요청을 보내겠다 이런 것도 뜨고
제목과 메시지를 써서 보낼 수 있다.

밑에서는 변경 부분을 확인 할 수도 있고 Create PR을 누르면 된다.

그럼 여기서 PR한 부분을 확인 할 수있다.

그리고 다시 원본 저장소에 있는 레포지토리로 가면
왼쪽 상단에 PR이 와있는걸 확인 할 수 있고

새롭게 PR 요청이 들어온걸 확인 가능하다.

여기서 이제 merge를 진행 할 지 안할지 확인 하면 된다.


이걸 누르게 되면 충돌이 발생하지 않는 이상 merge가 되는걸 확인 할 수 있다.


참고
[GitHub] commit이란 무엇인가? (snapshot, roll-back, repository)