본문 바로가기

내일배움캠프

[내배캠] GIT 기초 특강 2차

사전준비

SSH(Secure Shell) : Github와 컴퓨터(로컬)가 안전하게 통신을 주고받을 수 있는 방법

공개키 : 보낸 사람 식별

개인키 : 다른 사람들이 가로채지 못하도록 암호화

 

git bash

ssh-keygen : 두 개의 키를 생성하는 명령어

 

public/private rsa key : 공개/개인 키

 

(/c/Users/82104/.ssh/id_rsa) : 경로(기본으로 설정된 경로)

→ 다른 경로에 저장하고 싶다면 다른 경로를 누르고 enter

 

Enter passphrase (empty for no passphrase) : ssh 통신을 하기 직전에 암호가 필요하다면 암호를 입력해라

 

Enter same passphrase again : 암호 재입력

 

/c/Users/82104/.ssh/id_rsa : 개인키의 경로

/c/Users/82104/.ssh/id_rsa.pub : 공개키의 경로

 

공개키의 내용을 github에 전달해주면 된다.

 

cat : 특정 파일을 열어보는 명령어

해당 문자열이 공개 키이다.

해당 값을 github에 전달해주면 github와 서로 안전하게 정보를 주고 받을 수 있다.

 

github → profile사진 하단 선택자 → settings → SSH and GPG keys → New SSH key

(github 한 id에는 여러 개의 SSH Key를 등록할 수 있다.)

Title, Key(공개 키) 입력 → Add SSH Key

 

강의 정리

 

이걸 알아야지만 github로 버전관리를 할 수 있다.

소스트리를 활용해서 버전관리 하는 것은 비추. 소스트리의 신뢰성이 낮다.

 

명령어들은 [내배캠] GIT 기초 특강 1차 (yoongeons.com)

에 정리되어 있다.

 

만들어진 버전을 되돌리는 두 가지 방법

revert : 버전을 되돌린 새로운 버전 만들기

reset : 버전을 완전히 되돌리기

revert를 하면 메모리 사용량이 늘어난다.

 

reset의 3가지 방법

reset의 세 가지 방법에 대해 이해하려면 하나의 버전이 만들어지는 과정에 대해 알아야 한다.

 

1. soft rest

  1. 저장소로 커밋한 사실만 제거(되돌리기) - 커밋만 되돌리기
  2. 스테이지로 추가한 사실까지는 유지

soft reset을 한 후, 내가 한 작업을 보기

$ git diff —staged

2. mixed reset

  1. 스테이지에 추가한 사실까지 지우는 것 - 스테이지까지 되돌리기
  2. 내가 작업 디렉터리에서 작업한 내용은 유지

mixed reset을 한 후, 내가 한 작업을 보기

$ git diff

3. hard reset

내가 작업을 했다는 모든 사실까지 되돌리는 것 - 작업 디렉터리까지 되돌리기

 

 

명령어 정리

reset의 default값은 mixed reset

$ git reset <되돌아갈 커밋>을 하면 mixed reset이 된다.

 

git revert, git reset 뒤에는 둘 다 커밋 해쉬(’<>’)가 온다.
git reset 뒤에는 되돌아갈 커밋
git revert 뒤에는 취소할 커밋
이 들어간다.

 

Github

1.백업

2. 협업

 

원격 저장소의 4가지 상호작용

1. 클론(clone) : 원격 저장소 복제하기

clone 하면 .git 숨김폴더까지 같이 복제된다.

때문에 clone한 원격 저장소에서 $git init을 할 필요는 없다.

최종본 뿐만 아니라 commit한 모든 내역들이 컴퓨터로 복제될 것이다.

본인이 소유하지 않은 원격저장소도 clone할 수 있다.(github에서 public으로 공유되어 있는 원격저장소)

 

이 경로가 원격 저장소의 경로이다.

원격 저장소의 경로를 저장한 뒤, 그저장소를 clone할 경로로 간다.

‘$ git clone 저장한 경로 ‘를 입력한다. enter를 누르고 혹시나 yes/no 가 뜬다면 yes를 누르면 복제가 된다.

 

SSH , HTTPS 모두 github와 컴퓨터가 안전하게 정보를 주고받을 수 있는 방법이다.

최근에 HTTPS를 일부 시스템에서 막아놓고 있기 때문에 SSH로 하는 것이 더 안전하다.

 

