Git Remote Repository

    1. Git Remote Repository

    Github에서 Repository를 만들어서 여러 개발자들과 편리하게 협업할 수 있다. 

    Github에서 Repository를 만들 때, README.md를 추가하지 않았다면 다음과 같은 화면이 뜨는 것을 볼 수 있다. 위의 명령어들을 Github에 만들어진 Repository를 Local Repository와 연결하는 방법을 알려준다.

    • create a new repository on the command line : Local Git Repository 만들고 연결
    • push an existing repository from the command line : 기존 Local Git Repository를 연결

    위의 명령어대로 처리를 하면 Local Repository - Remote Repository 간의 연결이 활성화 된다. 

     

    2. Git Local Repository 생성

    $ mkdir gitstudy05
    $ cd gitstudy05
    $ git init
    
    $ echo "# gitstudy05 " >> README.md
    
    $ git add .
    $ git commit -m "first commit!"
    •  다음 명령어를 이용해서 Local에 gitstudy 05 Repository를 만들고, README. md를 등록할 수 있다.
    • 등록된 결과는 untracked된 상태다. 따라서 git add를 통해서 Stage에 등록해주고, git commit으로 변경 사항을 반영해준다.
    • Git Commit을 하게 되면, 현재 로컬 브랜치가 가리키는 Head는 현재 상태가 된다.

     

     

    3. 원격 저장소에 연결

    $ git remote

    원격 저장소를 관리하는 명령어는 git Remote다. git remote는 여러 옵션을 이용해서 등록, 삭제, 조회 등 다양한 작업을 할 수 있다. 따라서 git remote 명령어를 어떻게 사용하는지에 대한 공부가 필요하다. 

    # Local Repository / 원격 Repository 연결
    $ git remote add <원격_저장소_별칭> <원격_저장소_url>

    위 명령어를 이용하면 원격 저장소를 현재 Local Git Repository와 연결할 수 있다. 

    • git remote add 명령어로 Remote Repository를 Local에 등록했다.
    • git remote -v 명령어로 현재 Local Repository와 연결된 Remote Repository를 확인했다.
      • fetch : 별칭 Repository에서 값을 가져올 때의 주소
      • push : 별칭 Repository에 값을 밀어넣을 때 주소

     

    4. Remote Repository 이름 변경 / 정보 / 삭제

    # 원격 저장소 이름 바꾸기
    $ git remote rename <별칭> <바꿀_별칭>
    
    # 원격 저장소 정보 보기
    $ git remote show <별칭>
    
    # 원격 저장소 제거하기
    $ git remote rm <별칭>
    • 위 명령어를 이용하면 원격 저장소의 이름을 바꾸고, 정보를 볼 수 있고 제거할 수 있다.

    • 다음과 같이 이름을 바꿀 수 있다.

    • 다음과 같이 원격지 정보를 볼 수 있다.

    • 다음과 같이 원격지 정보를 삭제할 수 있다.

     

    5. Remote Repository Push

    # 원격지의 master 브랜치에 현재 Local 브랜치를 업로드 함.
    $ git push <원격지_별칭> <브랜치_이름>
    • Push 작업은 Local에서 만들어진 Commit을 Remote Repository에 반영해주는 역할을 한다.  위 명령어를 이용하면 별칭 이름을 가지는 master 브랜치에 현재 브랜치를 업로드 한다.
    # 현재 브랜치가 없는 경우, 사용한다. 
    
    $ git push -u <원격지 별칭> <브랜치 이름>
    $ git push --set-upstream <원격지 별칭> <브랜치 이름>
    • 만약 upstream 서버에 어떤 브랜치도 없어서 문제가 있는 경우는 -u / --set-upstream을 하게 되면 된다. 

    • 다음과 같이 새로운 Branch가 생긴 것을 확인할 수 있다. 

    • Git에서도 Main 브랜치가 생겼다. 

     

    6. Remote Repository에서 내려받기 (Clone / Pull / Fetch)

    $ git clone 원격지 url
    $ git pull
    $ git fetch

    위 3개의 명령어를 이용해서 원격지에 있는 코드를 Local Repository로 복사할 수 있다. 그럼 세 명령어의 차이점은 어떤 것일까?

     

    Clone

    Clone은 원격지의 정보를 모두 복사하는 역할을 한다. git init + 복사 + git remote add 명령을 모두 수행하는 것으로 이해할 수 있다. 

     

    Pull → 원격지 변경점 다운 + 현재 Local 브랜치와 Merge

    Clone 한 후, 원격 저장소의 변경점을 계속 내려받으려면 Pull을 이용하면 된다. Pull은 원격지에 반영된 Commit을 로컬로 다운받는다. 그리고 그 변경점을 현재 Local 브랜치와 Merge한다. 

    1. 최신 커밋 정보를 내려받는다.
    2. 내려받은 커밋 정보를 로컬의 임시영역에 저장한다. (원격 저장소를 위한 전용 임시 브랜치)
    3. 내려받은 최신 커밋을 현재 브랜치로 Merge함.

    더 정확한 동작 방법은 위와 같다. Pull의 문제점은 Merge 과정에서 Conflict가 발생할 수 있다는 점이다. 예를 들어 index.html 파일을 개발자1,2가 모두 수정을 했다고 하자. 그리고 개발자2가 변경 내용을 원격지에 Push해서 반영하고, 개발자1이 변경 내용을 pull하게 되면 merge 하는 과정에서 Conflict가 발생한다. 

    Conflict가 발생하는 경우에는 수동으로 Merge를 해야한다. 수동 Merge를 위해서 Fetch 명령어를 사용한다. 

     

    fetch

    fetch는 원격지에서 코드를 수동으로 내려받는 작업을 한다. 내려받은 코드를 Local의 임시 브랜치에 저장한다. 내려받은 후 Local의 현재 브랜치와 자동으로 Merge하지 않는다. 

    fetch 명령어를 사용하면 새로운 Master 브랜치를 하나 더 생성한다. 이 브랜치는 서버/master 형태의 임시 브랜치이고, 이 브랜치에는 커밋을 할 수 없다.

     

     

    Cloen → Pull → Fetch 실습

    • gitstudy05_clone 폴더를 만들고, 이 폴더에 git clone을 했다. 
    • git remote로 원격지가 등록된 것을 확인했다. 실제로 원격지가 등록된 것을 볼 수 있다. 

    • gitstudy05 폴더에서 index.html을 만든 후, commit 및 원격지에 push했다. 
    • 원격지에는 index.html 파일이 생겼다. 

    • git pull 명령어를 이용해서 원격지 → gitstudy05_clone Repository로 변경점을 다운받았다. 

    • git log를 이용해서 Commit  반영 내용을 확인했을 때, 정상적으로 반영된 것을 볼 수 있다.

    • index.html에 다음과 같은 수정 과정을 넣는다. <h3 /> 부분이다.

    • 변경된 부분을 Commit 하고 다시 Push 한다.

    • 이제 최신 내용을 gitstudy05_clone Repository로 fetch 해서 가져온다.

    • 가져와보면 새로운 커밋인 "look sky"라는 Commit은 log에 보이지 않는 것을 볼 수 있다. 즉, 현재 로컬 브랜치는 원격지에서 가져온 Commit 내용이 반영되지 않은 상태다.
    • fetch는 Git Repository에서 최신 내용을 Local로 가져오지만, Local의 임시 영역에 브랜치를 만들어두기만 한 상황이고, 현재 브랜치에는 반영이 되지 않았기 때문이다.

    • git branch -a 명령어를 이용해서 현재 로컬에서 관리하고 있는 브랜치를 확인한다. 여기서 remotes에 origin/main 브랜치가 존재하는 것을 볼 수 있다. 이 브랜치가 fetch로 가져온 브랜치다. 
    • git merge <브랜치 명>을 이용해서 현재 브랜치에 merge 할 수 있다. Merge를 실행한다. 

    merge를 실행하고 로그를 확인해보면, "look sky"라는 커밋 메세지가 있는 것을 볼 수 있다. 즉, fetch로 다운 받은 최신 커밋 내용이 정상적으로 현재 브랜치에 반영되었다는 것을 의미한다.

     

    7. Push 순서

    Local의 변경점을 원격 Repository에 Push 하기 위해서 Local의 브랜치가 항상 최신 상태여야한다. 예를 들어 원격 Repository에서 Pull로 변경점을 다운 받았는데, 원격 Repository가 다시 한번 변한다면 Local Repository는 최신 버전이 아니다. 따라서 Local 저장소를 Push하게 되면 Git은 이 명령을 거절한다. 따라서 Local 저장소를 Push 하기 전에는 항상 최신 버전으로 바꾸는 작업을 해야한다. 

    pull → 코드 수정 → commit → pull (최신화) → Push

    위의 흐름대로 작업을 하게 되면 Push가 정상적으로 이루어질 수 있다.

     

     

     

     

    '기타 Tool > Git' 카테고리의 다른 글

    Git 병합 / 충돌  (0) 2022.08.29
    Git Branch  (1) 2022.08.27
    Git의 Commit  (0) 2022.08.26
    Git Repository 복사  (0) 2022.08.26
    GIt의 워킹 디렉토리 / 스테이지 / 상태  (0) 2022.08.20

    댓글

    Designed by JB FACTORY