GitHub repository 생성, clone, push/pull, conflict 해결

도토리·2023년 4월 6일
0

git & github

목록 보기
5/10

GitHub(≒ GitLab, Bitbucket)

  • 코드 공유 및 협업 서비스
  • git으로 관리되는 프로젝트를 온라인 공간에 공유해서 프로젝트 구성원들이 함께 소프트웨어를 만들어갈 수 있도록 도와주는 서비스
  • 모든 업로드, 다운로드를 커밋 단위로 주고받는다.
  • 내가 작업한 커밋을 공유 공간에 올리기 위해서는, 먼저 GitHub에서 최신 커밋을 다운받아서 해당 커밋을 내 프로젝트에 적용해야 한다(이게 강제됨). 최신 커밋으로 내 프로젝트를 업데이트하고 난 후에야, 내가 작업한 커밋을 공유 공간에 올릴 수 있다.

GitHub에 repository 생성하기

  1. 토큰 만들기
  • 이전에는 GitHub에 업로드, 다운로드할 때 아이디, 패스워드를 입력해야 했었는데, 지금은 그 방식이 중단되었고, 토큰으로 대체되었다.
  • 우측 상단 프로필 > 'Settings' > 'Developer settings' > 'Personal access tokens' > 'Tokens (classic)' > 'Generate new token' > 'Note'(token의 이름), 'Expiration'(token의 만료 기한), 'Select scopes'(어떤 권한까지 허용할 것인지) 필드 입력
    (나는 각각 my token2, 30 days, repo로 하였음)
  • 'Generate token' 클릭한 후에 비밀번호가 생성되는데, 이 비밀번호는 화면을 넘기고 난 후에는 다시는 볼 수 없다. 메모장 등에 복붙해놓자.
  1. 토큰을 내 컴퓨터에 저장하기
  • GitHub에 업로드, 다운로드할 때마다 토큰 전달하는 것은 매우 귀찮고 불편하다.
  • '자격 증명 관리자' 앱 > 'Windows 자격 증명' > '일반 자격 증명'에서 'git:https://github.com' 클릭 > '편집' (없다면 생성하고, 있다면 '편집' 클릭) > '사용자 이름', '암호'(방금 메모장에 적어놓은 것) 필드 입력
  1. 소스트리에 GitHub 계정 추가
  • 상단 '도구' > '옵션' > '인증' > 'github.com' 계정 생성하기
  1. GitHub에 repository 생성
    'Repository name', Public/Private 선택 > 'Create repository'

repository가 잘 생성되었다면 다음 화면이 나타날 것이다.

  • 프로젝트마다 repository를 가진다고 생각하면 된다.
  • 협업하려면?
    해당 repository에 들어간 후에 상단 'Settings'(이때, 우측 상단 프로필 > 'Settings' 아님) > 'Collaborators' > 'Add people' > 협업할 사람의 GitHub 아이디 또는 GitHub에 등록된 이메일 등 입력

내 프로젝트를 repository에 올리기

ⅰ. 'Quick setup - ...'에서 'HTTPS' 선택
ⅱ. 두 가지 옵션 '...or create a new repository ...', '...or push an existing repository ...' 중에서 후자 선택
(로컬에 git으로 관리되고 있는 프로젝트가 이미 존재하는 상태이므로)
ⅲ. vscode에 붙여넣기

24 commits를 통해, 프로젝트에 대한 커밋 히스토리를 볼 수 있다.

소스트리를 살펴보자. main, origin/main 브랜치가 존재함을 볼 수 있다.


내가 방금 vscode에 붙여넣은 명령어들을 살펴보자.

  • git remote add origin (원격 저장소 주소): 원격 저장소로의 연결 추가
    remote add: 원격 저장소(로의 연결)를 추가하겠다.
    origin: 원격 저장소의 이름. 임의로 변경 가능하지만, 기본 branch명이 main인 것처럼, 기본 원격 저장소 이름은 origin이다.

    소스트리를 보면, 위와 같이 '원격' > 'origin'을 볼 수 있음

  • git branch -M main: 기본 브랜치명을 main으로 바꿔준다.

git config --global init.defaultBranch main

위 명령어를 입력하기 전, 기본 브랜치명은 master
나는 이전에 위 명령어를 통해 기본 브랜치명을 main으로 변경하였다.
따라서 이 명령어는 의미가 없다(이미 기본 브랜치명이 main이니까).
<내 생각에는, git branch -M main 명령어는 원격의 기본 브랜치명을 main으로 바꿔주는 것, git config ~ 명령어는 로컬, 원격의 기본 브랜치명을 모두 main으로 바꿔주는 것>

  • git push -u origin main: 로컬의 커밋을 원격에 업로드
    push: 로컬에 있는 커밋 중 아직 원격 저장소에 없는 커밋을 업로드한다.
    -u origin main: 어떤 원격 저장소의 어떤 브랜치에 커밋을 업로드할 것인지를 기본으로 세팅한다.
    이후에 로컬의 main에서 push -> origin의 main에 커밋이 추가된다.
git remote

현재 프로젝트와 연결된 원격 저장소의 목록을 볼 수 있다.

git remote -v

위 명령어를 통해 좀 더 자세히 볼 수 있다.

참고) 원격 저장소와의 연결 끊기

git remote remove (origin 등 원격 이름)

GitHub repository가 삭제되는 것이 아니라, 로컬과 원격의 연결을 끊는 것이다.


repository에 있는 프로젝트를 다운로드받기(clone)

프로젝트를 다운받을 폴더를 만들고, 해당 폴더에서 우클릭 통해 git bash를 연다. 그리고 다음 명령어를 입력한다.

git clone (원격 저장소 주소)


Cloning이란, 원격 저장소에 있는 모든 것(*.git 포함)을 내 로컬 PC로 복사한다는 뜻이다.