github를 다룰 때 중요하게 생각해야하는 용어가 있다.

 

아까 저장했던 원격저장소 경로가 원격 저장소를 지칭하는 풀네임 같은 것이다.

하지만 매번 원격저장소를 지칭할 때 길게 지칭하는 것이 힘들어서 보통 원격저장소에 별명을 붙여서 지칭한다.

orgin이 가장 대중적인 별명이다. 별명은 바꾸거나 삭제할 수 있다.

 

HEAD/main은 로컬 저장소의 개념이다.

하지만 로컬 저장소의 HEAD/main와 원격 저장소의 HEAD/main가 달라질 수 있다.

누군가가 원격 저장소에 새로운 commit을 추가했다면, 내 로컬 저장소의 HEAD/main이 가리키는 대상과 원격저장소의 HEAD/main이 가리키는 대상은 달라질 것이다.

때문에 원격저장소의 HEAD/main을 달리 지칭할 필요가 있다. 그래서 origin/HEAD, origin/main 으로 지칭하는 것이다.

 

2. 푸시(push) : 원격 저장소에 밀어넣기

결론부터 말하자면 push는 아래의 명령어를 복사하여 붙여넣으면 된다.

// 원격 저장소는 orgin이라는 별명으로 지칭한다.
// 컴퓨터와 github가 상호작용 하려면 컴퓨터(local 저장소)가
// 원격 저장소의 경로를 알고 있어야 한다.

git remote add origin git@github.com:yoongun97/test-repo.git
// 원격 저장소를 추가할 것이다. origin이라는 별명으로
// 그 원격저장소의 경로는 git~ 이것이다.

git branch -M main
// 현재 브랜치의 이름을 main으로 바꿔줘라.
// github에서는 master branch 명칭 사용을 지양한다.
// 그래서 branch 이름을 main branch로 바꾸고 push하기 위해 사용한다.

git push -u origin main
// 실질적으로 push를 하는 명령어
// origin이라는 이름의 원격저장소의 main branch에 push 할 것이다.

// 원래 매번 push 할 때
// git push origin main // 처럼 push 뒤에 origin main을 입력해주어야 한다.
// 하지만 -u 를 넣어서 한 번만 push를 해주면 그 뒤에는 origin main을
// 생략해주어도 된다.
// 그 다음부터는 git push만 입력해도 된다.

push 후 새로고침 하면 Github에 코드가 push 된 것을 볼 수 있다.

반드시 새로운 commit을 해야 push할 수 있다.

 

3. 패치(fetch): 원격 저장소를 일단 가져만 오기

원격저장소를 가져와 보고 싶은데, 내가 작업하는 로컬 branch에는 영향을 주고 싶지 않을 때 사용한다.

 

github에서 txt를 수정하고 다시commit을 하면

원격저장소에는 로컬저장소보다 하나의 commit이 더 생성되어 있을 것이다.

 

그리고 fetch를 해보자.

github에서 수정된 내용이 있어도 내 local 저장소에는 반영되어 있지 않다.

원격저장소의 변경사항을 확인하려면 FETCH_HEAD에 checkout하면 볼 수 있다.

FETCH_HEAD는 fetch한 내용을 볼 수 있는 특별한 head이다.

 

다시 main branch로 checkout 하면 변함이 없는 것을 볼 수 있다.

FETCH_HEAD 또한 특별한 branch의 이름이기 때문에 merge 하면 내 local 저장소의 main branch 와 병합된다.

4. 풀(pull): 원격 저장소를 가져와서 합치기

원격저장소를 가져와 내 branch에 바로 병합해준다.

 

원격저장소(github)에 commit을 하나 추가해보자.

그리고 pull을 해본다.

아래의 내용이 pull 하기 전의 로컬저장소의 log이다.

아래의 내용은 pull한 뒤 로컬저장소의 log이다.

원격 저장소에서 수정한 내용이 추가 되어 있는 것을 볼 수 있다.

 

pull = fetch + merge 이기 때문에, 당연히 pull 하는 과정에서도 충돌이 생길 수 있다.

 

풀 리퀘스트(Pull Request)

시작하기 전에

일반적으로 내가 소유하지 않은 원격 저장소에 푸시할 수 있을까?

NO

일반적으로 불가능하다.

 

