오픈소스SW

오픈소스SW_Chapter05_서버

강용민 2022. 10. 10. 19:49

서버 저장소

서버 저장소는 다른 말로 원격(remote) 저장소라고 하며, 서버를 이용하면 코드를 안전하게 보관할 수 있다.

깃에서 서버 저장소는 로컬 저장소의 코드를 복제한 복사본이 저장되며, 서버에 있는 소스 코드는 다른 사람들과 공유하고 협업하여 개발을 진행할 수도 있다.

 

서버의 필요성

  • 협업 저장소
    • 깃은 여러 개발자와 협업하려고 탄생한 도구이다.
    • 요즘 컴퓨터는 항상 인터넷에 접속되어 있으나 현재까지도 인터넷에 연결하여 원격으로 작업할 수 없는 개발 환경도 존재한다.
    • 깃은 이 두 가지 환경을 고려하여 분산형 모델을 선택했다.
  • 연속된 작업
    • 원격 저장소가 있다면 시간과 장소에 상관없이 연속적으로 개발을 할 수 있다.
    • 깃은 분산된 저장소 여러 개를 하나로 통합하고, 최신 코드를 배포한다.
    • 서버 저장소는 여러 컴퓨터에 동일한 깃 저장소를 복제하고, 작업한 결과물을 다시 서버로 통합한다.
  • 새 멤버
    • 깃은 분산형 관리 체계는 다수의 사람과 효율적으로 협업하도록 지원한다.
    • 기존 프로젝트에 새로운 멤버가 함여할 때, 지금까지 작업한 소스 코드의 마지막 버전을 공유한다.
      • 깃을 원격 저장소의 주소만 알고 있으면 코드를 공유할 수 있다.
    • 원격 저장소로 모든 구성원에게 코드의 최종 결과물을 간단하게 동기화할 수 있다.

 

프로토콜

서버와 통신하려면 프로토콜을 사용해야 한다.

깃은 서버와 통신할 수 있는 다양한 프로토콜을 지원하는데, Local, HTTP, SSH, Git 네 종류의 전송 방식을 지원한다.

 

  • Local
    • 로컬 컴퓨터에 원격 저장소를 생성하는 것을 의미한다.
    • 이 방식은 자신의 컴퓨터를 NFS(Network File Syste) 등 서버로 이용할 때 편리하다.
    • git remote add 원격저장소별칭 폴더경로
    • 로컬은 간단하게 원격 서버를 구축할 수 있을 뿐만 아니라 빠른 동작이 가능하지만 모든 자료가 자신의 컴퓨터에 집중되는 위험도 있다.
  • HTTP
    • HTTP는 SSH처럼 많이 사용하는 프로토콜 중 하나로 서버에 접속하려면 로그인 절차를 거쳐야 한다.
    • HTTP는 기존 아이디와 비밀번호만으로 접속자를 인증하여 처리할 수 있다.
    • 또한 익명으로도 처리할 수 있으며, 계정을 이용하여 처리할 수도 있다.
  • SSH
    • SSH는 깃에서 권장하는 프로토콜로 , 높은 수준의 보안 통신으로 처리하기 떄문에 깃 서버를 좀 더 안저하게 운영할 수 있다.
    • SSH  프로토콜을 사용하려면 주소 앞에 'ssh://계정@주소'처럼 프로토콜 타입을 지정해야 한다.
      • 계정을 생략하여 현재 로그인된 사용자 정보로 대체할 수도 있다.
    • SSH 접속을 할 떄는 인증서를 만들어 사용한다.
      • 인증서를 만들어 접속하면 별도의 회원 로그인 절차를 거치지 않아도 된다.
      • 인증서는 공개키와 개인키로 구분하는데 공개키는 서버에 등록하며, 개인키는 로컬에 저장한다.
    • SSH는 HTTP와 달리 익명으로 접속할 수 없다.
  • Git
    • 깃의 데몬 서비스를 위한 전용 프로토콜 방식을 의미한다.

 

원격 저장소의 원격 목록 관리

깃은 원격 저장소를 관리하는 데 remote명령어를 사용한다.

git remote

remote 명령어를 사용하면 현재 연결된 원격 저장소 목록을 확인할 수 있다.

  • -v 옵션을 같이 사용하면 원격 저장소의 별칭 이름과 URL을 확인할 수 있다.

리모트 저장소가 여러 개 있을 때는 목록을 모두 출력하지만 저장소의 권한 정보까지는 알 수 없다.

 

주소와 별칭

로컬 저장소에 원격 저장소를 등록하려면 서버 주소가 필요하다. 깃허브 같은 저장소를 이용해 보면 프로토콜 + 도메인 주소 형태로 된 것을 알 수 있다.

 

별칭

원격 서버의 주소는 긴 문자열로 되어 있어 매번 원격 서버에서 작업할 때마다 긴 문자열을 입력하는 것은 번거롭기 때문에 간략하게 긴 서버 URL 문자열을 별칭으로 만들어 사용할 수 있다. 별칭은 중복하여 선택할 수 없다.

origin은 대표적으로 사용하는 별칭이다.

rename 옵션을 사용하여 등록된 서버의 별칭 이름을 다시 변경할 수 있다.

 

원격 저장소에 연결

원격 저장소에 연결하려면 add 옵션을 사용해야 한다.

git remote add 원격저장소별칭 원격저장소URL

원격 저장소를 추가할 때는 인자 값으로 원격 저장소 별칭과 원격 저장소의 URL을 같이 입력해야한다.

원격 저장소가 연결되면 fetch와 push 두 주소를 출력하는데, fetch는 서버에서 가지고 오는 동작을 의미하고 push는 서버로 전송하는 동작을 의미한다.

 

원격 서버 삭제

