이전의 git 기본 사용법 게시글에서 리포지토리 생성, git push 등을 알아봤는데, 이번에는 push한(깃허브에 업로드 한) 리포지토리를 다른 환경에서 그대로 가져와 사용하고, 양쪽의 데이터를 매 작업 때마다 연동하는 방법에 대해 정리 해보려 합니다.
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 파일을 만들도록 하겠습니다.
해당 사이트로 이동하여 생성 란에 아래와 같이 입력합니다. 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 등을 활용하여 오류 없이 연동이 가능하게 되었습니다.