일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Java
- numpy
- list
- hive
- django
- GIT
- math
- PostgreSQL
- Python
- Github
- array
- Google Spreadsheet
- c#
- PySpark
- gas
- Apache
- string
- 파이썬
- Tkinter
- google apps script
- dataframe
- Kotlin
- PANDAS
- SQL
- Excel
- Redshift
- matplotlib
- Mac
- Google Excel
- Today
- Total
달나라 노트
10. 하나의 원격 저장소, 여러 개의 로컬 저장소 (git pull, git push) 본문
하나의 원격 저장소, 여러 개의 로컬 저장소
이번에는 하나의 원격 저장소를 중심으로 두 개 이상의 로컬 저장소가 어떻게 서로의 업데이트를 공유하는지 알아봅시다.
push & pull
1. git clone https://github.com/~~/~~.git git_home
git clone https://github.com/~~/~~.git git_office
일단 동일한 robin이라는 프로젝트를 기준으로 home 컴퓨터와 office 컴퓨터 각각에 프로젝트 clone을 합니다.
2. cd git_home
일단 집에서 먼저 작업한다고 가정해봅시다.
3. vim f1.txt
f1.txt 파일을 수정합니다.
4. git cocmmit -am '2'
2라는 commit message와 함께 수정사항을 commit합니다.
(git commit -am에서 -am은 add, message를 의미합니다. 즉, 수정한 파일을 즉시 add하며 commit message를 '2'로 한다는 뜻이죠. -am 명령어를 사용하면 git add를 한 후 message를 입력하는 과정을 하나의 command로 commit을 할 수 있다는 장점이 있습니다.)
5. git commit --amend
commit message를 수정하고싶다면 위 명령어를 이용하면 됩니다.
amend를 이용하여 이전에 사용했던 commit message를 바꿀 수 있습니다.
만약 commit에 포함시켜야될 내용을 누락시켰다면 파일을 add한 후 이 명령어를 입력하여 commit message를 변경합니다.
6. git push
push를 합니다. 그리고 git hub로 가보면 내가 했던 commit이 추가되었을 것입니다.
1. git pull
자 이제 회사로 왔다고 합니다.
집에서 git hub에 push를 하였고 git hub에 있는 코드에 변동이 있었습니다.
이 경우 회사의 디렉토리인 git_office로 가서 git pull 명령어를 통해 원격 저장소의 내용을 로컬 저장소로 가져옵니다.
2. git log
위 명령어를 이용해 commit history를 보면 내가 집에서 commit한 내용이 보입니다.
3. vim f1.txt
그리고 회사에서 f1.txt파일을 또 수정합니다.
4. git commit -am '4'
그리고 이 수정사하아을 commit message 4와 함께 commit을 합니다.
5. git push
또한 이 commit을 git hub에 push합니다.
그리고 다시 집에 와서 git pull한 후 작업하고 commit하고 push하고,
다시 회사로 가서 git pull한 후 작업하고 commit하고 push하고,.. 이러한 과정이 반복되며 일을 해나갑니다.
이렇게 여러 개의 로컬 저장소가 하나의 원격 저장소를 중심으로 작동합니다.
이렇게되면 가장 중요한 효과는 코드의 백업이 가능해진다는 것입니다.
git은 소스코드와 수정 내역(버전 정보)을 모두 원격 저장소에 백업하기 때문에 안정적입니다.
push, pull의 과정에는 두 가지 중요한 사항이 있습니다.
1. 작업 전에는 git pull을 하여 나 또는 다른 사람의 수정 사항을 최신으로 나의 로컬 저장소에 업데이트 해야합니다. 그리고 작업이 다 끝나면 git push를 이용하여 나의 작업을 git hub에 업데이트해줘야합니다.
2. git push 이후에는 별도의 수정을 거치면 좋지 않습니다.
git push는 이미 나의 작업을 git hub로 올렸다는 뜻이며 이보다 더 나중에 로컬 저장소의 code에 수정을 일으킨다면 git hub의 내용과 로컬 저장소의 내용은 달라져있을 것입니다.
수정이 필요하면 수정 후 다시 push해줘야 합니다.
git hub를 이용하여 작업을 하다보면 git hub의 상태와 현재 로컬 저장소의 코드 버전 충돌이 발생하여 git push에 에러가 발생할 수도 있습니다.
이럴 때 만약 충돌에 상관없이 현재 나의 로컬 디렉토리의 내용을 git hub로 밀어넣고 싶으면 다음과 같은 명령어를 사용합니다.
git push --force
위 명령어는 강제 push 기능을 가지고 있으며 현재 로컬 디렉토리 기준으로 commit 된 내용을 github로 강제 push합니다.
추가로 git push, git pull에는 어떤 저장소를 target으로 push/pull을 할지 설정할 수 있습니다.
github를 이용하다보면 다음과 같은 경우가 있을 수 있습니다.
1. Repository_A는 여러 사람이 사용하는 Repository임.
2. Repository_A를 fork하여 내 Repository에 Repository_B 생성
3. 나는 코드 commit/push를 Repository_B에서 진행.
4. Repository_B의 수정사항을 Repository_A에다가 merge 해야 함.
5. merge할 때 Repository_B에는 [Repository_A의 최신 data + Repository_B에서의 내 수정작업]이 모두 반영되어있어야 함.
한번 위 과정을 생각해봅시다.
특히 5번을 보면 내 수정작업이야 당연히 Repository_B에서 commit/push했을테니 가장 최신상태를 유지하겠지만
문제는 Repository_A에 update되고있는 다른 사람들의 수정사항을 Repository_B에도 반영해야합니다.
이것을 어떻게 진행하는지 아래 내용을 봅시다.
위 이미지의 파란 화살표로 표시된 과정처럼
Repository_A(Remote)에서 다른 모든 사람의 update들을 Repository_B(Local)로 pull 해온 후
Repository_B(Local)에서 Repository_B(Remote)에 나의 수정사항을 Commit & Push 하고나서
Repository_B(Remote)를 Repository_A(Remote)에 Merge 해야합니다.
(Fork는 맨 처음에 한 번만 진행하면 됩니다.)
이렇게 merge를 할 땐 보통 Repository_B(Remote)와 Repository_A(Remote)간에 충돌되는 수정사항은 없는지 검사 후,
충돌되는 사항이 있다면 merge error를 발생시키고,
그렇지 않다면 나의 수정사항이 최신 Repository_A(Remote)에 병합됩니다.
이렇게하다보면 분명히 동일한 Repository를 다루고있지만,(Repository_B는 Repository_A로부터 forked되어 복사되었기 때문)
이 두 개의 Repository는 각각 공용과 나의 개인 Repository로 나뉩니다.
이럴 때 pull을 한다고하면 위 그림에서처럼 Repository_A(Remote)에서 Repository_B(Local)로 pull을 해야 하며,
push는 Repository_B(Local)에서 Repository_B(Remote)로 해야합니다.
(remote란 github online repository를 의미합니다. Local은 내 컴퓨터에 있는 Repository이구요.)
git pull prod master
git push origin master
이때 위처럼 pull/push 명령어 뒤에 저장소 이름과 branch 이름을 명시하여 pull/push의 대상을 변경할 수 있습니다.
prod는 Repository_B(Local)에서 remote Repository_A(Remote)를 바라보도록 연결한 저장소 이름으로써
Terminal에서 Repository_B(Local) 경로로 맞춘 후 git pull prod master 를 입력하면 Repository_A(Remote)의 현 상태를 Repository_B(Local)로 pull하게 됩니다.
master는 기본으로 설정되는 branch의 이름입니다.
git push origin master는 Repository_B(Remote)를 Repository_B(Local)로 만들 때 자동으로 origin이란 이름이 붙고, master도 자동으로 붙은 기본 branch 이름입니다.
따라서 push의 대상이 Repository_B(Remote)라는 뜻이죠.
tip.
Pycharm에는 Manage Remotes라는 메뉴가 있는데 여기서 github의 ssh url을 이용하여 Repository_B에 Repository_A를 prod라는 이름으로 연결시켜주는 기능을 제공합니다.
'Github' 카테고리의 다른 글
12. Branch (0) | 2021.01.15 |
---|---|
11. SSH key (github, git clone, git ssh key, ssh key gen) (0) | 2021.01.15 |
9. GIT HUB 원격 저장소 만들기 (0) | 2021.01.15 |
8. GIT HUB 알아보기 (0) | 2021.01.15 |
7. help 키워드로 명령어들에 대한 상세 설명 보기 (0) | 2021.01.15 |