

1. 원격저장소를 생성합니다.
git clone

우리의 로컬 저장소에 o/main 라고하는 원격 브랜치가 생깁니다. (대부분의 개발자들은 자신의 주 원격 저장소를 origin 라고 합니다. 보통 origin/main 라고 되어 있지만, 여기서는 줄여서 o로 표현)
<remote name>/<branch name>
원격 브랜치는 원격 저장소의 상태를 반영합니다. 원격 브랜치는 로컬에서의 작업과 공개적으로 되고있는 작업의 차이를 이해하는데 도와줍니다.

1. 원격 브랜치를 체크아웃하고 커밋하면
git checkout o/main; git commit;

분리된 HEAD 모드로 만들고 새로운 커밋을 추가해도 o/main를 갱신하지 않습니다. 이것은 o/main가 원격 저장소가 갱신될때만 갱신되기 때문입니다.

로컬 저장소에는 없는 두개의 커밋이 있는 원격 저장소가 있는 상태입니다.
git fetch

커밋 C2 와 C3 가 우리의 로컬 저장소로 다운로드 되었고, 원격 브랜치 o/main 가 이것을 반영하기 위해 업데이트 되었습니다.
원격 저장소의 변경을 fetch하고 그이후에 merge하는 작업의 과정이 워낙 자주있는 일이라서 git은 이 두가지를 한번에 하는 명령을 제공합니다! 이 명령어는 git pull 입니다.

git fetch git merge o/main
git pull

원격 저장소가 동료 / 친구 / 협력자등에 의해 특정 브랜치나 여러개의 커밋이 갱신되는 경우를 표현할 필요가 있습니다. fakeTeamwork 의 기본 행동은 원격 main에 간단히 하나의 커밋을 하는것 입니다.

1.
git fakeTeamwork

원격 저장소에 새로운 커밋이 갱신되었습니다. 아직 git fetch 를 하지 않았기 때문에 로컬로 내려받아지지는 않았습니다.

1.
git fakeTeamwork main 2

2.
git commit

3.
git pull

월요일에 저장소를 clone해서 부가기능을 만들기 시작했습니다. 금요일쯤 기능을 공개할 준비가 되었습니다 -- 그런데 오 이런! 동료들이 주중에 코딩을 잔뜩해서 여러분이 만든 기능은 프로젝트에 뒤떨어져서 무용지물이 되었습니다. 이 사람들이 그 커밋들을 공유하고있는 원격 저장소에도 공개했습니다, 이제 여러분의 작업은 이제 의미가 없는 구버전의 프로젝트를 기반으로한 작업이 되어버렸습니다...
이럴 때는 여러분의 작업을 원격 브랜치의 최신상태를 기반으로 하게 만들면 됩니다.

1.
git fakeTeamwork main

2.
git commit

3.
git pull --rebase

4.
git push

rebase 는 여러분의 커밋 트리를 모든게 한 줄에 있기 때문에 깔끔하게 정리해서 보기가 좋습니다. 하지만 rebase 를 하게 되면 커밋 트리의 (보이는)히스토리를 수정합니다.
예를 들어, 커밋 C1는 과거의 C3로 rebase 될 수 있습니다. C1'의 작업이 C3의 다음에 있는것으로 보이게 되는겁니다. 실제로는 C1이 먼저 완료된거인데 말이죠.
mergerebase
1.
git checkout main

2.
git pull

3.
git merge side1

4.
git merge side2

5.
git merge side3

6.
git push

git push origin main

1.
git push origin main

2.
git push origin foo

로컬의 foo 브랜치에서 원격의 bar 브랜치로 커밋을 push하고 싶다면.. source 와 destination을 모두 지정하면 됩니다! 이것을 일반적으로 colon refspec(콜론 참조스펙)이라고 부릅니다.
source는 git이 이해하는 아무 위치를 말합니다.

1.
git push origin foo^:main

git은 foo^의 위치를 알아내서 원격 저장소에 아직 반영되지 않은 커밋들을 업로드하고 destination 브랜치를 갱신했습니다.
push하고 싶은 destination(목적지)가 없다면?

1.
git push origin main:newBranch


1.
git fetch origin foo

커밋들을 foo브랜치에서만 내려받은 후 로컬의 o/foo브랜치에만 적용합니다.
....
(1) clone
git clone
(2) 원격 브랜치(remote branch)
git commit
git checkout o/main
git commit
(3) Git Fetch
git fetch
(4) Git pull
git pull
(5) 가짜 팀워크
git clone
git fakeTeamwork main 2
git commit
git pull
(6) Git push
git commit
git commit
git push
(7) 엇갈린 히스토리
git clone
git fakeTeamwork main
git commit
git pull --rebase
git push
(8) 잠겨버린 main 브랜치
git reset --hard o/main
git checkout -b feature c2
git push
(1) push Main!
git fetch
git rebase o/main side1
git rebase side1 side2
git rebase side2 side3
git rebase side3 main
git push
(2) 원격 작업과 merge하기
git checkout main
git pull
git merge side1
git merge side2
git merge side3
git push
(3) 원격저장소 추적하기
git checkout -b side o/main
git commit
git pull --rebase
git push
(4) git push의 인자들
git push origin main
git push origin foo
(5) git push 인자 --확장판
git push origin main^:foo
git push origin foo:main
(6) Fetch의 인자들
git fetch origin main^:foo
git fetch origin foo:main
git checkout foo
git merge main
(7) Source가 없다
git push origin :foo
git fetch origin :bar
(8) pull 인자들
git pull origin bar:foo
git pull origin main:side