서버 저장소 : 원격(remote) 저장소
서버 저장소는 로컬 저장소의 코드를 복제한 복사본이라고 할 수 있다.
서버를 이용해 코드를 안전하게 보관, 다른사람과 공유 & 협업 가능
협업 저장소
깃은 여러 개발자와 협업하려고 탄생한 도구
원격 저장소가 있다면 언제 어디에서든지 개발을 이어서 할 수 있다.
원격 저장소에 작업한 코드를 업로드하고 다른 곳에서 업로드된 코드를 내려받아 작업을 이어나갈 수 있음
깃은 분산된 저장소 여러 개를 하나로 통합하고, 최신 코드를 배포할 수 있음
서버 저장소는 여러 컴퓨터에 동일한 깃 저장소를 복제하고, 작업한 결과물을 다시 서버로 통합
깃의 분산형 관리 체계는 다수의 사람과 협업하는 데 매력적임
새로운 멤버가 참여할 때, 지금까지 작업한 소스 코드의 마지막 버전을 공유해야 함(깃의 원격 저장소 주소만 알려주면 모두 해결됨)
직접 서버를 운영하지 않아도 전문적인 깃 호스팅으로 서버를 대체할 수 있음
호스팅을 받으면 직접 서버를 관리하지 않아도 쉽게 원격 저장소를 운영할 수 있음
로컬 저장소
원격 저장소에 연결하려면 먼저 로컬 저장소가 있어야 함
로컬 저장소를 원격 저장소에 연결하는 방법은 크게 두가지
1. 새로운 로컬 저장소를 생성하고 원격 저장소를 연결하기
2. 기존 저장소를 연결하기
1 방법
로컬 저장소
$ mkdir gitstudy05 # 새 폴더 만들기
$ cd gitstudy05 # 새 폴더로 이동
$ git init # 저장소를 깃으로 초기화
$ echo "# gitstudy05" >> README.md # 파일 생성
$ git add README.md # 스테이지에 등록
$ git commit -m "first commit" # 첫 번째 커밋
프로토콜
서버와 통신하려면 프로토콜을 사용해야 함
Local(로컬)
로컬 컴퓨터에 원격 저장소를 생성하는 것
자신의 컴퓨터를 NFS(Network File System)등 서버로 이용할 때 편리
로컬 저장소를 서버로 이용할 때는 폴더 경로만 입력하면 됨
$ git remote add 원격저장소별칭 폴더 경로
로컬은 간단하게 원격 서버를 구축할 수 있을 뿐만 아니라 빠른 동작이 가능함
모든 자료가 자신의 컴퓨터에 집중되는 위험도 있다.
HTTP
깃은 HTTP 방식의 프로토콜 지원함
서버에 접속하려면 로그인 절차를 거쳐야 함
기존 아이디, 비밀번호로 접속자를 인증하여 처리할 수 있음
익명으로도 처리할 수 있음
SSH
깃에서 권장하는 프로토콜, 높은 수준의 보안 통신으로 처리하기 때문에 깃 서버를 좀 더 안전하게 운영할 수 있음
SSH 접속할 때는 인증서를 만들어 사용함
인증서를 만들어서 접속하면 별도의 회원 로그인 절차 X
인증서는 공개키 / 개인키로 구분.
공개키는 서버에 등록, 개인키는 로컬에 저장
익명으로 접속 X
Git
깃의 데몬 서비스를 위한 전용 프로토콜 방식을 의미
SSH와 유사하지만 인증 시스템이 없어 보안에 취약할 수 있음
잘 사용 X
원격 저장소의 리모트 목록 관리
깃은 원격 저장소(서버)를 관리하는 데 remote 명령어를 사용함
remote 명령어 사용 - 현재 연결된 원격 저장소 목록을 확인할 수 있음
동시에 등록, 취소 등 작업할 수 있음
원격 저장소 목록만 확인할 때 명령어
$ git remote
원격 저장소의 별칭 이름과 URL 확인할 때 명령어
$ git remote -v # 원격 저장소 목록 확인
깃은 복수의 원격 저장소를 연결하여 사용 가능
리모트 저장소가 여러 개 있을 때는 목록을 모두 출력
저장소의 권한 정보까지는 알 수 없음
주소와 별칭
로컬 저장소에 원격 저장소(서버)를 등록하려면 서버 주소가 필요함
깃허브 같은 저장소를 이용해 보면 프로토콜 + 도메인 주소 형태로 된 것을 알 수 있음
로컬에 서버 저장소를 생성할 때는 폴더 경로를 사용할 수 있음
별칭 : 예를 들면 origin
원격 저장소와 연결하는 명령어
$ git remote add 원격저장소별칭 원격저장소URL
원격 저장소가 연결되면 fetch와 push 두 주소를 출력
push : 서버로 전송하는 동작
fetch : 서버에서 가지고 오는 동작
별칭 중복 선택 X
별칭 이름 변경 명령어
$ git remote rename 변경전 변경후
원격 저장소의 좀 더 상세한 정보 확인 명령어
$ git remote show 원격저장소별칭
원격 서버 삭제
로컬 저장소는 복수의 원격 저장소와 연결 가능
등록된 원격 저장소 삭제 명령어
$ git remote rm 원격저장소별칭
push : 서버에 전송
원격저장소로 커밋된 파일들을 업로드하는 동작
서버에 전송하는 명령어
$ git push 원격저장소별칭 브랜치이름
별칭 이름을 가지는 서버의 master 브랜치에 현재 브랜치를 업로드함
처음 push하면 서버에 새로운 master 브랜치를 생성함
로컬의 master 브랜치 안에 있는 소스 코드를 서버의 master 브랜치로 업로드
자신의 로컬 저장소를 백업하는 용도로 원격 저장소를 사용할 수 있음
clone(복제)
복제는 기존 저장소를 이용하여 새로운 저장소를 생성하는 방법 중 하나
clone 명령어 사용해서 복제
clone 명령어는 초기화 init 명령어 외에 원격 서버 접속에 필요한 추가 설정을 자동으로 수행함
서버의 연결 설정을 마친 후 서버 안에 있는 모든 커밋된 코드 이력들을 한 번에 내려받음
복제 후 원격 저장소의 갱신된 내용을 추가로 내려받으려면 pull 명령어 사용
pull 명령어는 로컬 저장소보다 최신인 갱신된 원격 저장소의 커밋 정보를 현재 로컬 저장소로 내려받음
명령어
$ git pull
원격 저장소의 내용을 내려받는 방법은 크게 pull, fetch
차이 : 병합의 자동 처리 여부
자동 병합
pull : 원격 서버에서 현재 커밋보다 더 최신 커밋 정보가 있을 때
내려받은 커밋 정보는 임시 영역에 저장
스테이지 영역이 아닌 원격 저장소를 위한 전용 임시 브랜치가 따로 있음
내려받은 최신 커밋들을 현재 브랜치로 자동으로 병합 처리함
병합은 원격 서버 파일과 로컬 파일을 하나로 합치는 과정임
여러 개발자와 협업하는 과정에서 pull 명령어가 자동으로 브랜치 병합을 하지 못하고 충돌이 발생하기도 함 >> fetch 방식 사용
fetch: 가져오기
원격 저장소에서 코드를 수동으로 내려받는 작업
원격 저장소에서 커밋된 코드를 임시 브랜치로 내려받음
내려받은 후 현재 브랜치와 자동 병합 X
$ git fetch 원격저장소URL
pull 명령어와 달리 fetch 명령어를 실행한 후에는 커밋이 추가된 것을 확인할 수 없음
fetch는 원격 저장소의 커밋들만 가지고 왔을 뿐 로컬 저장소에서 어떤 작업도 하지 않음
내려받은 커밋을 로컬 저장소에 적용하려면 병합 명령을 실행해야함.
merge 명령어 사용
$ git merge 원격저장소별칭/브랜치이름
원격 저장소에는 다수의 개발자가 동시에 커밋을 push할 수 없음
여러 명이 협력해서 개발할 때는 순차적으로 push해야 함
원격 저장소에 push하려면 자신의 로컬 저장소를 최신 상태로 유지해야함
커밋이 순차적이지 않을 때 깃은 push 동작을 거부
깃 거부 >> pull or fetch & merge(자신의 로컬 저장소 갱신) >> push
충돌방지
깃이 최신 상태에서만 push를 허용하는 것은 충돌을 방지하기 위함
원격 저장소의 커밋을 내려받는 pull 작업은 내려받은 커밋들을 현재 브랜치로 자동 병합
이때 커밋 내용이 순차적이지 않으면 병합 과정에서 충돌이 발생함
순서 :
pull >> coding >> commit >> pull >> push
pull, push 를 자주 하여 충돌을 최소한으로 줄여 나가면서 작업할 것