로컬 저장소는 복수의 원격 저장소와 연결할 수 있다.

등록된 원격 저장소는 rm옵션으로 삭제할 수 있다.

git remote rm 원격저장소별칭

 

push

push는 원격 저장소로 커밋된 파일들을 업로드하는 동작이다

git push 원격저장소별칭 브랜치이름

 

clone

복제는 기존 저장소를 이용하여 새로운 저장소를 생성하는 방법 중 하나이다.

git clone 원격저장소URL

일반적인 복제와 원격 저장소를 복제하는 방법은 약간 차이가 있으므로 몇 가지 추가 정보를 같이 설정해야 한다.

clone 명령어는 초기화 init 명령어 외에 원격 서버 접속에 필요한 추가 설정을 자동으로 수행한다.

서버의 연결 설정을 마친 후 서버 안에 있는 커밋 된 모든 코드 이력들을 한 번에 받아온다.

 

pull

복제 후 원격 저장소의 갱신된 내용을 추가로 내려받으려면 pull 명령어를 사용해야 한다.

pull 명령어는 로컬 저장소보다 최신인 갱신된 원격 저장소의 커밋 정보를 현재 로컬 저장소로 내려받는다.

갱신된 원격 저장소의 커밋을 복제한 저장소에도 동기화를 자동으로 한다.

git pull

 

fetch

pull과 같이 원격 저장소의 내용을 내려받는 방법 중 하나다.

차이점이 있다면 병합을 자동 처리하는지에 대한 여부다.pull은 병합을 자동 처리하지만 fetch는 자동 처리를 지원하지 않는다.

여러 개발자와 협업으로 코드를 작성할 때 pull 명려어를 사용한 자동 병합은 간혹 문제가 생길때가 있는데 이럴 때 fetch명령어를 이용해 병합을 시도해야 한다.

 

pull vs fetch

pull은 원격 서버에서 현재 커밋보다 더 최신 커밋 정보가 있을 때 내려받는다.

먼저 내려받은 커밋 정보는 스테이지 영역이 아닌 원격 저장소를 위한 전용 임시 브랜치에 저장된다.

임시 브랜치는 현재 브랜치와 자동으로 병합이 된다.

여러 개발자와 협업으로 코드를 작성할 때 pull 명려어를 사용한 자동 병합은 간혹 문제가 생길때가 있는데 이럴 때 fetch명령어를 이용해 병합을 시도해야 한다.

이때 fetch도 내용을 임시 브랜치에 저장한다.하지만 pull과는 다르게 내려받은 후 현재 브랜치와 자동 병합을 하지 않는다.

 

merge

fetch는 데이터를 내려받기만 할 뿐 자동 병합을 하지 않는다.

내려받은 커밋을 로컬 저장소에 적용하려면 병합 명령을 실행해야 하는데, merge 명령어를 사용한다.

git merge 원격저장소별칭/브랜치이름

merge명령어 후 로그를 보면 원격 저장소에서 받아온 내용의 로그정보도 함께 통합된것을 알 수 있다.

 

최신 상태

원격 저장소에 푸시하려명 자신의 로컬 저장소를 최신 상태로 유지해야 한다.즉, 자신의 저장소가 원격 저장소의 커밋보다 최신이어야 한다는 의미다.

근데 누군가 내 저장소보다 먼저 커밋하여 새로운 커밋으로 서버를 갱신하면 내 저장소는 최신 상태가 아니라 깃은 푸시 동작을 거부한다.

푸시 동작이 거부되면 사용자는 풀 또는 페치 작업으로 자의 로컬 저장소를 갱신해 주어야 한다.

 

문제.

깃은 서버와 통신할 수 있는 다양한 프로토콜을 지원한다. 어떤 프로토콜이 존재하는가?

HTTP, SSH, Git, Local

 

현재 연결된 원격 저장소 목록을 확인하는데 별칭 이름까지 확인하고 싶을 때 어떤 명령어를 사용해야하는가

git remot -v

 

원격 저장소와 연결하기 위해서는 어떤 명령어를 사용해야 하는가

git remote add 원격저장소별칭 원격저장소URL

 

원격 저장소와의 연결을 끊기 위해서는 어떤 명령어를 사용해야 하는가

git remote rm 원격저장소별칭

 

clone과 pull의 공통점과 차이점은 무엇인가

clone과 pull은 원격 저장소의 내용을 내려받는다는 공통점이 있다.

하지만 pull은 본제 즉,clone이후에 원격 저장소의 갱신된 내용을 추가로 내려받는다.

 

pull로 원격 서버의 최신 내용을 불러온다. 이때 내려받은 커밋 정보는 스테이지 영역에 자리한다.맞는가 틀린가. 틀리다면 그 이유는 무엇인가?

아니다. pull로 원격 서버의 최신 내용을 불러오고, 그 최신내용들은 스테이지 영역이 아닌 원격 저장소를 위한 전용 임시 브랜치에 저장된다.

 

pull과 fetch의 공통점과 차이점은 무엇인가

pull과 fetch는 원격 저장소의 내용을 로컬 저장소로 불러오는 명령어라는 점에서 같지만 자동 병합의 유무의 차이가 있다.

pull과 fetch 둘 다 원격 저장소의 내용을 임시 브랜치에 저장시키는데 pull은 현재 브랜치와 자동 병합이 되지만 fetch의 경우 자동 병합이 되지 않는다.

 

로컬 저장소의 내용을 원격 저장소로 보내기 위해 push를 했다. 근데 내 로컬 저장소가 최신상태가 아니라 오류가 났다. 이때는 어떻게 해결해야 하는가

pull 또는 fetch를 통해 로컬 저장소를 최신상태로 유지시킨 뒤 다시 푸쉬한다.