만들면서 배우는 Git/GitHub 입문
Chapter 5. 원격 저장소와 Git
- Git에서는 원격 저장소와 로컬 저장소 사이의 소통을 위한 기능을 제공한다.
* 저장소 간 소통을 위한 Git 명령어
명령어 | 기능 |
git clone | 원격 저장소의 모든 내용을 로컬 저장소로 복사한다. |
git remote | 로컬 저장소를 특정 원격 저장소와 연결시킨다. |
git push | 로컬 저장소의 내용, 변경 사항을 원격 저장소로 보낸다. |
git fetch | 로컬 저장소와 원격 저장소의 변경 사항이 다를 때, 이를 대조하고 git merge 명령어와 함께 최신 데이터를 반영하거나 Conflict 등을 해결한다. |
git pull | gir remote 명령을 통해 서로 연결된 원격 저장소의 최신 내용을 로컬 저장소로 가져오면서 병합한다. git push 명령와 반대의 기능을 한다. |
5.1 git clone: 원격 저장소의 내용을 로컬 저장소로 가져오기
* git clone 명령어 형식
git clone https://github.com/사용자이름/원격저장소이름.git
(git clone 원격저장소URL)
- Clone: GitHub의 원격 저장소와 내 컴퓨터를 연결해 데이터를 복사하는 작업을 의미한다.
(즉, GitHub Repository -> Local Repository)
- 내가 생성한 원격 저장소를 복사해올 수도 있고, Fork*한 원격 저장소 또한 복사해올 수 있다.
- 다른 사람의 공개/비공개 원격 저장소를 Fork하지 않은 채, 복사해올 수도 있으나, 자유로운 사용에 제한이 있다.
- Clone 작업에 이용되는 네트워크 프로토콜로 SSH, HTTPS 등이 있다.
* Fork: GitHub내에서 타인의 원격 저장소를 내 원격 저장소에 복사하는 작업을 의미한다.
Step 1: GitHub Repository에서 Clone을 위한 URL을 복사해온다.
Step 2: Local Repository에서 git clone 명령을 통해 원격 저장소의 내용을 가져온다.
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~
$ mkdir Git_Test
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~
$ cd Git_Test
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/Git_Test
$ ls
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/Git_Test
$ git clone https://github.com/ByeongHeonLee/Introduction-to-Git-GitHub.git
Cloning into 'Introduction-to-Git-GitHub'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 669 bytes | 60.00 KiB/s, done.
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/Git_Test
$ ls
Introduction-to-Git-GitHub/
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/Git_Test
$ cd Introduction-to-Git-GitHub
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/Git_Test/Introduction-to-Git-GitHub (master)
$ ls
README.md
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/Git_Test/Introduction-to-Git-GitHub (master)
$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
- git clone 명령을 통해 저장소를 불러온 다음, git status 명령어로 저장소의 상태를 확인하고 있다.
- git status 명령어를 통해 로컬 저장소와 원격 저장소와의 커밋 차이를 알 수 있다.
- origin은 원격 저장소를 의미하는 별명이다.
5.2 git remote: 로컬 저장소와 원격 저장소를 연결하기
* git remote 명령어 형식
git remote add 저장소별칭 https://github.com/사용자이름/원격저장소이름.git
(git remote add 저장소별칭 원격저장소URL)
- git remote 명령어는 로컬 저장소를 특정 원격 저장소와 연결시켜주는 기능을 한다.
- 또한, 연결 상태를 확인하거나, 연결할 원격 저장소의 이름을 다른 별칭으로 지정할 수도 있게 한다.
※ 연결할 원격 저장소의 별칭은 "origin"으로 하는 것이 관례이다.
Step 1: GitHub Repository에서 remote을 위한 URL을 복사해온다.
Step 2: Local Repository에서 git remote 명령을 통해 원격 저장소와 연결한다.
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~
$ mkdir Git_Remote_Test
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~
$ cd Git_Remote_Test
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/Git_Remote_Test
$ git init
Initialized empty Git repository in C:/Users/?대퀝??Git_Remote_Test/.git/
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/Git_Remote_Test (master)
$ vi test.cpp
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/Git_Remote_Test (master)
$ git remote add origin https://github.com/ByeongHeonLee/Introduction-to-Git-GitHub.git
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/Git_Remote_Test (master)
$ git remote -v
origin https://github.com/ByeongHeonLee/Introduction-to-Git-GitHub.git (fetch)
origin https://github.com/ByeongHeonLee/Introduction-to-Git-GitHub.git (push)
- git remote -v 명령을 통해 remote 명령이 정상적으로 수행되었는지를 확인할 수 있다.
5.3 git push: 로컬 작업 내역을 원격 저장소에 올리기
* git push 명령어 형식
git push 원격저장소별칭 로컬브랜치이름
- git push 명령어는 Commit들을 원격 저장소의 master 브랜치에 업로드한다.
- 또한, 다양한 옵션을 통해 특정 브랜치의 내용을 업데이트하거나, Tag를 Push하는 작업을 할 수 있다.
- 원격 저장소에 같은 이름의 브랜치가 있으면, 해당 브랜치를 변경한다.
(서로 이름은 같은데 내역이 다르면 Push가 거부된다.)
- 원격 저장소에 같은 이름의 브랜치가 없으면 새 브랜치를 원격 저장소에 생성한다.
* --all 옵션
- 로컬브랜치이름 대신, "--all" 옵션을 명시하여 모든 브랜치를 Push할 수 있다.
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~
$ mkdir git_tutorial
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~
$ cd git_tutorial
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/git_tutorial
$ git init
Initialized empty Git repository in C:/Users/?대퀝??git_tutorial/.git/
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/git_tutorial (master)
$ git remote add origin https://github.com/ByeongHeonLee/Introduction-to-Git-GitHub.git
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/git_tutorial (master)
$ git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/git_tutorial (master)
$ git remote -v
origin https://github.com/ByeongHeonLee/Introduction-to-Git-GitHub.git (fetch)
origin https://github.com/ByeongHeonLee/Introduction-to-Git-GitHub.git (push)
AzureAD+이병헌@DESKTOP-SF8BMTT MINGW64 ~/git_tutorial (master)
$ git push origin --all
Everything up-to-date
- git push 명령을 실행하면 GitHub Log-In 창이 나타나고, 로그인을 해야 이후 과정이 진행된다.
5.4 git fetch와 git pull: 원격 저장소와 로컬 저장소의 간격 메꾸기
* git fetch 명령어 형식
git fetch
- 원격 저장소의 Commit들을 로컬 저장소로 불러온다.
- 불러온 Commit들을 자신이 여태까지 로컬 저장소에서 한 작업과 적절히 병합하여 원격 저장소에 제출(Push)한다.
* git pull 명령어 형식
git pull 원격저장소별칭 로컬브랜치이름
- 원격 저장소의 Commit들을 로컬 저장소에 가져옴과 동시에 로컬 브랜치에 병합까지 수행한다.
- 즉, fetch + merge = pull 이다.
- 병합시에, 어느 파일이 얼마나 바뀌고, Conflict의 발생 여부 등과 같이 간단한 정보는 표시되지만,
프로젝트의 세세한 변경사항까지는 파악할 수 없게 되므로 pull은 권장되지 않는다.
- fetch를 이용하여 원격 저장소의 Commit을 불러온 후, 로컬 저장소에서 확인해가며 수동으로 Merge하는 것이 권장된다.
* GitHub 상에서의 Commit
Commit changes 항목의 옵션
Update 파일이름
- '파일이름'의 수정 내역을 남길 커밋 메시지를 입력한다.
- 커맨드 라인에서 커밋 메시지를 입력할 때의 첫 번째 행에 해당된다.
Add an optional extended description
- 자세한 설명을 남겨야 할 경우 추가로 커밋과 관련된 설명을 입력한다.
- 커맨드 라인에서 커밋 메시지를 입력할 때의 두 번째 이후 행에 들어가는 내용이다.
Commit directly to the master branch
- master 브랜치에 바로 커밋할 때 선택하는 옵션이다.
Create a new branch for this commit and start a pull request
- 풀 리퀘스트를 위한 새로운 브랜치를 생성할 때 선택하는 옵션이다.
* git diff
- 로컬 저장소의 브랜치와 원격 저장소의 브랜치 사이에 어떤 차이가 있는지를 출력한다.
- 이 명령을 통해 변경 사항을 정확하게 확인한 후, 병합을 실행할 수 있다.
- 혹은 Conflict를 해결할 때 용이하게 사용된다.
Reference: 만들면서 배우는 Git/GitHub 입문 (윤웅식 저, 한빛미디어, 2015)