Forks And Clones

Forks란?

  Open source projects에 참여하고 싶은가? 그렇다면 forks에 대해서 알아야 합니다. fork란 다른 원격 저장소에 있는 히스토리를 그대로 나의 github 원격 저장소에 복사하는 것을 말합니다. 다른 사람의 프로젝트에 바로 push를 할 수 없기 때문에 일단 나만의 프로젝트 버전을 관리하기 위해 다른 사람의 원격 저장소에서 프로젝트를 가져옵니다. 그런다음에 내가 contributing을 원래 원격 저장소로 요청을 합니다. 한마디로 외부 프로젝트를 진행할때 나만의 버전을 관리하기 위해서 fork를 해서 외부 프로젝트에 반영한다고 생각하시면 됩니다. fork를 했다면 나의 github에 있는 저장소에서 로컬로 clone을 합니다. 그럼이제 프로젝트 세팅 끝




외부 프로젝트, 나만의 원격 저장소에 복사하기

https://github.com/solidpple/patchwork 에 접속하셔서 오른쪽 상단에 있는 fork를 누르면 잠시후에 나의 github 저장소에 해당 프로젝트가 복사되는 것을 확인할 수 있습니다. 이 작업을 하기 전에 github에 로그인이 되어 있는 상태여야 합니다. 

원격 저장소에서 로컬 저장소로 가져오기

fork를 했다면 로컬에 있는 저장소로 해당 프로젝트를 가져온 뒤에 작업을 하시면 됩니다. 작업을 하기 위해 프로젝트를 clone할 위치로 이동을 한 뒤에

$ git clone 
$ cd patchwork

clone을 하고 나면 patchwork로 들어가면 프로젝트가 생성된 것을 확인할 수 있습니다. 이제 github의 저장소에 자동으로 연결이된 상태이고, 수정을 한 뒤에 앞서 배운 add, commit, push를 통해 반영을 하시면 됩니다.

기존 원격 저장소 연결하기

기존에 fork한 프로젝트의 변경되는 과정도 확인을 해야 하기 때문에, pull이 가능하도록 해아합니다. 그렇기 때문에 기존 fork한 원격 저장소도 추가를 합니다. https://github.com/jlord/patchwork 아래 git remote의 -v 옵션을 사용해 현재 연결되어 있는 git저장소를 확인 하실 수 있습니다. upstream은 remotename으로 종종 사용자들이 'upstream'으로 사용하기 때문에 사용했습니다. 이제는 pull을 하면 원래 저장소의 변경된 사항도 반영이 됩니다. 반영된 결과를 나의 수정 사항과 함께 나만의 원격 저장소에 반영을 하면 됩니다. 

$ git remote add upstream https://github.com/jlord/patchwork.git
$ git remote -v


[참고] http://jlord.us/git-it/challenges/forks_and_clones.html

  1. kbj0109 2018.01.28 20:07

    좋은 글 잘 봤습니다. 그런데 마지막의 upstream에관한 것을 보고 확인차 질문 드립니다.
    그럼 하나의 Local Branch가 하나 이상의 Remote Repository와 연결이 가능한건가요?
    그리고 가능하다면, Fork를 실행한 오리지널 Remote Repository (A)와 연결을 한 상태에서는 Pull을 하면,
    Fork로 생성한 새로운 저만의 Remote Remote Repository (B) 와 연동되어 A와 B의 변경사항이 제 Local Repository에 같이 적용 되는건가요?
    그러면 Push를 할 떄는 B인 제 Remote로만 반영이 되고, Pull을 할 떄는 A와 B로부터 둘 다 영향을 받는 건가요?

    • M_Falcon 2021.05.20 14:45 신고

      Local Repository - Remote Repository 가 다수연결이 가능한것이지, branch - repository 는 단위가 맞지 않습니다.

      (A) Original Repository // upstream
      ---fork
      (B) Forked Repository // origin
      ---clone
      (C) Local Repository // my local computer

      (C)는 (B)로부터 온 것이기 때문에 (C)에서 작업한 pull/push 명령은 (B)에만 반영되고
      다만,
      (A)에 반영된 내용을 (C)로 pull 하고싶을 땐 git pull upstream [branch_name] 해야합니다.

Remote Control

로컬(local)의 저장소(repository)를 원격(remote)저장소에 연결하고, 로컬 저장소에 변경된 내용을 원격 저장소에 반영(push)하는 방법에 대해서 설명을 하겠습니다.

원격(Remote)?

  로컬에서 혼자 커밋하면서 사용하면, 내 피시에만 나의 커밋(commit) 기록이 남습니다. 원격저장소에 로컬에 있는 프로젝트를 반영하기 위해 push를 합니다. push를 함으로써 원격저장소와 로컬저장소에 저장되어 있는 코드 및 기록이 일치(sync)가 됩니다. 이제 함께 프로젝트하는 사람들은 나의 프로젝트를 pulling(가져가기)하면, 프로젝트를 함께하는 모두에게 나의 로컬에 있는 프로젝트를 복사해서 자신의 프로젝트로 옮길 필요가 없습니다.