참고) 'Code' > 'Download ZIP'으로 프로젝트 다운로드 받기
해당 프로젝트에는 *.git 폴더가 없다. 즉, 협업할 때 사용 x


push, pull

지금까지 한 것: 로컬, 원격 연결하기
지금할 것

  • 로컬에서 커밋을 하나 만들고, 이를 원격으로 push하기
  • 원격에만 있는 커밋을 로컬로 pull하기

로컬 -> 원격으로 커밋 보내기

  1. 로컬에서 커밋 하나를 생성했다.
    leopards.yaml의 members에 'Evie'를 추가하였다.

  2. 이 커밋을 원격 저장소에 push한다.

git push


참고) 이전에 'git push -u origin main' 명령어를 통해, origin 원격 저장소의 main 브랜치로 push하겠다는 기본 설정을 했었다.

원격 -> 로컬로 커밋 보내기

  1. 임시로 원격 저장소에 커밋 하나를 생성해보자.
    (실제로는 내 동료가 생성한 커밋이 될 것)
    leopards.yaml의 members에 'Dongho'를 추가한느 커밋을 생성하였다.

  2. 원격에 있는 커밋을 로컬로 pull한다.

git pull

명령어 실행 결과, leopards.yaml의 members에 'Dongho'가 추가된 것을 볼 수 있다.


협업할 때 push, pull 사용하기

상황: 나, A가 협업하고 있다. A가 로컬에서 커밋한 후 원격에 push하였다. 이때, A가 커밋한 내용은 leopards.yaml의 manager를 'Dooli'로 변경한 것! 나도 원격에 push하려고 한다. 내가 로컬에서 커밋한 내용은 leopards.yaml의 coach를 'Lupi'로 변경한 것! 정리하자면, A가 원격에 push한 이후, 내가 원격에 push하려고 한다.

원격에 새로운 커밋이 있기 때문에 push할 수 없다.

git push


push하기 전에 먼저 pull부터 해야 하는데, 이때, 2가지 옵션이 있다.

  1. --no-rebase: merge 방식
git pull --no-rebase

git push
  1. --rebase: rebase 방식
git pull --rebase

git push



협업할 때 push, pull을 사용하는데 conflict가 발생하는 경우

상황: 나, A가 협업하고 있다. A가 로컬에서 커밋한 후 먼저 원격에 push하였다. 이때, A가 커밋한 내용은 panthers.yaml의 members에 'Arachi'를 추가한 것! 나도 원격에 push하려고 한다. 내가 로컬에서 커밋한 내용은 panthers.yaml의 members에 'Maruchi'를 추가한 것!

push하기 전에 먼저 pull부터 해야한다.

옵션1. --no-rebase

git pull --no-rebase

원격에서 로컬로 pull하려고 하는데, conflict 발생 -> conflict 해결 후, 'git add .', 'git commit'

옵션2. --rebase

git pull --rebase

pull할 때의 rebase는 협업할 때도 사용해도 괜찮다. 이미 공유된 커밋에 대해 rebase하지 말라는 뜻이다.

pull한 후에 push한다.

git push

로컬의 커밋을 강제로 push하기

원격에 새로운 커밋이 존재하는 경우, 로컬에서는 push를 할 수 없다. 그런데, 원격에 새로 올라간 커밋의 내용이 잘못되어, 로컷의 커밋으로 강제로 맞춰줘야 하는 경우가 존재한다. 로컬대로 원격의 커밋이 맞춰진다.

git push --force

나 혼자 프로젝트를 진행할 때, 또는 협업 중 강제 push하기로 서로 협의가 된 경우에만 사용해야 한다. 안 그러면, 협업 중 다른 사람이 작성한 코드가 날라가버린다.


로컬에서 브랜치 만든 후에 원격으로 보내기

  1. 로컬에서 from-local에 브랜치에 위치한 후, 'git push' 수행했더니,

    push할 대상을 명시하라는 뜻. from-local 브랜치에 있는 커밋을 어디에 push해야 할지 모르겠다는 것이다.

git push --set-upstream origin from-local
또는 
(--set-upstream는 -u로 축약 가능하므로)
git push -u origin from-local

로컬의 from-local 브랜치가 origin의 from-local 브랜치에 대응되고, push까지 완료된다.


위와 같이 원격에 from-local가 생성된 것을 볼 수 있다.

  • 브랜치 목록(원격의 브랜치 포함) 보기
git branch --all 또는 git branch -a


  • 참고. 'git branch' 명령어는 로컬의 브랜치만 보여준다.

원격의 브랜치를 로컬에 받아오기

git switch -t origin/from-remote

-t origin/from-remote: 로컬에 같은 이름의 브랜치가 생성되고, 복사되고(origin의 from-remote 브랜치 내용이), 로컬에서는 해당 브랜치로 switch된다. 그리고 이후로도 로컬의 from-remote가 origin의 from-remote와 연결된다.

현재 브랜치는 main, origin/main, from-local, origin/from-local, from-remote, origin/from-remote가 존재한다. main, origin/main을 제외하고 모든 브랜치를 삭제하자.

git switch main
git branch -d from-local
git branch -d from-remote
git push origin --delete from-local
git push origin --delete from-remote

원격의 branch 삭제하기

git push (원격의 이름) --delete (원격의 브랜치명)

GUI(소스트리) 통해서 원격 브랜치 다루기

내 프로젝트를 repository에 올리기

참고) 원격 저장소
상단 '저장소' > '원격 저장소 추가...' > '추가' > '원격 이름', 'URL / 경로' 필드 입력
'URL / 경로' 필드에는 아래와 같이, GitHub에 repository를 만든 후에 'Quick setup ...'에 있는 URL을 붙여넣는다.

0개의 댓글