원격 저장소를 기존에 연결된 지역 저장소 외에 다른 지역 저장소에서 사용하려면 원격 저장소에 담긴 내용 전체를 지역 저장소로 가져와야 된다.
git clone 복사한 주소 붙여넣기 디렉토리명
- 원격 저장소를 복제하면 자동으로 지역 저장소와 원격 저장소가 연결된다. git remote -v명령으로 확인 가능
clone을 통해서 master 브랜치는 origin에 이미 연결되어 있기 때문에
git pull origin master 말고 git pull 명령어를 입력하면 된다.
git pull 명령 전에는 최신 커밋을 합치기 전에 원격 저장소에 어떤 변화가가 있는지 먼저 살펴봐야 된다.
- 원격 브랜치에서 정보만 먼져 가져올 수 있다.
지역 저장소의 master 브랜치처럼 원격 저장소도 만들 때 기본으로 master 브랜치가 생성된다.
- 원격 저장소에 있는 브랜치는 ‘원격 브랜치’ , 원격 저장소에 있는 master 브랜치는 ‘원격 master브랜치’로 구별하겠다.
원격 저장소에 있는 HEAD는 원격 저장소의 master 브랜치를 가리킬 것이고, master 브랜치는 ‘최근 마지막 commit’을 가리킨다.
HEAD → master는 이 커밋이 지역 저장소의 최종 커밋이라는 뜻이다.
origin/master는 원격 저장소의 최종 커밋이라는 뜻이다.
지금은 원격 저장소를 복제한 상태 그대로이기 때문에 지역 저장소와 원격 저장소 모두 최종 커밋이 같다.
수정을 한 뒤 git log--online을 통해서 확인해보자
HEAD → master 는 방금 커밋한 create f3.txt를 가리킨다.
origin/master, origin/HEAD는 아직 ‘최근 커밋’을 가리키고 있다.
git status를 입력하면
현재 master 브랜치가 origin에 있는 원격 master 브랜치 버전보다 하나 앞서 있는 것을 알 수 있다.
- git push 명령으로 지역 저장소의 커밋을 원격 저장소로 올리라고 알려준다.
- push 해주면 master 와 origin/master 브랜치가 같은 커밋을 가리킨다.
원격 브랜치 정보 가져오기 - git fetch
git fetch 명령은 원격 저장소의 정보를 가져오는 기능이 있다.
- pull은 원격 저장소의 커밋을 가져와서 무조건 지역 저장소와 합친다면 fetch는 원격 브랜치에 어떤 변화가 있는지 그 정보만 가져온다.
팀 작업을 할 때 다른 사람이 수정한 소스를 한번 더 훑어보고 지역 저장소와 합치고 싶으면
pull 대신 fetch를 사용해서 커밋을 가져온 다음 지역 저장소와 합치면 된다.
- fetch만 할 경우 HEAD → master 만 보이고 원격 저장소의 origin/master는 보이지 않는다.
- 추가적으로 원격 저장소에 있던 추가적인 내용은 합쳐지지 않는다.
이 때 git status를 보자
원격 저장소의 최신 커밋 하나가 아직 지역 저장소에 반영되지 않았다는 뜻이다. git pull 명령을 사용하면 지역 저장소를 업데이트할 수 있다고 알려준다.
fetch로 가져온 원격 저장소 정보는 origin/master 브랜치가 아닌 FETCH_HEAD라는 브랜치로 가져온다.
- 이 브랜치로 가져온 정보는 지역 저장소에 바로 반영되지 않는다.
git checkout FETCH_HEAD
FETCH_HEAD 브랜치로 체크아웃 후 log를 보면
최신 커밋에 origin/master와 origin/HEAD가 표시되어 있다.
- 이 커밋이 fetch로 가져온 원격 브랜치의 최신 커밋이다. 이정보를 보고 합칠지 말지 생각하면 된다.
- git pull 명령을 사용해 원격 저장소의 소스를 내려받을 수도 있고, git merge 명령으로 FETCH_HEAD에 있던 커밋을 병합할 수도 있다.
#merge 하는법
git checkout master
git merge FETCH_HEAD
fetch로 가져온 브랜치 한 번에 병합하기
#폐지한 뒤 병합할 때 원격 master 브랜치에 있는 커밋이라면
git merge origin/master
#다른 브랜치에 있는 커밋이라면
git merge origin/브랜치 이름
#매번 브랜치 이름을 쓰면 번거롭기 때문에 폐지한 뒤 지역 저장소에 반영하지 않은 최신 커밋을 병합하기
git merge FETCH_HEAD
공독 작업에서 사용할 이름과 이메일 주소를 지정해야 한다.
git config user.name "사용자 이름"
git config user.email 메일 주소
- config 명령을 사용할 때 —grobal 옵션을 빼고하자.
공동 작업중 내가 커밋한 시점에 다른 사용자가 내용을 올려 push하려고 했더니 ![rejected]라고 시작하는 오류 메시지가 발생할 수 있다.
- 원격 저장소에 있는 최신 커밋 정보가 팀원 1의 컴퓨터에 저장되어 있지 않기 때문에 나타난 것이다.
- 이 때는 git pull을 해줘서 최신상태로 만들어준 뒤 push 하자
협업을 하다 보면 팀원들이 각자 다른 기능을 만들어 각자의 작업이 master 브랜치에 있는 문서들과 섞이지 않도록 새 브랜치를 만들어서 버전관리한다.
- 각 팀원이 만든 새 브랜치 역시 원격 저장소에 그대로 푸시할 수 있다.
#checkout에 -b 옵션을 사용하면 브랜치를 만들고 체크아웃하는 것을 한꺼번에 할 수 있다.
git checkout -b f
#git push 뒤에 origin f를 추가하면 원격 저장소(origin)에 f 브랜치를 푸시한다는 의미
git push origin f
- 아직 원격 저장소의 파일 목록에는 f 브랜치에서 만들었던 내용이 없다.
- 푸시한 브랜치는 풀 리퀘스트(pull request)를 통해 병합해야 원격 저장소에 반영되기 때문이다.
협업 중인 원격 저장소에 등록된 풀 리퀘스트는 공동 작업자 중 누구나 살펴보고 병합할 수 있다.
저장소 파일 목록 위에 [Pull request]를 누르면 등록된 풀 리퀘스트 목록이 나타난다.
- 등록된 풀 리퀘스트를 눌러서 메시지를 살펴본 다음 내용에 문제가 없으면 [Merge pull request] 눌러 병합
- 필요하면 이 공간을 통해 풀 리퀘스트를 남긴 사람과 메시지를 주고 받을 수 있다.
- 커밋 메시지를 직접 입력하거나 기본 메시지를 사용할 수 있다. [Confirm merge]를 누르면 브랜치 병합이 끝난다.
- 브랜치가 병합된 상태라면 ‘merged’라고 표시되어 있다.
- 공동 작업자 중 누가 브랜치를 병합했는지도 알 수 있다.
깃허브에서 협업할 때는 보통 작업자마다 브랜치를 만들어서 진행하고, 작업 중간중간 풀 리퀘스트를 보내서
master 브랜치에 병합한다.
- 깃허브로 협업할 때는 다른 작업자의 변경 내용을 바로 반영하기 위해 항상 풀(pull)부터 한 다음
자신의 작업을 진행하는 것이 좋다.