Create a remote repository

  • github.com를 접속해서 로그인을 합니다. 로그인을 하신후에 오른쪽 위에 + 버튼을 눌러서 새로운 저장소(Repository)를 생성합니다
  • 로컬에 있는 저장소와 이름을 동일하게 하고, 짧은 설명을 작성합니다.
  • 공개 범위는 public과 private이 있는데, public으로 하겠습니다. (나의 코드를 나만 볼것(private)이냐, 모두가 함께 공유할 것(public)이냐에 대한 설정)
  • README를 작성
  • gitignore, license는 'none'을 선택하시면 됩니다.(기본값)
  • 저장소를 생성합니다.

Readmes, .gitignores and licenses

  README, .gitignores, licenses파일은 open source projects에는 있어야 하는 파일입니다. 뭐 꼭 있어야 하는건 아닌데... contributor가 어떻게 해야하는지 가이드는 줘야하니까... 어지간하면 작성을 합니다. README는 프로젝트가 어떤 프로젝트인지, 어떻게 사용하는지, 어떻게 contribution을 하는지에 대해서 설명합니다. gitignore는 git이 nottrack을 해야하는 file의 리스트입니다. (패스워드가 있는 파일을 공유한다면...) license 파일은 나의 프로젝트에서 사용하는 라이센스 타입 리스트를 작성하는 파일입니다.
[참고] http://choosealicense.com/

생성한 저장소에 로컬을 연결하기

Github에 원격저장소를 만들었으면, 저장소의 주소를 로컬저장소에 http 또는 ssh를 통해 등록을 합니다.( 최초 생성한 프로젝트의 경로로 가서,

$ git remote add origin http://a/b/repo.git

을 하시면 로컬에 있는 repository라 remote가 어디인지 이제 알게 됩니다. 여기서 origin은 github's의 서버에 있는 이름이 됩니다.


Work를 Remote로 Push 하기

push를 통해 local에 있는 repository를 server로 전송이 가능합니다.

$ git push origin master

여기서 origin은 이전 단계에서 remote add origin으로 추가한 origin을 나타내고, master는 branch이름이고, 기본적으로 생성되는 branch 입니다.

Tips

Add remote connections
$ git remote add 

Set a URL to a remote
$ git remote set-url 

Pull in changes
$ git pull 

View remote connections
$ git remote -v Push changes $ git push

[참고] http://jlord.us/git-it/challenges/remote_control.html

Github 시작하기 및 ssh-key 등록하는 방법

들어가며

  Git은 코드 버전 관리를 해주는데 중요한 Software라고 할 수 있습니다. 우리가 흔히 학생때 조별 과제를 하게 되면 작은 프로젝트를 자주 진행하게 됩니다. 그 때 바로 등장한 멍청하지만 어떻게 보면 작은 프로젝트에 현명한... 방법중에 하나인 hand-merge 그냥 손머지죠. 이렇게 해왔는데, 프로젝트의 규모가 커지고, 기간이 길어지다 보면 자연스럽게 손머지는 한계에 부딪히게 됩니다. 저는 git을 코드관리도 중요하지만 공유하고 협업이라는 모두가 함께 만들어가는 opensource의 중요성에 대해서 더 중요하게 생각합니다. 소프트웨어 개발자라면 github 아이디 하나 정도는 갖고 있어야 하겠죠. 요즘에는 오픈소스 활동이나 stackoverflow 활동도 중요하기 때문에 없으면 가입을 합시다. 이번 포스팅은 Github 아이디에 SSH Key를 등록하는 방법에 대해서 설명해 드리겠습니다.   

1. ssh-key 생성하기 및 ssh-agent에 추가

  생성하기 전에 기존에 사용하시던 ssh-key가 있는 경우에는 바로 등록을 하시면 됩니다. 만약 없으시다면 생성하는 방법을 따라하시면 됩니다. 터미널에서 아래와 같은 명령어를 입력하고, 결과가 없다면 ssh key를 생성하셔야합니다. ssh-keygen을 하는 과정에서 중간에 나오는 질문에는 엔터로 넘기면 됩니다. (패스워드 설정 등등)

# ssh-key가 있는지 확인
ls -al ~/.ssh
# ssh-key 생성
ssh-keygen -t rss -b 4096 -C "your_email@example.com"

의 결과로 public/private rss key pair가 생성되고, ssh-agent에 추가를 해야 합니다.  ssh-agent를 백그라운드에서 시작한 후에 추가를 합니다.

eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa

를 하시면 ssh-key 생성 및 ssh-agent에 추가가 완료 됩니다.


2. ssh-key 등록하기

  이제 생성된 ssh-key를 나의 github account에 추가하시면 됩니다. [Github 바로가기]

  사이트에서 로그인을 하게 되면 오른쪽위에 자신을 클릭하면 아래오 같은 화면에 보입니다. [Settings] --> [SSH and GPG keys] --> [New SSH key]를 클릭합니다. 그럼 아래와 같은 화면이 출력이 됩니다. 

클립 보드에 ~/.ssh/id_rsa.pub의 내용을 복사합니다. 아래 방법 중에 아무거나 사용하셔도 됩니다.  (만약 pbcopy가 없으면 ~/.ssh/id_rsa.pub의 경로에서 텍스트 에디터(vi)를 실행한 후에 복사 붙여넣기 하시면 됩니다.)

bcopy < ~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa.pub
vi ~/.ssh/id_rsa.pub

마지막으로 Add SSH key를 누르면 아래와 같은 화면이 나오면서 완료가 됩니다. 

여기까지 하시면 ssh key가 등록 되었습니다. 

[참고] https://help.github.com/articles/adding-a-new-ssh-key-to-your-github-account/

+ Recent posts