[git] github(깃허브) 기본사용법 (2) - clone, pull, gitignore
git

[git] github(깃허브) 기본사용법 (2) - clone, pull, gitignore

 

이전의 git 기본 사용법 게시글에서 리포지토리 생성, git push 등을 알아봤는데, 이번에는 push한(깃허브에 업로드 한) 리포지토리를 다른 환경에서 그대로 가져와 사용하고, 양쪽의 데이터를 매 작업 때마다 연동하는 방법에 대해 정리 해보려 합니다.

 

 

[git] github(깃허브) 기본 사용법

개발 공부에 필수불가결한 요소는 바로 깃허브일 것이다. 개발자 채용 공고 요건에 깃허브 주소를 기입하는 것을 필수로 여길 정도니 말이다. 깃을 왜 사용하는지, 깃을 처음 사용한다면 알아야

muten.tistory.com

 

 

1. git clone

clone의 사전적 의미는 '복제하다'. 즉, 깃 리포지토리를 복제하는 기능을 합니다.
해당 기능을 통해 생성한 리포지토리를 그대로 다른 장소에 복제(연동) 해보겠습니다.

생성했던 깃 저장소의 리포지토리에서 초록색 네모, [Code]를 클릭하면 [Clone] 옵션 창이 뜨는데
여기서 빨간 네모칸을 누르면 해당 깃 저장소의 주소가 복사 되며,

 

git clone "repository url"

터미널(git bash)에서 원하는 폴더로 이동해 위 명령어를 실행하면 리포지토리를 복제할 수 있습니다.

지난 번에 'test-rep'라는 이름으로 리포지토리를 만들었기 때문에 동일한 이름으로 폴더가 생성되고, 해당  폴더에 .git이라는 폴더도 함께 만들어진 것을 볼 수 있습니다.
.git 폴더가 생성 되었다는 것은? 해당 폴더 역시 깃허브와 연동할 준비가 되었다는 뜻입니다.
README.md, main.py 등 리포지토리의 모든 파일들이 복제된 것을 확인할 수 있습니다.

 

 

2. git을 통한 소스 코드 관리

지금은 동일 환경(macOS)에서 해당 내용을 구현하고 있기 때문에 조금 덜 와닿겠지만
외부 공간에서는 윈도우를 사용하면서 개인 스터디용으로는 맥을 사용한다던지,
회사에서는 리눅스를 사용하는데 집에서는 윈도우를 사용하는 등 다양한 상황이 존재할 것입니다.
그런 상황에 놓여있다고 가정하고 해당 내용을 진행해보겠습니다.

 

1) git pull origin master

git은 자신이 관리하는 작업 공간의 각 폴더들을 마스터 브랜치(깃허브의 주소 안에 반영 되어 있는 현재 상태)와 늘 동일하게 두어야 한다는 강박을 가진 친구입니다. 2개 이상의 공간에서 리포지토리를 연동하여 사용한다면 꼭 습관화시켜야 하는 과정은 아래와 같습니다.

# 새로운 환경에서 git을 가져옴
git clone "url"

# 새로운 환경에서 git 폴더 내의 데이터를 수정했다면
# 데이터를 밀어넣는 과정, push
git add .
git commit -m "commit message"
git push origin master

# 기존 환경에서 새로운 환경의 데이터를 즉시 연동
# 데이터를 당겨오는 과정, pull
git pull origin master

처음에 깃을 만든 공간을 '제1저장소'라고 칭하고, 이를 다른 환경에 가져온 공간을 '제2저장소'라고 칭해보겠습니다. 저장되는 깃허브 공간은 '마스터'라고 하겠습니다.

제1저장소에서 만든 깃 리포지토리의 데이터를 푸시 한 상태에서, 제2저장소를 클론하여 생성하고 소스 코드를 수정했다면
반드시 해당 내용을 add, commit, push 해줘야만 합니다. 그렇지 않다면 해당 내용은 merge 과정에 들어가게 되는데, 충돌이 나면서 제대로 된 수정이 되지 않는 경우가 다반사이기 때문입니다.

 

