-
[git] GithubGit 2021. 8. 13. 15:08
1. github란
'git 원격 저장소'를 제공 해주는 서비스입니다. git 원격 저장소를 지원해주는 서비스는 github, gitlab, wiki 등이 있습니다.
필요한 이유
- 팀 개발 시 다른 사람과 작업 내용을 공유하여 '협업' 할 때 유용합니다. ex) fork, pr, merge etc
- 개인 프로젝트시 '백업용'으로 유용합니다.
- 소스코드 '공개용'으로 유용합니다.
2. 원격 저장소 명령어
1) git remote
원격 저장소 관련 명령어입니다.
$ git remote add remote_alias remote_url github 원격 저장소 url의 '별칭'을 지정합니다. 이떄, remote_url은 .git 끝까지 복사하고, https로 연결된 링크를 가져오는 것이 좋습니다. $ git remote show remote_alias 원격 저장소 상세정보 확인 git remote rename old_name new_name 원격 저장소 alias 변경 $ git remote set-url remote_alias new_remote_url 원격 저장소 url 변경 $ git remote -v 원격 저장소 목록 확인 2) git push
$ git push remote_alias remote_branch_name
원격 저장소의 지정한 브랜체에 내가 작업한 내용을 밀어 넣는 명령어입니다.
- $ git push origin master # origin이라는 remote에 로컬 마스터 브랜치에 있는 커밋들을 원격 저장소 마스터 브랜치에 밀어 넣습니다. 주의할 점은 항상 push 하기 전에 pull 작업을 통해 remote 서버와의 동기화를 맞춰줘야합니다. 물론 상황에 따라 stash 작업을 추가로 할 수 있습니다.
※ github 저장소 생성 및 push example
- $ github site repo 생성
- $ git remote add origin repo_url
- $ git add . / $ git commit 반복
- $ git push origin master # 원격 저장소에 master 커밋 내역들 push합니다.
3) git fork & clone
이미 존재하는 원격 저장소에 있는 내역을 가져오는 명령어입니다.
git fork
다른 사람의 github repo에서 어떤 부분을 수정하거나 추가 기능을 넣고 싶을 때 해당 repository를 자신의 github repository로 그대로 복제하는 기능입니다. 이때 fork한 repository는 원본 repo(다른 사람의 github repo)와 연결되어 있습니다. 즉, original repo에 어떤 변화가 생기면(ex- new push) 그대로 fork된 repo에게도 반영됩니다. 이때 fetch나 rebase의 과정이 필요할 수 있습니다.
original repo에 변경 사항을 적용하고 싶다면 해당 저장소에 'pull & request'를 해야합니다. pull & request가 original repo의 관리자로부터 승인 되었으면 자신의 commit 내역이 original repo에 반영됩니다.
즉, repo에 권한이 없는 사용자가 저장소를 fork하고 fork한 자신의 저장소에 변경 사항을 적용한 후 push합니다. 이후 original repo에 내 저장소에 있는 브랜치를 pull & request 합니다. 관리자가 승인하면 해당 저장소에 merge 됩니다.
git clone
$ git clone remote_url
특정 원격 repo를 내 local machine에 복사하여 새로운 저장소를 만듭니다. 이때 권한이 없는 사용자는 원격 repo에 push 하지 못합니다. 이는 소규모 팀에서 적합합니다.
다른 사람들과 함께 하나의 원격 repo에서 작업한다고 가정해봅시다. 다른 사람이 먼저 push 후 origin/master에 변경 사항을 적용 한다면 해당 변경 사항을 내 로컬에서도 적용하기 위해서는 다른사람이 수정한 커밋을 fetch하고 merge 해야합니다. 이는 pull 작업과 동일합니다.
※ 기존 파일이 있고, 거기서 파일을 가져오는 git clone example
- $ git clone https://github.com/moyoungmin/git-study.git
- $ cd git-study [git-study가 git 작업 디렉토리]
4) git fetch & pull
원격 저장소 변경내용을 가져오는 명령어입니다.
git fetch 원격 저장소에 추가된 object들을 받아와서 로컬에 저장합니다. 로컬 마스터, 리모트 마스터를 병합하지않고 받아오기만 수행합니다. 합치고 싶다면 FETCH_HEAD와[fetch하면서 생성된 브랜치] MASTER를 merge해야 합니다.
$ git fetch remote_name remote_branch
$ git fetch origin mastergit pull fetch + merge입니다. 원격 저장소에 추가된 object들을 로컬로 받아오면서 merge까지 수행합니다.
$ git pull remote_name remote_branch
$ git pull origin master # 로컬 마스터 브랜치와 리모트 마스터 브랜치를 merge합니다.※ Your local changes to the following files would be overwritten by merge
remote repo에서 소스를 가져올 때 위와 같은 에러 메시지를 볼 수 있습니다. ex) pull 받을 파일 중 자신이 로컬에서 수정한 파일이 동일하게 존재하기 때문입니다. 예를 들어, 자신이 수정한 파일이 다른 사람이 원격 저장소에 push 한 파일과 동일한 경우 해당 파일에서 충돌이 일어납니다.
해결법
- $ git stash # 현재 staging 영역에 있는 파일의 변경 사항을 스택에 넣습니다. 즉, 로컬에서 변경한 파일을 임시로 백업합니다.
- $ git pull origin master # 원격 저장소에서 내 로컬 브랜치로 변경사항을 적용합니다. 로컬에는 원격 저장소에 있는 내용으로 변경됩니다.
- $ git stash pop # 백업한 내용을 꺼내, 파일을 합칩니다.
로컬에서 다른 브랜치에서 동일 파일을 작업할 때 위와 비슷하게 문제가 발생하지만 pull하는 과정에서 발생한 문제는 'stash' 작업을 추가로 필요로합니다.
5) git pull & request
다른 사람의 original repo에 push 할 수 있도록 도와주는 기능입니다. 즉, 해당 repo에 merge 하기 전에 코드 리뷰를 받고 관리자 승인하에 merge할 수 있도록 도와주는 기능입니다.
프로젝트 내에서 branch를 따거나 fork한 프로젝트에서 branch를 따서 개발한 기능을 원래 저장소에 merge 시켜달라고 요청할 때 사용합니다. 원래 저장소 관리자가 요청자의 commit에 대한 comment를 통해 리뷰하거나 혹은 reject할 수 있습니다.
pull & request example
1. 자신의 원격 저장소에 추가할 상대의 원격 저장소를 fork합니다. 이로써 자신의 repo에 fork된 항목이 보입니다.
fork - 1 2. $ git clone url # fork해서 만들어진 자신의 repo url에서 clone합니다.
3. $ git checkout -b branch_name # pull-request 작업을 수행할 branch를 생성합니다.
4. $ git add . / $ git commit 반복
5. $ git push origin branch_name # pull-request 작업을 위한 branch에 push합니다.
6. $ fork한 저장소에서 pull-request를 요청합니다.
7. PR을 받은 원본 저장소 관리자는 변경된 내역을 확인 후 merge 여부를 결정합니다.
8. $ git checkout master
9. $ git merge branch_name
10. $ git pull origin(별칭) master # 원본 저장소에 merge가 완료되면 로컬에서 코드 동기화가 필요합니다.
3. 마무리
1) 요약
로컬에서 쓰이는 명령어
- git init : 저장소 생성 [.git directory 생성]
- git status, git log : repo 상태 보기
- git diff, git add, git commit : 커밋 관련
- git branch, git merge : 브랜치 관련 명령어
원격 저장소에 쓰이는 명령어
- git remote : 원격 저장소 등록
- git push, git fetch, git pull : 원격 저장소와 작업
- git clone : 원격 저장소 받아오기
2) gitignore tip
.gitignore : git에 포함 안 시킬 파일들을 정하여 push할 때 해당 파일을 무시해줍니다. [유출되서는 안될 주요 정보(키 값들), 불 필요 정보 (설정 파일들)]
sampe site : https://www.gitignore.io/
만약 .gitignore 파일을 잘못 포함시켰다면 아래의 명령어들을 수행합니다. cached를 붙이면 local에 있는 파일과 폴더들은 그대로 놔두고 원격 저장소에 있는 것들만 지우게 됩니다.
$ git rm --cached some-directory
$ git commit -m "remove ignored directory'
$ git push origin master
3) non-fast forward push 거부 문제 tip
- 기존 remote branch에 새로운 커밋이 추가된 경우
- git push-f 옵션으로 강제로 remote branch가 변경된 경우 등
non fast forward push 거부 문제 예시 이렇게 remote branch가 변경된 경우 non-fast forward push 거부 문제가 발생할 수 있습니다. 이를 fetch + rebase + push혹은 pull + push방식으로 문제를 해결할 수 있습니다.
- 원격 repo에 push하기 전에 pull을 받습니다. 이때 stash를 활용합니다.
- 이후 3-way merge or rebase 작업을 수행합니다.
Git Transport Commands 'Git' 카테고리의 다른 글
[git] 실제 프로젝트에 적용하는데 필요한 tip (0) 2021.08.20 [git] workflow (0) 2021.08.20 [git] Command (0) 2021.08.12 [git] Introduce (0) 2021.08.11