해당 원격저장소의 소유자가 Collaborator로 추가하면 push 권한이 생긴다.

하지만 이 방법은 잘 사용하지 않는다.

왜냐하면 코드의 관리가 잘 안될 수 있다.

때문에 push 권한은 일반적으로 많이 주지 않는다.

 

물론, 예외는 있다.

팀원의 숫자가 적거나, 팀장에 해당하는 사람이 잘못된 push에 대한 책임을 감수할 때는 push 권한을 주기도 한다.

하지만, 일반적으로 팀원이 많거나 버전 관리를 확실하게 할 때는 push 권한을 주지 않는다. 특히나 주니어 개발자에게는 더더욱

 

권한이 없는 원격저장소에 어떻게 내 commit을 push할 수 있을까?

 

풀 리퀘스트(Pull Request) : 원격 저장소가 내 변경사항을 풀(Pull)하도록 요청(Request)을 보내는 방식

 

풀 리퀘스트를 통해 보내면 권한이 있는 사람이 코드를 보고 변경사항을 받아들일지 거부할 지 판단할 수 있다.

실무에서 풀 리퀘스트를 사용하는 이유는 풀 리퀘스트 자체가 코드 논의의 장이 되기 때문이다.

아무에게나 push 권한을 주면 해당 commit에 대해 코드 논의를 할 수 없다.

 

 

풀 리퀘스트를 통해서 요청을 보내면 이 요청에 대해서 논의를 할 수 있다.

 

풀 리퀘스트를 통해 협업(프로젝트)을 하면 좋은 점이 풀 리퀘스트를 이용하면 기록이 남는다. 포트폴리오를 만들 때, commit을 한 기록, 코드 논의를 한 기록 등이 남는다.

그것을 통해 이 사람이 어떤 기여를 했는지, 어떤 논의를 했는지 남아 있게 되어 포트폴리오의 가치가 올라간다.

앞으로 프로젝트를 할 때도 풀 리퀘스트를 통해 코드 논의가 github 상에서 이루어졌다는 것을 최대한 보여주는 것이 좋다.

때문에 풀 리퀘스트와 풀 리퀘스트를 통한 코드 논의에 익숙해져야 한다.

 

풀 리퀘스트를 통해 협업하는 방법

이 5개의 단계를 최대한 반복해서 익숙해져야 한다.

각각을 왜 하는지 아는 것이 중요하다.

 

1. 포크(fork) : 내가 소유하고 있지 않은 특정 원격저장소를 내 계정으로 복제해오는 것.

원하는 원격저장소에 가면 우측에 fork 버튼이 있다.

fork 버튼을 누르고 create fork를 하면 본인의 계정에 해당 원격저장소가 복제된다.

 

2. 클론(clone)

클론할 때 주의할 점은 원본 원격저장소가 아닌 복제해온 저장소를 클론해야 한다.

복제해온 저장소에 push를 할 수 있기 때문이다.

 

3. 브랜치 생성하고 작업하기.

$ git checkout 브랜치명

원하는 파일에서 수정하고(ex. index.html)

 

커밋까지 해준다.

$ git add index.html

$ git commit

 

그러면 하나의 commit이 해당 브랜치에 쌓였을 것이다.

 

4. 작업한 브랜치 푸시하기

main 브랜치가 아닌 본인이 만들고 작업한 브랜치를 푸시해야 한다.

여기까지 작업했다면 github에 버튼이 하나 생겼을 것이다.

클릭하면 내가 작업한 내용과 커밋 메시지를 볼 수 있다.

create pull request를 누르면 풀 리퀘스트가 완료된다.

 

이렇게 풀 리퀘스트를 보내면

원본 원격저장소에 pull request가 추가된다.

해당 원격저장소의 소유자가 리퀘스트를 보고 피드백할 수 있다.

 

원본 소유자가 pull request를 누르면

위와 같이 pull request의 목록을 볼 수 있다.

해당 request를 클릭하고 files changed를 누르면 수정한 부분을 볼 수 있다.

conversation에서 코드 논의도 할 수 있다.

마음에 들면 merge pull request를 누르고, confirm merge를 하면 merge가 된다.

merge가 되면 pull request 가 반영된다.

 

pull request를 통해 기여를 하면 Contributor에 추가가 된다.

Contributor를 통해 그 사람의 기여도를 볼 수 있다.