[ 제1저장소: commit & push ]

[ 마스터 / up-to-date ]

[ 제2저장소: pull / up-to-date ]

[ 제2저장소: 코드 수정 ] [ 마스터&제1저장소: out-of-date ]

[제2저장소: commit & push]

[ 마스터 / up-to-date ]

 


모든 저장소의 commit&push, pull을 습관화하여 최신의 상태(up-to-date)로 만드는 것이 핵심이라고 보면 되겠습니다.

 

2) 만약, commit&push&pull 과정이 이뤄지지 않았다면 

위에서 언급한 merge 상태(양쪽의 데이터를 push&pull 하지 않고 따로 수정한 경우)를 고의적으로 발생 시켜 보겠습니다.

서로 경로가 다르지만 같은 깃 리포지토리를 참조하는 동일 파일
"~/Documents/test/main.py"와"~/Documents/test-rep/main.py"를 서로 다른 내용으로 수정하고 pull을 하지 않은 채 다른 폴더에서 push를 시도하려 하면

 

충돌이 났다는 에러 메시지가 발생합니다. 팀 프로젝트 진행 시 어쩔 수 없이 같은 파일을 동시에 수정하는 경우가 있는데, 다양한 방법으로 충돌을 피할 수 있지만 완벽히 피하기가 쉽지 않기도 합니다. 상황에 따라 merge를 수행할 수도 있고, commit한 내용을 rollback 하는 방법 등을 취할 수도 있겠지만 가급적 충돌이 발생하지 않도록 잘 관리하는 것이 중요할 것입니다.

 

3. .gitignore

마지막으로, 두 공간에서 무사히 리포지토리를 연동하고 사용하게 됐으나 환경 설정 파일 등으로 인해 프로젝트가 오동작 한다거나 하는 일이 생길 수 있습니다. 이를 방지하기 위해 .gitignore라는 파일을 만들어야 합니다.

 

.gitignore란 프로젝트에 원하지 않는 백업 파일이나 환경 설정 파일, 개인 정보(암호화된 Key 등)를 올리지 않도록 하기 위해 특정 폴더나 파일을 제외시킬 수 있는 설정 파일입니다.

 

매 프로젝트마다 반영되는 파일들이 다른 부분들이 있을테니, 공통적으로 수행할 수 있는 .gitignore 파일을 만들도록 하겠습니다.

 

 

gitignore.io

Create useful .gitignore files for your project

www.toptal.com

 

해당 사이트로 이동하여 생성 란에 아래와 같이 입력합니다. PyCharm이 아닌 다른 IDE를 사용할 경우 다른 입력값을 삽입하면 됩니다.

 

[생성]을 누르면 아래와 같은 길디 긴 코드가 나타납니다.

# Created by https://www.toptal.com/developers/gitignore/api/macos,windows,linux,pycharm
# Edit at https://www.toptal.com/developers/gitignore?templates=macos,windows,linux,pycharm

### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride

### PyCharm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf


~ 중략 ~


# End of https://www.toptal.com/developers/gitignore/api/macos,windows,linux,pycharm

 

gitignore.io에서 생성된 전체 문구를 복사하여 PyCharm 프로젝트에 .gitignore 라는 파일명을 생성하여 붙여넣기 합니다.

그리고 .idea/ 폴더가 프로젝트에선 보이지 않지만,

위와 같이 존재함을 알 수 있고, 이 폴더 내에는 각 운영체제에 따른 환경 설정 파일이 들어있습니다. 해당 폴더가 깃 리포지토리에 올라가서 서로 다른 운영체제에 영향을 미치려 하면 오류가 발생하므로 위와 같이 .gitignore 맨 윗 줄에 ".idea/"를 작성하여 깃이 해당 폴더를 무시하도록 합니다.

 

해당 파일을 커밋합니다.

git add .gitignore
git commit -m "add .gitignore"
git push origin master

 

이제 .gitignore가 git에 영향을 주도록 설정되어 commit, push, pull 등을 활용하여 오류 없이 연동이 가능하게 되었습니다.