[Git] Git 개념 2 - 원격(협업)

@t189216·2024년 1월 20일

Git

목록 보기
2/10

Learn Git Branching


🌐 Learn Git Branching

clone



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가 원격 저장소가 갱신될때만 갱신되기 때문입니다.

fetch



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

git fetch


커밋 C2C3 가 우리의 로컬 저장소로 다운로드 되었고, 원격 브랜치 o/main 가 이것을 반영하기 위해 업데이트 되었습니다.

pull


원격 저장소의 변경을 fetch하고 그이후에 merge하는 작업의 과정이 워낙 자주있는 일이라서 git은 이 두가지를 한번에 하는 명령을 제공합니다! 이 명령어는 git pull 입니다.

  • fetch 후에 merge
git fetch git merge o/main
  • pull
git pull

fakeTeamwork


원격 저장소가 동료 / 친구 / 협력자등에 의해 특정 브랜치나 여러개의 커밋이 갱신되는 경우를 표현할 필요가 있습니다. 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

merge와 rebase


rebase 는 여러분의 커밋 트리를 모든게 한 줄에 있기 때문에 깔끔하게 정리해서 보기가 좋습니다. 하지만 rebase 를 하게 되면 커밋 트리의 (보이는)히스토리를 수정합니다.

예를 들어, 커밋 C1는 과거의 C3로 rebase 될 수 있습니다. C1'의 작업이 C3의 다음에 있는것으로 보이게 되는겁니다. 실제로는 C1이 먼저 완료된거인데 말이죠.

  • 이력이 보존되는 것을 선호: merge
  • 커밋 트리가 깔끔한 것을 선호: rebase

merge 사용


1.

git checkout main


2.

git pull


3.

git merge side1


4.

git merge side2


5.

git merge side3


6.

git push

push의 인자


git push {remote} {place}

git push origin main


1.

git push origin main


2.

git push origin foo

git push origin {source}:{destination}

로컬의 foo 브랜치에서 원격의 bar 브랜치로 커밋을 push하고 싶다면.. sourcedestination을 모두 지정하면 됩니다! 이것을 일반적으로 colon refspec(콜론 참조스펙)이라고 부릅니다.

source는 git이 이해하는 아무 위치를 말합니다.


1.

git push origin foo^:main


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


push하고 싶은 destination(목적지)가 없다면?

1.

git push origin main:newBranch

fetch의 인자



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

정답 - 원격2


(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
profile
Today I Learned

0개의 댓글